From 3a2fb2187eb8de737301a58dd67287802051d0a7 Mon Sep 17 00:00:00 2001 From: StillHammer Date: Tue, 30 Dec 2025 11:08:00 +0700 Subject: [PATCH] Initial commit - Freelance Dashboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dashboard KPI Excel pour suivi d'activite freelance Fichiers inclus: - Documentation (README, PLAN, DATA_MODEL, FORMULAS) - Template Excel avec tables de donnees - Plan d'implementation pour agent - Configuration MCP VBA Server πŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .gitignore | 26 ++ .mcp.json | 12 + CLAUDE.md | 263 +++++++++++++ DATA_MODEL.md | 203 +++++++++++ FORMULAS.md | 348 ++++++++++++++++++ PLAN.md | 230 ++++++++++++ README.md | 62 ++++ docs/MCP_VBA_GUIDE.md | 260 +++++++++++++ plans/implemPlan.md | 587 ++++++++++++++++++++++++++++++ templates/FreelanceDashboard.xlsx | Bin 0 -> 6695 bytes 10 files changed, 1991 insertions(+) create mode 100644 .gitignore create mode 100644 .mcp.json create mode 100644 CLAUDE.md create mode 100644 DATA_MODEL.md create mode 100644 FORMULAS.md create mode 100644 PLAN.md create mode 100644 README.md create mode 100644 docs/MCP_VBA_GUIDE.md create mode 100644 plans/implemPlan.md create mode 100644 templates/FreelanceDashboard.xlsx diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..25dadf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# Excel temp files +~$* +*.tmp + +# Excel lock files +*.xlk + +# Windows reserved names +nul +con +prn +aux + +# Windows system files +Thumbs.db +Desktop.ini + +# Backups +.vba_backups/ +*.bak + +# Claude Code +.claude/ + +# MCP config (contains no secrets but local) +# .mcp.json diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 0000000..f02f6ac --- /dev/null +++ b/.mcp.json @@ -0,0 +1,12 @@ +{ + "mcpServers": { + "vba-mcp-pro": { + "command": "python", + "args": ["-m", "vba_mcp_pro.server"], + "cwd": "C:\\Users\\alexi\\Documents\\projects\\vba-mcp-monorepo", + "env": { + "PYTHONPATH": "C:\\Users\\alexi\\Documents\\projects\\vba-mcp-monorepo\\packages\\core\\src;C:\\Users\\alexi\\Documents\\projects\\vba-mcp-monorepo\\packages\\lite\\src;C:\\Users\\alexi\\Documents\\projects\\vba-mcp-monorepo\\packages\\pro\\src" + } + } + } +} diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..db489bb --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,263 @@ +# Freelance Dashboard - Instructions pour Claude + +## Projet + +Freelance Dashboard - Dashboard KPI Excel pour suivi d'activite freelance. + +## Status: En attente de developpement + +## MCP VBA Server + +Ce projet utilise **VBA MCP Server v0.6.0+** pour l'automatisation. + +### Outils Disponibles pour Excel + +| Outil | Description | Usage | +|-------|-------------|-------| +| `get_worksheet_data` | Lit donnees d'une feuille | Lecture donnees | +| `set_worksheet_data` | Ecrit donnees/formules | Peupler tables, KPIs | +| `list_excel_tables` | Liste les Excel Tables | Verifier structure | +| `create_excel_table` | Cree table structuree | Tables donnees | +| `insert_rows` | Insere lignes | Ajouter entrees | +| `delete_rows` | Supprime lignes | Nettoyer donnees | +| `insert_columns` | Insere colonnes | Modifier structure | +| `delete_columns` | Supprime colonnes | Modifier structure | +| `inject_vba` | Injecte module VBA | Macro refresh | +| `validate_vba` | Valide syntaxe VBA | Verifier code | +| `run_macro` | Execute macro VBA | Lancer refresh | +| `open_in_office` | Ouvre Excel visible | Voir resultat | +| `create_backup` | Cree backup fichier | Avant modifications | + +### Chemin du fichier + +``` +C:\Users\alexi\Documents\projects\freelance-dashboard\templates\FreelanceDashboard.xlsx +``` + +--- + +## Structure du Projet + +``` +freelance-dashboard/ +β”œβ”€β”€ README.md # Documentation principale +β”œβ”€β”€ PLAN.md # Plan projet (7 phases, 9h) +β”œβ”€β”€ DATA_MODEL.md # Schema des 3 tables +β”œβ”€β”€ FORMULAS.md # Toutes les formules Excel +β”œβ”€β”€ CLAUDE.md # CE FICHIER +β”œβ”€β”€ docs/ +β”‚ └── MCP_VBA_GUIDE.md # Guide utilisation MCP +β”œβ”€β”€ templates/ +β”‚ └── FreelanceDashboard.xlsx +└── scripts/ +``` + +--- + +## Workflow de Developpement + +### Phase 1: Structure Fichier (MCP VBA) + +```python +# Creer les donnees clients +data_clients = [ + ["ClientID", "Nom", "Secteur", "DateDebut"], + ["CLI001", "Acme Corporation", "Tech", "15/01/2024"], + ["CLI002", "Tech Solutions", "Tech", "01/03/2024"], + ["CLI003", "Marketing Pro", "Marketing", "10/06/2024"], + ["CLI004", "E-Shop Plus", "E-commerce", "22/09/2024"], + ["CLI005", "Finance Group", "Finance", "05/11/2024"], +] +set_worksheet_data("templates/FreelanceDashboard.xlsx", "Data_Clients", data_clients) + +# Creer la table structuree +create_excel_table("templates/FreelanceDashboard.xlsx", "Data_Clients", "A1:D6", "tbl_Clients", has_headers=True) +``` + +```python +# Creer les donnees temps +data_temps = [ + ["Date", "ClientID", "Projet", "Heures", "Description"], + ["02/01/2025", "CLI001", "Site Web", 3.5, "Maquettes"], + ["02/01/2025", "CLI002", "API Backend", 6.0, "Endpoints"], + ["03/01/2025", "CLI001", "Site Web", 4.0, "Integration"], + ["03/01/2025", "CLI003", "Campagne SEO", 2.5, "Audit"], + ["06/01/2025", "CLI002", "API Backend", 7.0, "Tests"], + # ... plus de donnees +] +set_worksheet_data("templates/FreelanceDashboard.xlsx", "Data_Temps", data_temps) +create_excel_table("templates/FreelanceDashboard.xlsx", "Data_Temps", "A1:E11", "tbl_Temps", has_headers=True) +``` + +```python +# Creer les donnees revenus +data_revenus = [ + ["Date", "ClientID", "Montant", "Type"], + ["15/01/2025", "CLI001", 2500, "Facture"], + ["20/01/2025", "CLI002", 4200, "Facture"], + ["25/01/2025", "CLI003", 1800, "Facture"], + # ... plus de donnees +] +set_worksheet_data("templates/FreelanceDashboard.xlsx", "Data_Revenus", data_revenus) +create_excel_table("templates/FreelanceDashboard.xlsx", "Data_Revenus", "A1:D8", "tbl_Revenus", has_headers=True) +``` + +### Phase 2: Formules KPIs (MCP VBA) + +```python +# Ecrire les KPIs sur l'onglet Dashboard +kpis = [ + ["CA Total", "=SUM(tbl_Revenus[Montant])"], + ["Heures Totales", "=SUM(tbl_Temps[Heures])"], + ["Taux Horaire Moyen", "=B1/B2"], + ["Nb Clients", "=COUNTA(tbl_Clients[ClientID])"], + ["Heures Semaine", "=SUMIFS(tbl_Temps[Heures],tbl_Temps[Date],\">=\"&TODAY()-WEEKDAY(TODAY(),2)+1)"], +] +set_worksheet_data("templates/FreelanceDashboard.xlsx", "Dashboard", kpis, start_cell="A1") +``` + +### Phase 3-5: TCD, Graphiques, Design (Excel UI) + +Ces elements doivent etre crees dans Excel UI: +- Tableaux Croises Dynamiques +- Graphiques (barres, camembert, combo) +- Slicers +- Mise en forme conditionnelle +- Layout final + +### Phase 6: VBA Refresh (MCP VBA - Optionnel) + +```python +code = ''' +Sub RefreshDashboard() + Application.CalculateFull + Dim ws As Worksheet + For Each ws In ThisWorkbook.Worksheets + Dim pt As PivotTable + For Each pt In ws.PivotTables + pt.RefreshTable + Next pt + Next ws + MsgBox "Dashboard actualise!", vbInformation +End Sub +''' +validate_vba(code, file_type="excel") +inject_vba("templates/FreelanceDashboard.xlsm", "mod_Refresh", code) +``` + +--- + +## Commandes Rapides + +### Lire donnees + +```python +get_worksheet_data("templates/FreelanceDashboard.xlsx", "Data_Clients") +get_worksheet_data("templates/FreelanceDashboard.xlsx", "Data_Temps") +``` + +### Ajouter entree temps + +```python +# Ajouter une ligne +insert_rows("templates/FreelanceDashboard.xlsx", "Data_Temps", position=12, count=1) +set_worksheet_data("templates/FreelanceDashboard.xlsx", "Data_Temps", + [["10/01/2025", "CLI001", "Nouveau Projet", 2.5, "Description"]], + start_cell="A12") +``` + +### Lister les tables + +```python +list_excel_tables("templates/FreelanceDashboard.xlsx") +``` + +### Ouvrir pour voir + +```python +open_in_office("templates/FreelanceDashboard.xlsx") +``` + +### Executer macro + +```python +run_macro("templates/FreelanceDashboard.xlsm", "RefreshDashboard") +``` + +--- + +## Limitations MCP VBA + +| Ce qui marche | Ce qui ne marche pas | +|---------------|---------------------| +| Ecrire donnees | Creer TCD | +| Creer Excel Tables | Creer graphiques | +| Ecrire formules | Design visuel | +| Injecter VBA | Creer slicers | +| Executer macros | Mise en forme conditionnelle | + +--- + +## Lien avec TimeTrack Pro + +``` +TimeTrack Pro (Access) Freelance Dashboard (Excel) + β”‚ β”‚ + β”‚ get_worksheet_data β”‚ + └──────────────────────────►│ + Export donnees +``` + +### Export manuel + +1. Lire donnees Access: `get_worksheet_data("TimeTrackPro.accdb", "tbl_Temps")` +2. Ecrire dans Excel: `set_worksheet_data("FreelanceDashboard.xlsx", "Data_Temps", data)` + +### Macro d'import (V2) + +```vba +Sub ImportFromTimeTrack() + ' Connexion ADODB vers TimeTrackPro.accdb + ' Import automatique des donnees +End Sub +``` + +--- + +## Fichiers Cles + +| Fichier | Quand l'utiliser | +|---------|------------------| +| `DATA_MODEL.md` | Schema tables + donnees demo | +| `FORMULAS.md` | Toutes les formules KPIs | +| `PLAN.md` | Layout, couleurs, phases | +| `docs/MCP_VBA_GUIDE.md` | Guide etape par etape | + +--- + +## Design + +### Palette Couleurs + +| Usage | Hex | +|-------|-----| +| Primaire (bleu fonce) | #2C3E50 | +| Accent (vert) | #27AE60 | +| Neutre (gris) | #ECF0F1 | +| Alerte (rouge) | #E74C3C | + +### KPIs a afficher + +- CA Total +- CA Mois en cours +- Heures totales +- Taux horaire moyen +- Nb clients actifs +- Top client +- Heures semaine + +--- + +## Contact + +Alexis Trouve - alexistrouve.pro@gmail.com diff --git a/DATA_MODEL.md b/DATA_MODEL.md new file mode 100644 index 0000000..58b0744 --- /dev/null +++ b/DATA_MODEL.md @@ -0,0 +1,203 @@ +# Freelance Dashboard - Modele de Donnees + +## Vue d'ensemble + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Data_Clients β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ ClientID (PK) │◄──────┐ +β”‚ Nom β”‚ β”‚ +β”‚ Secteur β”‚ β”‚ +β”‚ DateDebut β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ + β”‚ +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Data_Temps β”‚ β”‚ β”‚ Data_Revenus β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ Date β”‚ β”‚ β”‚ Date β”‚ +β”‚ ClientID (FK) │───────┼───────│ ClientID (FK) β”‚ +β”‚ Projet β”‚ β”‚ β”‚ Montant β”‚ +β”‚ Heures β”‚ β”‚ β”‚ Type β”‚ +β”‚ Description β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ + β”‚ + Relations +``` + +--- + +## Table: Data_Clients + +Liste des clients avec informations de base. + +| Colonne | Type | Format | Exemple | Validation | +|---------|------|--------|---------|------------| +| ClientID | Texte | CLI### | CLI001 | Unique, requis | +| Nom | Texte | - | Acme Corp | Requis | +| Secteur | Texte | - | Tech | Liste deroulante | +| DateDebut | Date | jj/mm/aaaa | 15/01/2024 | Date valide | + +### Secteurs suggeres + +- Tech +- Marketing +- Finance +- E-commerce +- Industrie +- Services +- Autre + +### Donnees de demo + +| ClientID | Nom | Secteur | DateDebut | +|----------|-----|---------|-----------| +| CLI001 | Acme Corporation | Tech | 15/01/2024 | +| CLI002 | Tech Solutions | Tech | 01/03/2024 | +| CLI003 | Marketing Pro | Marketing | 10/06/2024 | +| CLI004 | E-Shop Plus | E-commerce | 22/09/2024 | +| CLI005 | Finance Group | Finance | 05/11/2024 | + +--- + +## Table: Data_Temps + +Entrees de temps par projet et client. + +| Colonne | Type | Format | Exemple | Validation | +|---------|------|--------|---------|------------| +| Date | Date | jj/mm/aaaa | 15/12/2024 | Date valide | +| ClientID | Texte | CLI### | CLI001 | Liste clients | +| Projet | Texte | - | Site Web | Requis | +| Heures | Nombre | 0.00 | 3.50 | > 0, <= 24 | +| Description | Texte | - | Maquettes | Optionnel | + +### Donnees de demo + +| Date | ClientID | Projet | Heures | Description | +|------|----------|--------|--------|-------------| +| 02/01/2025 | CLI001 | Site Web | 3.5 | Maquettes | +| 02/01/2025 | CLI002 | API Backend | 6.0 | Endpoints | +| 03/01/2025 | CLI001 | Site Web | 4.0 | Integration | +| 03/01/2025 | CLI003 | Campagne SEO | 2.5 | Audit | +| 06/01/2025 | CLI002 | API Backend | 7.0 | Tests | +| 06/01/2025 | CLI004 | Boutique | 5.0 | Setup | +| 07/01/2025 | CLI001 | Maintenance | 1.5 | Updates | +| 08/01/2025 | CLI003 | Campagne SEO | 3.0 | Keywords | +| 08/01/2025 | CLI005 | Dashboard | 4.5 | Design | +| 09/01/2025 | CLI002 | App Mobile | 6.5 | Screens | + +--- + +## Table: Data_Revenus + +Paiements recus des clients. + +| Colonne | Type | Format | Exemple | Validation | +|---------|------|--------|---------|------------| +| Date | Date | jj/mm/aaaa | 31/12/2024 | Date valide | +| ClientID | Texte | CLI### | CLI001 | Liste clients | +| Montant | Nombre | # ##0.00 € | 2500.00 | > 0 | +| Type | Texte | - | Facture | Liste deroulante | + +### Types de paiement + +- Facture +- Acompte +- Avoir +- Autre + +### Donnees de demo + +| Date | ClientID | Montant | Type | +|------|----------|---------|------| +| 15/01/2025 | CLI001 | 2500.00 | Facture | +| 20/01/2025 | CLI002 | 4200.00 | Facture | +| 25/01/2025 | CLI003 | 1800.00 | Facture | +| 28/01/2025 | CLI001 | 1000.00 | Acompte | +| 31/01/2025 | CLI004 | 3500.00 | Facture | +| 05/02/2025 | CLI002 | 2800.00 | Facture | +| 10/02/2025 | CLI005 | 1500.00 | Acompte | + +--- + +## Table: Config + +Parametres de configuration du dashboard. + +| Parametre | Valeur | Description | +|-----------|--------|-------------| +| AnneeCourante | 2025 | Annee par defaut pour filtres | +| TauxHoraireDefaut | 75 | Taux horaire par defaut (euros) | +| DevisePrincipale | EUR | Devise affichee | +| JourDebutSemaine | 2 | 1=Dim, 2=Lun | +| ObjectifMensuel | 10000 | Objectif CA mensuel | +| ObjectifHeures | 140 | Objectif heures/mois | + +--- + +## Plages Nommees + +| Nom | Plage | Description | +|-----|-------|-------------| +| tbl_Clients | Data_Clients[#All] | Table clients | +| tbl_Temps | Data_Temps[#All] | Table temps | +| tbl_Revenus | Data_Revenus[#All] | Table revenus | +| lst_ClientIDs | Data_Clients[ClientID] | Liste ClientID | +| lst_Secteurs | Config!$E$2:$E$8 | Liste secteurs | +| lst_Types | Config!$G$2:$G$5 | Liste types paiement | + +--- + +## Formules de Validation + +### ClientID (Data_Temps, Data_Revenus) + +``` +=COUNTIF(Data_Clients[ClientID], [@ClientID]) > 0 +``` + +### Heures (Data_Temps) + +``` +=AND([@Heures] > 0, [@Heures] <= 24) +``` + +### Montant (Data_Revenus) + +``` +=[@Montant] > 0 +``` + +--- + +## Colonnes Calculees (optionnel) + +### Data_Temps - Mois + +``` +=TEXT([@Date], "mmmm yyyy") +``` + +### Data_Temps - Semaine + +``` +=WEEKNUM([@Date], 2) +``` + +### Data_Temps - NomClient + +``` +=VLOOKUP([@ClientID], Data_Clients, 2, FALSE) +``` + +### Data_Revenus - NomClient + +``` +=VLOOKUP([@ClientID], Data_Clients, 2, FALSE) +``` + +--- + +**Version:** 1.0 +**Date:** 2025-12-30 diff --git a/FORMULAS.md b/FORMULAS.md new file mode 100644 index 0000000..105a6e3 --- /dev/null +++ b/FORMULAS.md @@ -0,0 +1,348 @@ +# Freelance Dashboard - Formules et KPIs + +## Vue d'ensemble + +Toutes les formules utilisees dans le dashboard pour calculer les KPIs. + +--- + +## 1. KPIs Principaux + +### CA Total (periode selectionnee) + +```excel +=SUMIFS( + Data_Revenus[Montant], + Data_Revenus[Date], ">=" & DateDebut, + Data_Revenus[Date], "<=" & DateFin +) +``` + +**Avec slicer client:** +```excel +=SUMIFS( + Data_Revenus[Montant], + Data_Revenus[Date], ">=" & DateDebut, + Data_Revenus[Date], "<=" & DateFin, + Data_Revenus[ClientID], ClientFiltre +) +``` + +--- + +### CA Mois en Cours + +```excel +=SUMIFS( + Data_Revenus[Montant], + Data_Revenus[Date], ">=" & EOMONTH(TODAY(), -1) + 1, + Data_Revenus[Date], "<=" & EOMONTH(TODAY(), 0) +) +``` + +**Version simplifiee:** +```excel +=SUMPRODUCT( + (MONTH(Data_Revenus[Date]) = MONTH(TODAY())) * + (YEAR(Data_Revenus[Date]) = YEAR(TODAY())) * + Data_Revenus[Montant] +) +``` + +--- + +### Heures Totales (periode) + +```excel +=SUMIFS( + Data_Temps[Heures], + Data_Temps[Date], ">=" & DateDebut, + Data_Temps[Date], "<=" & DateFin +) +``` + +--- + +### Taux Horaire Moyen + +```excel +=IFERROR( + SUMIFS(Data_Revenus[Montant], ...) / SUMIFS(Data_Temps[Heures], ...), + 0 +) +``` + +**Format:** `# ##0.00 "€/h"` + +--- + +### Nombre Clients Actifs + +```excel +=SUMPRODUCT( + (COUNTIFS( + Data_Temps[ClientID], Data_Clients[ClientID], + Data_Temps[Date], ">=" & DateDebut, + Data_Temps[Date], "<=" & DateFin + ) > 0) * 1 +) +``` + +**Alternative avec UNIQUE (Excel 365):** +```excel +=COUNTA(UNIQUE( + FILTER( + Data_Temps[ClientID], + (Data_Temps[Date] >= DateDebut) * (Data_Temps[Date] <= DateFin) + ) +)) +``` + +--- + +### Top Client (par CA) + +```excel +=INDEX( + Data_Clients[Nom], + MATCH( + MAX( + SUMIFS( + Data_Revenus[Montant], + Data_Revenus[ClientID], Data_Clients[ClientID] + ) + ), + SUMIFS( + Data_Revenus[Montant], + Data_Revenus[ClientID], Data_Clients[ClientID] + ), + 0 + ) +) +``` + +**Avec XLOOKUP (Excel 365):** +```excel +=LET( + clients, Data_Clients[ClientID], + noms, Data_Clients[Nom], + ca, SUMIFS(Data_Revenus[Montant], Data_Revenus[ClientID], clients), + maxCA, MAX(ca), + topClient, XLOOKUP(maxCA, ca, noms, "N/A"), + topClient +) +``` + +--- + +### Heures Cette Semaine + +```excel +=SUMIFS( + Data_Temps[Heures], + Data_Temps[Date], ">=" & TODAY() - WEEKDAY(TODAY(), 2) + 1, + Data_Temps[Date], "<=" & TODAY() - WEEKDAY(TODAY(), 2) + 7 +) +``` + +--- + +## 2. Formules pour Graphiques + +### CA par Mois (12 derniers mois) + +**Tableau helper:** + +| Mois | CA | +|------|-----| +| =EOMONTH(TODAY(),-11) | =SUMPRODUCT((MONTH(Data_Revenus[Date])=MONTH(A2))*(YEAR(Data_Revenus[Date])=YEAR(A2))*Data_Revenus[Montant]) | +| ... | ... | + +**Avec SEQUENCE (Excel 365):** +```excel +=LET( + mois, SEQUENCE(12, 1, EOMONTH(TODAY(), -11) + 1, 30), + ca, SUMPRODUCT( + (MONTH(Data_Revenus[Date]) = MONTH(mois)) * + (YEAR(Data_Revenus[Date]) = YEAR(mois)) * + Data_Revenus[Montant] + ), + HSTACK(TEXT(mois, "mmm yy"), ca) +) +``` + +--- + +### Repartition CA par Client + +```excel +=SUMIFS( + Data_Revenus[Montant], + Data_Revenus[ClientID], Data_Clients[@ClientID] +) +``` + +**Pourcentage:** +```excel +=[@CA] / SUM([CA]) +``` + +--- + +### Heures par Semaine (8 dernieres semaines) + +```excel +=SUMIFS( + Data_Temps[Heures], + Data_Temps[Date], ">=" & DebutSemaine, + Data_Temps[Date], "<=" & FinSemaine +) +``` + +--- + +## 3. Formules de Mise en Forme Conditionnelle + +### KPI CA - Vert si objectif atteint + +**Condition:** `=B2 >= Config!$C$5` + +- Vert (#27AE60) si >= objectif +- Orange (#F39C12) si >= 80% objectif +- Rouge (#E74C3C) si < 80% + +--- + +### Heures - Barre de progression + +**Formule:** `=[@Heures] / 8` (sur une journee de 8h) + +--- + +### Evolution - Fleche haut/bas + +```excel +=IF([@CA] > [@CA_Precedent], "↑", IF([@CA] < [@CA_Precedent], "↓", "β†’")) +``` + +--- + +## 4. Formules Utilitaires + +### Premier jour du mois + +```excel +=EOMONTH(TODAY(), -1) + 1 +``` + +### Dernier jour du mois + +```excel +=EOMONTH(TODAY(), 0) +``` + +### Premier jour de la semaine (lundi) + +```excel +=TODAY() - WEEKDAY(TODAY(), 2) + 1 +``` + +### Numero de semaine + +```excel +=WEEKNUM([@Date], 2) +``` + +### Nom du mois en francais + +```excel +=TEXT([@Date], "mmmm") +``` + +--- + +## 5. Tableau Croise Dynamique - Champs Calcules + +### Taux Horaire + +``` += Montant / Heures +``` + +### CA Journalier Moyen + +``` += Montant / COUNTA(Date) +``` + +### Heures par Jour Ouvre + +``` += Heures / NETWORKDAYS(MIN(Date), MAX(Date)) +``` + +--- + +## 6. Validation des Donnees + +### Liste deroulante ClientID + +``` +Source: =INDIRECT("Data_Clients[ClientID]") +``` + +### Liste deroulante Type + +``` +Source: Facture,Acompte,Avoir,Autre +``` + +### Heures (entre 0.25 et 24) + +``` +Validation: Decimal +Minimum: 0.25 +Maximum: 24 +Message: "Entrez un nombre d'heures entre 0.25 et 24" +``` + +--- + +## 7. Exemples de Cellules Dashboard + +### Cellule KPI - CA Total + +``` +Cellule: D4 +Formule: =SUMIFS(Data_Revenus[Montant], Data_Revenus[Date], ">="&$B$2, Data_Revenus[Date], "<="&$B$3) +Format: # ##0 "€" +Police: Calibri 28pt Bold +Couleur: #2C3E50 +``` + +### Cellule KPI - Variation + +``` +Cellule: D5 +Formule: =D4 - CA_Mois_Precedent +Format: +# ##0 "€";-# ##0 "€" +Couleur: Vert si positif, Rouge si negatif +``` + +--- + +## 8. Raccourcis Formules + +| Besoin | Formule courte | +|--------|----------------| +| CA total | `=SUM(Data_Revenus[Montant])` | +| Heures total | `=SUM(Data_Temps[Heures])` | +| Nb clients | `=COUNTA(Data_Clients[ClientID])` | +| Nb projets uniques | `=COUNTA(UNIQUE(Data_Temps[Projet]))` | +| Date min | `=MIN(Data_Temps[Date])` | +| Date max | `=MAX(Data_Temps[Date])` | + +--- + +**Version:** 1.0 +**Date:** 2025-12-30 diff --git a/PLAN.md b/PLAN.md new file mode 100644 index 0000000..c6c36b5 --- /dev/null +++ b/PLAN.md @@ -0,0 +1,230 @@ +# Freelance Dashboard - Plan de Projet + +Dashboard KPI Excel - Suivi d'activite freelance + +--- + +## 1. Vision + +**Objectif:** Dashboard visuel pour suivre son activite freelance (temps, revenus, clients) en un coup d'oeil. + +**Public cible:** Freelances, independants, usage personnel. + +**Lien portfolio:** Complementaire a TimeTrack Pro (Access = saisie, Excel = visualisation). + +--- + +## 2. Perimetre V1 + +### Inclus + +| Fonctionnalite | Description | +|----------------|-------------| +| Saisie donnees | Heures, revenus, clients | +| KPIs principaux | CA, heures, taux horaire moyen | +| Graphiques | Dynamiques et interactifs | +| Filtres | Periode, client, projet | +| Design pro | Moderne, pret a montrer | + +### Hors Perimetre (V2 eventuelle) + +- Connexion automatique a Access/TimeTrack +- Previsionnel / objectifs +- Multi-devises +- Macros VBA complexes + +--- + +## 3. Structure du Fichier + +| Onglet | Contenu | Type | +|--------|---------|------| +| **Dashboard** | Vue principale avec KPIs et graphiques | Affichage | +| **Data_Temps** | Table des entrees de temps (source) | Donnees | +| **Data_Revenus** | Table des paiements recus | Donnees | +| **Data_Clients** | Liste clients avec infos | Donnees | +| **Config** | Parametres (annee, taux par defaut) | Parametres | + +--- + +## 4. Modele de Donnees + +### Data_Clients + +| Champ | Type | Description | +|-------|------|-------------| +| ClientID | Texte | Identifiant unique (ex: CLI001) | +| Nom | Texte | Nom du client | +| Secteur | Texte | Secteur d'activite | +| DateDebut | Date | Date debut collaboration | + +### Data_Temps + +| Champ | Type | Description | +|-------|------|-------------| +| Date | Date | Date de l'entree | +| ClientID | Texte | Reference client | +| Projet | Texte | Nom du projet | +| Heures | Nombre | Duree en heures | +| Description | Texte | Description du travail | + +### Data_Revenus + +| Champ | Type | Description | +|-------|------|-------------| +| Date | Date | Date du paiement | +| ClientID | Texte | Reference client | +| Montant | Nombre | Montant en euros | +| Type | Texte | Facture / Acompte | + +--- + +## 5. KPIs a Afficher + +| KPI | Calcul | Formule Excel | +|-----|--------|---------------| +| **CA Total** | Somme revenus (periode) | `=SUMIFS(...)` | +| **CA Mois en cours** | Somme revenus (mois) | `=SUMIFS(...,MONTH()=...)` | +| **Heures totales** | Somme heures (periode) | `=SUMIFS(...)` | +| **Taux horaire moyen** | CA / Heures | `=CA/Heures` | +| **Nb clients actifs** | Clients avec heures > 0 | `=COUNTIFS(...)` | +| **Top client** | Client avec le plus de CA | `=INDEX(MATCH(MAX(...)))` | +| **Heures semaine** | Somme heures (semaine) | `=SUMIFS(...,WEEKNUM()=...)` | + +--- + +## 6. Graphiques + +| Graphique | Type | Donnees | Position | +|-----------|------|---------|----------| +| **Evolution CA mensuel** | Barres ou ligne | CA par mois | Haut gauche | +| **Repartition par client** | Camembert | % CA par client | Haut droite | +| **Heures par semaine** | Barres | Heures hebdo | Bas gauche | +| **CA vs Heures** | Combo | Correlation | Bas droite | + +--- + +## 7. Fonctionnalites Excel + +| Feature | Usage | Implementation | +|---------|-------|----------------| +| **Tableaux structures** | Donnees auto-expansion | `Ctrl+T` sur plages | +| **SOMME.SI.ENS** | Calculs conditionnels | Formules KPIs | +| **Tableaux croises** | Agregations flexibles | TCD sur Data_Temps | +| **Slicers** | Filtres visuels | Connectes aux TCD | +| **Mise en forme cond.** | Alertes visuelles | Regles sur KPIs | +| **Validation donnees** | Listes deroulantes | ClientID, Type | +| **Graphiques dynamiques** | Lies aux TCD | Charts connectes | + +--- + +## 8. UI / Design + +### Palette Couleurs + +| Usage | Couleur | Hex | +|-------|---------|-----| +| Primaire | Bleu fonce | #2C3E50 | +| Accent | Vert | #27AE60 | +| Neutre | Gris clair | #ECF0F1 | +| Alerte | Rouge | #E74C3C | + +### Principes Design + +1. **Fond clair**, donnees lisibles +2. **KPIs en gros**, bien espaces +3. **Graphiques alignes**, pas surcharges +4. **Pas de bordures inutiles**, style moderne flat +5. **Hierarchie visuelle** claire + +### Layout Dashboard + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ FREELANCE DASHBOARD [Filtres/Slicers]β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ CA Totalβ”‚ β”‚CA Mois β”‚ β”‚ Heures β”‚ β”‚Taux Moy β”‚ β”‚ +β”‚ β”‚ 45 230€ β”‚ β”‚ 8 500€ β”‚ β”‚ 312h β”‚ β”‚ 72€/h β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ Evolution CA β”‚ β”‚ Repartition β”‚ β”‚ +β”‚ β”‚ (barres) β”‚ β”‚ (camembert) β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ Heures/semaine β”‚ β”‚ CA vs Heures β”‚ β”‚ +β”‚ β”‚ (barres) β”‚ β”‚ (combo) β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## 9. Phases de Developpement + +| Phase | Contenu | Methode | Duree | +|-------|---------|---------|-------| +| 1 | Structure fichier + tables | MCP VBA | 1h | +| 2 | Formules KPIs | MCP VBA | 1h | +| 3 | Tableaux croises dynamiques | Excel UI | 1h | +| 4 | Graphiques | Excel UI | 2h | +| 5 | Dashboard layout + slicers | Excel UI | 2h | +| 6 | Design polish + donnees demo | Excel UI | 1h | +| 7 | Tests + documentation | Manuel | 1h | + +**Total estime:** ~9h + +--- + +## 10. Livrables Finaux + +- [ ] Fichier `.xlsx` fonctionnel avec donnees demo +- [ ] README avec screenshots +- [ ] (Bonus) Version `.xlsm` avec macros refresh +- [ ] (Bonus) GIF de demo + +--- + +## 11. Criteres de Succes + +- [ ] Le dashboard est lisible en 5 secondes +- [ ] Les filtres fonctionnent sans lag +- [ ] Les donnees se mettent a jour automatiquement +- [ ] Le design est pro et moderne +- [ ] Utilisation personnelle (dogfooding) + +--- + +## 12. Integration TimeTrack Pro + +### Option A: Export manuel + +``` +TimeTrack Pro (Access) β†’ Export Excel β†’ Copier/Coller β†’ Dashboard +``` + +### Option B: Liaison ODBC (V2) + +``` +TimeTrack Pro (Access) ← Connexion ODBC ← Dashboard (Power Query) +``` + +### Option C: Macro d'import (V2) + +```vba +Sub ImportFromAccess() + ' Connexion ADO vers TimeTrackPro.accdb + ' Import des donnees dans les tables Excel +End Sub +``` + +--- + +**Auteur:** Alexis Trouve +**Date:** 2025-12-30 +**Version:** 1.0 diff --git a/README.md b/README.md new file mode 100644 index 0000000..14618f4 --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +# Freelance Dashboard + +Dashboard KPI Excel - Suivi d'activite freelance + +## Vision + +Dashboard visuel pour suivre son activite freelance (temps, revenus, clients) en un coup d'oeil. + +**Public cible:** Freelances, independants +**Lien portfolio:** Complementaire a TimeTrack Pro (Access = saisie, Excel = visualisation) + +## Status + +| Phase | Description | Status | +|-------|-------------|--------| +| 1 | Structure fichier + tables | En attente | +| 2 | Formules KPIs | En attente | +| 3 | Tableaux croises dynamiques | En attente | +| 4 | Graphiques | En attente | +| 5 | Dashboard layout + slicers | En attente | +| 6 | Design polish + donnees demo | En attente | +| 7 | Tests + documentation | En attente | + +## Fonctionnalites V1 + +- [x] Saisie des donnees (heures, revenus, clients) +- [x] KPIs principaux (CA, heures, taux horaire moyen) +- [x] Graphiques dynamiques +- [x] Filtres par periode / client / projet +- [x] Mise en forme pro + +## Structure du fichier + +| Onglet | Contenu | +|--------|---------| +| Dashboard | Vue principale avec KPIs et graphiques | +| Data_Temps | Table des entrees de temps | +| Data_Revenus | Table des paiements recus | +| Data_Clients | Liste clients avec infos | +| Config | Parametres (annee, taux par defaut) | + +## KPIs + +- CA Total +- CA Mois en cours +- Heures totales +- Taux horaire moyen +- Nb clients actifs +- Top client +- Heures cette semaine + +## Screenshots + +*(A venir)* + +## Auteur + +Alexis Trouve - alexistrouve.pro@gmail.com + +## License + +Proprietary - Demo Project diff --git a/docs/MCP_VBA_GUIDE.md b/docs/MCP_VBA_GUIDE.md new file mode 100644 index 0000000..02e1b71 --- /dev/null +++ b/docs/MCP_VBA_GUIDE.md @@ -0,0 +1,260 @@ +# Freelance Dashboard - Guide MCP VBA + +Comment utiliser VBA MCP Server pour construire ce projet Excel. + +## Prerequis + +1. VBA MCP Server v0.6.0+ installe +2. Microsoft Excel installe +3. "Trust access to VBA project object model" active dans Excel + +## Outils MCP Disponibles + +### Pour Excel + +| Outil | Usage dans ce projet | +|-------|---------------------| +| `get_worksheet_data` | Lire donnees des feuilles | +| `set_worksheet_data` | Ecrire donnees et formules | +| `list_excel_tables` | Lister les Excel Tables | +| `create_excel_table` | Creer tables structurees | +| `insert_rows` | Ajouter lignes | +| `delete_rows` | Supprimer lignes | +| `inject_vba` | Injecter macros optionnelles | +| `validate_vba` | Valider syntaxe VBA | +| `run_macro` | Executer macros | +| `open_in_office` | Ouvrir Excel visible | + +--- + +## Etape 1: Creer le Fichier Excel + +**Manuel:** Ouvrir Excel > Nouveau classeur > Enregistrer comme `FreelanceDashboard.xlsx` + +**Emplacement:** `C:\Users\alexi\Documents\projects\freelance-dashboard\templates\FreelanceDashboard.xlsx` + +### Creer les onglets + +Renommer/creer les feuilles: +1. Dashboard +2. Data_Clients +3. Data_Temps +4. Data_Revenus +5. Config + +--- + +## Etape 2: Creer les Tables de Donnees + +### Data_Clients + +``` +Utilise set_worksheet_data pour ecrire les donnees: +``` + +```python +# En-tetes + donnees +data = [ + ["ClientID", "Nom", "Secteur", "DateDebut"], + ["CLI001", "Acme Corporation", "Tech", "15/01/2024"], + ["CLI002", "Tech Solutions", "Tech", "01/03/2024"], + ["CLI003", "Marketing Pro", "Marketing", "10/06/2024"], + ["CLI004", "E-Shop Plus", "E-commerce", "22/09/2024"], + ["CLI005", "Finance Group", "Finance", "05/11/2024"], +] +set_worksheet_data("FreelanceDashboard.xlsx", "Data_Clients", data) +``` + +``` +Puis creer la table structuree: +``` + +```python +create_excel_table("FreelanceDashboard.xlsx", "Data_Clients", "A1:D6", "tbl_Clients", has_headers=True) +``` + +### Data_Temps + +```python +data = [ + ["Date", "ClientID", "Projet", "Heures", "Description"], + ["02/01/2025", "CLI001", "Site Web", 3.5, "Maquettes"], + ["02/01/2025", "CLI002", "API Backend", 6.0, "Endpoints"], + ["03/01/2025", "CLI001", "Site Web", 4.0, "Integration"], + ["03/01/2025", "CLI003", "Campagne SEO", 2.5, "Audit"], + ["06/01/2025", "CLI002", "API Backend", 7.0, "Tests"], + ["06/01/2025", "CLI004", "Boutique", 5.0, "Setup"], + ["07/01/2025", "CLI001", "Maintenance", 1.5, "Updates"], + ["08/01/2025", "CLI003", "Campagne SEO", 3.0, "Keywords"], + ["08/01/2025", "CLI005", "Dashboard", 4.5, "Design"], + ["09/01/2025", "CLI002", "App Mobile", 6.5, "Screens"], +] +set_worksheet_data("FreelanceDashboard.xlsx", "Data_Temps", data) +create_excel_table("FreelanceDashboard.xlsx", "Data_Temps", "A1:E11", "tbl_Temps", has_headers=True) +``` + +### Data_Revenus + +```python +data = [ + ["Date", "ClientID", "Montant", "Type"], + ["15/01/2025", "CLI001", 2500, "Facture"], + ["20/01/2025", "CLI002", 4200, "Facture"], + ["25/01/2025", "CLI003", 1800, "Facture"], + ["28/01/2025", "CLI001", 1000, "Acompte"], + ["31/01/2025", "CLI004", 3500, "Facture"], + ["05/02/2025", "CLI002", 2800, "Facture"], + ["10/02/2025", "CLI005", 1500, "Acompte"], +] +set_worksheet_data("FreelanceDashboard.xlsx", "Data_Revenus", data) +create_excel_table("FreelanceDashboard.xlsx", "Data_Revenus", "A1:D8", "tbl_Revenus", has_headers=True) +``` + +--- + +## Etape 3: Creer la Configuration + +```python +data = [ + ["Parametre", "Valeur"], + ["AnneeCourante", 2025], + ["TauxHoraireDefaut", 75], + ["DevisePrincipale", "EUR"], + ["ObjectifMensuel", 10000], + ["ObjectifHeures", 140], +] +set_worksheet_data("FreelanceDashboard.xlsx", "Config", data) +``` + +--- + +## Etape 4: Ecrire les Formules KPIs + +``` +Sur l'onglet Dashboard, ecrire les formules: +``` + +```python +kpis = [ + ["KPI", "Valeur", "Formule"], + ["CA Total", "=SUM(tbl_Revenus[Montant])", ""], + ["Heures Totales", "=SUM(tbl_Temps[Heures])", ""], + ["Taux Horaire Moyen", "=B2/B3", ""], + ["Nb Clients", "=COUNTA(tbl_Clients[ClientID])", ""], +] +set_worksheet_data("FreelanceDashboard.xlsx", "Dashboard", kpis, start_cell="A1") +``` + +--- + +## Etape 5: VBA Optionnel (Refresh) + +``` +Injecter une macro pour rafraichir les donnees: +``` + +```python +code = ''' +Sub RefreshDashboard() + ' Rafraichit toutes les connexions et TCD + Application.CalculateFull + + Dim ws As Worksheet + For Each ws In ThisWorkbook.Worksheets + Dim pt As PivotTable + For Each pt In ws.PivotTables + pt.RefreshTable + Next pt + Next ws + + MsgBox "Dashboard actualise!", vbInformation +End Sub + +Sub AutoRefresh() + ' Appele a l'ouverture du classeur + RefreshDashboard +End Sub +''' + +validate_vba(code, file_type="excel") +inject_vba("FreelanceDashboard.xlsm", "mod_Refresh", code) +``` + +--- + +## Commandes Frequentes + +### Lire les donnees + +``` +get_worksheet_data("FreelanceDashboard.xlsx", "Data_Temps") +``` + +### Ajouter une entree de temps + +```python +# Lire donnees existantes, ajouter ligne, reecrire +# Ou utiliser insert_rows +insert_rows("FreelanceDashboard.xlsx", "Data_Temps", position=12, count=1) +set_worksheet_data("FreelanceDashboard.xlsx", "Data_Temps", + [["10/01/2025", "CLI001", "Nouveau", 2.5, "Test"]], + start_cell="A12") +``` + +### Lister les tables + +``` +list_excel_tables("FreelanceDashboard.xlsx") +``` + +### Ouvrir Excel visible + +``` +open_in_office("FreelanceDashboard.xlsx") +``` + +### Executer macro refresh + +``` +run_macro("FreelanceDashboard.xlsm", "RefreshDashboard") +``` + +--- + +## Ce qui doit etre fait dans Excel UI + +| Element | Raison | +|---------|--------| +| Tableaux Croises Dynamiques | Interface complexe | +| Graphiques | Design visuel precis | +| Slicers | Connexion aux TCD | +| Mise en forme conditionnelle | Regles visuelles | +| Layout Dashboard | Positionnement precis | + +--- + +## Workflow Complet + +``` +1. Creer fichier Excel vide β†’ Manuel +2. set_worksheet_data β†’ Donnees clients +3. set_worksheet_data β†’ Donnees temps +4. set_worksheet_data β†’ Donnees revenus +5. create_excel_table (x3) β†’ Tables structurees +6. set_worksheet_data β†’ Config +7. set_worksheet_data β†’ Formules KPIs +8. Creer TCD β†’ Excel UI +9. Creer graphiques β†’ Excel UI +10. Design dashboard β†’ Excel UI +11. inject_vba β†’ Macro refresh (optionnel) +``` + +--- + +## Fichiers de Reference + +| Fichier | Contenu | +|---------|---------| +| `DATA_MODEL.md` | Schema tables + donnees demo | +| `FORMULAS.md` | Toutes les formules Excel | +| `PLAN.md` | Layout, couleurs, phases | diff --git a/plans/implemPlan.md b/plans/implemPlan.md new file mode 100644 index 0000000..ec2cffc --- /dev/null +++ b/plans/implemPlan.md @@ -0,0 +1,587 @@ +# Freelance Dashboard - Plan d'Implementation Agent + +## Vue d'Ensemble + +**Objectif:** Creer un dashboard Excel KPI pour suivi d'activite freelance +**Fichier cible:** `templates/FreelanceDashboard.xlsx` +**Outils:** MCP VBA Server (vba-mcp-pro) + +--- + +## Pre-requis + +Avant de commencer, verifier: +- [ ] MCP VBA Server est connecte et fonctionnel +- [ ] Microsoft Excel est installe sur la machine +- [ ] Le dossier `templates/` existe + +--- + +## Phase 1: Preparation et Structure Fichier + +### Step 1.1: Creer le dossier templates + +```bash +# Verifier/creer le dossier +mkdir templates +``` + +**Verification:** Le dossier `templates/` existe + +### Step 1.2: Creer le fichier Excel vide avec les onglets + +**Action manuelle requise:** +1. Ouvrir Excel +2. Creer un nouveau classeur +3. Renommer les feuilles: + - Feuil1 β†’ Dashboard + - Ajouter: Data_Clients + - Ajouter: Data_Temps + - Ajouter: Data_Revenus + - Ajouter: Config +4. Sauvegarder comme `templates/FreelanceDashboard.xlsx` + +**Alternative MCP:** Utiliser `open_in_office` sur un fichier existant, mais la creation initiale est manuelle. + +**Verification:** +``` +list_tables(file_path="templates/FreelanceDashboard.xlsx") +``` +Doit retourner les 5 onglets. + +--- + +## Phase 2: Creation des Tables de Donnees + +### Step 2.1: Peupler Data_Clients + +**Outil:** `set_worksheet_data` + +**Donnees:** +```json +{ + "file_path": "C:\\Users\\alexi\\Documents\\projects\\freelance-dashboard\\templates\\FreelanceDashboard.xlsx", + "sheet_name": "Data_Clients", + "data": [ + ["ClientID", "Nom", "Secteur", "DateDebut"], + ["CLI001", "Acme Corporation", "Tech", "15/01/2024"], + ["CLI002", "Tech Solutions", "Tech", "01/03/2024"], + ["CLI003", "Marketing Pro", "Marketing", "10/06/2024"], + ["CLI004", "E-Shop Plus", "E-commerce", "22/09/2024"], + ["CLI005", "Finance Group", "Finance", "05/11/2024"] + ], + "start_cell": "A1" +} +``` + +**Verification:** `get_worksheet_data` sur Data_Clients doit retourner 6 lignes (header + 5 clients) + +### Step 2.2: Convertir en Excel Table (tbl_Clients) + +**Outil:** `create_table` + +**Parametres:** +```json +{ + "file_path": "...", + "sheet_name": "Data_Clients", + "range": "A1:D6", + "table_name": "tbl_Clients", + "has_headers": true, + "style": "TableStyleMedium2" +} +``` + +**Verification:** `list_tables` doit montrer `tbl_Clients` + +### Step 2.3: Peupler Data_Temps + +**Outil:** `set_worksheet_data` + +**Donnees:** +```json +{ + "sheet_name": "Data_Temps", + "data": [ + ["Date", "ClientID", "Projet", "Heures", "Description"], + ["02/01/2025", "CLI001", "Site Web", 3.5, "Maquettes"], + ["02/01/2025", "CLI002", "API Backend", 6.0, "Endpoints"], + ["03/01/2025", "CLI001", "Site Web", 4.0, "Integration"], + ["03/01/2025", "CLI003", "Campagne SEO", 2.5, "Audit"], + ["06/01/2025", "CLI002", "API Backend", 7.0, "Tests"], + ["06/01/2025", "CLI004", "Boutique", 5.0, "Setup"], + ["07/01/2025", "CLI001", "Maintenance", 1.5, "Updates"], + ["08/01/2025", "CLI003", "Campagne SEO", 3.0, "Keywords"], + ["08/01/2025", "CLI005", "Dashboard", 4.5, "Design"], + ["09/01/2025", "CLI002", "App Mobile", 6.5, "Screens"] + ], + "start_cell": "A1" +} +``` + +**Verification:** 11 lignes (header + 10 entrees) + +### Step 2.4: Convertir en Excel Table (tbl_Temps) + +**Outil:** `create_table` + +**Parametres:** +```json +{ + "sheet_name": "Data_Temps", + "range": "A1:E11", + "table_name": "tbl_Temps", + "has_headers": true +} +``` + +### Step 2.5: Peupler Data_Revenus + +**Outil:** `set_worksheet_data` + +**Donnees:** +```json +{ + "sheet_name": "Data_Revenus", + "data": [ + ["Date", "ClientID", "Montant", "Type"], + ["15/01/2025", "CLI001", 2500, "Facture"], + ["20/01/2025", "CLI002", 4200, "Facture"], + ["25/01/2025", "CLI003", 1800, "Facture"], + ["28/01/2025", "CLI001", 1000, "Acompte"], + ["31/01/2025", "CLI004", 3500, "Facture"], + ["05/02/2025", "CLI002", 2800, "Facture"], + ["10/02/2025", "CLI005", 1500, "Acompte"] + ], + "start_cell": "A1" +} +``` + +### Step 2.6: Convertir en Excel Table (tbl_Revenus) + +**Outil:** `create_table` + +**Parametres:** +```json +{ + "sheet_name": "Data_Revenus", + "range": "A1:D8", + "table_name": "tbl_Revenus", + "has_headers": true +} +``` + +### Step 2.7: Verification Phase 2 + +**Action:** `list_tables` sur le fichier + +**Resultat attendu:** +- tbl_Clients (Data_Clients, 5 lignes) +- tbl_Temps (Data_Temps, 10 lignes) +- tbl_Revenus (Data_Revenus, 7 lignes) + +--- + +## Phase 3: Configuration + +### Step 3.1: Peupler Config + +**Outil:** `set_worksheet_data` + +**Donnees:** +```json +{ + "sheet_name": "Config", + "data": [ + ["Parametre", "Valeur", "", "Secteurs", "", "Types"], + ["AnneeCourante", 2025, "", "Tech", "", "Facture"], + ["TauxHoraireDefaut", 75, "", "Marketing", "", "Acompte"], + ["DevisePrincipale", "EUR", "", "Finance", "", "Avoir"], + ["ObjectifMensuel", 10000, "", "E-commerce", "", "Autre"], + ["ObjectifHeures", 140, "", "Industrie", "", ""], + ["JourDebutSemaine", 2, "", "Services", "", ""], + ["", "", "", "Autre", "", ""] + ], + "start_cell": "A1" +} +``` + +**Note:** Les colonnes D et F serviront de listes deroulantes pour la validation des donnees. + +--- + +## Phase 4: Formules KPIs sur Dashboard + +### Step 4.1: Structure du Dashboard - Labels + +**Outil:** `set_worksheet_data` + +**Donnees (colonne A - labels):** +```json +{ + "sheet_name": "Dashboard", + "data": [ + ["FREELANCE DASHBOARD"], + [""], + ["KPIs Principaux"], + ["CA Total"], + ["CA Mois en cours"], + ["Heures Totales"], + ["Taux Horaire Moyen"], + ["Nb Clients Actifs"], + ["Heures Cette Semaine"], + [""], + ["Top Client"], + [""], + ["Periode"], + ["Date Debut"], + ["Date Fin"] + ], + "start_cell": "A1" +} +``` + +### Step 4.2: Formules KPIs - Valeurs + +**Outil:** `set_worksheet_data` + +**Donnees (colonne B - formules):** +```json +{ + "sheet_name": "Dashboard", + "data": [ + [""], + [""], + [""], + ["=SUM(tbl_Revenus[Montant])"], + ["=SUMPRODUCT((MONTH(tbl_Revenus[Date])=MONTH(TODAY()))*(YEAR(tbl_Revenus[Date])=YEAR(TODAY()))*tbl_Revenus[Montant])"], + ["=SUM(tbl_Temps[Heures])"], + ["=IFERROR(B4/B6,0)"], + ["=COUNTA(tbl_Clients[ClientID])"], + ["=SUMIFS(tbl_Temps[Heures],tbl_Temps[Date],\">=\"&(TODAY()-WEEKDAY(TODAY(),2)+1),tbl_Temps[Date],\"<=\"&(TODAY()-WEEKDAY(TODAY(),2)+7))"], + [""], + ["=IFERROR(INDEX(tbl_Clients[Nom],MATCH(MAX(SUMIFS(tbl_Revenus[Montant],tbl_Revenus[ClientID],tbl_Clients[ClientID])),SUMIFS(tbl_Revenus[Montant],tbl_Revenus[ClientID],tbl_Clients[ClientID]),0)),\"-\")"], + [""], + [""], + ["=MIN(tbl_Temps[Date])"], + ["=MAX(tbl_Temps[Date])"] + ], + "start_cell": "B1" +} +``` + +**Note:** Certaines formules complexes comme Top Client peuvent necessiter validation. Si erreur, utiliser version simplifiee. + +### Step 4.3: Verification des formules + +**Outil:** `get_worksheet_data` + +**Parametres:** +```json +{ + "sheet_name": "Dashboard", + "range": "A1:B15" +} +``` + +**Resultat attendu:** +- B4 (CA Total) = 17300 (somme des montants) +- B6 (Heures Totales) = 43.5 (somme des heures) +- B7 (Taux Horaire) = ~397.70 (17300/43.5) +- B8 (Nb Clients) = 5 + +--- + +## Phase 5: Tableaux Croises Dynamiques (MANUEL) + +> **IMPORTANT:** Cette phase ne peut PAS etre automatisee avec MCP VBA. +> Elle doit etre realisee manuellement dans Excel. + +### Step 5.1: TCD - CA par Client + +**Actions manuelles:** +1. Selectionner une cellule dans tbl_Revenus +2. Insertion > Tableau croise dynamique +3. Placer sur nouvelle feuille ou Dashboard +4. Configuration: + - Lignes: ClientID + - Valeurs: Somme de Montant +5. Renommer la feuille TCD si creee + +### Step 5.2: TCD - Heures par Mois + +**Configuration:** +- Lignes: Date (grouper par mois) +- Valeurs: Somme de Heures + +### Step 5.3: TCD - CA par Mois + +**Configuration:** +- Lignes: Date (grouper par mois) +- Valeurs: Somme de Montant + +--- + +## Phase 6: Graphiques (MANUEL) + +> **IMPORTANT:** Cette phase ne peut PAS etre automatisee avec MCP VBA. + +### Step 6.1: Graphique - Evolution CA Mensuel + +**Type:** Histogramme ou Courbe +**Source:** TCD CA par Mois +**Position:** Dashboard, zone superieure gauche + +### Step 6.2: Graphique - Repartition par Client + +**Type:** Camembert +**Source:** TCD CA par Client +**Position:** Dashboard, zone superieure droite + +### Step 6.3: Graphique - Heures par Semaine + +**Type:** Histogramme +**Source:** TCD Heures par Mois (ou semaine) +**Position:** Dashboard, zone inferieure gauche + +### Step 6.4: Graphique - CA vs Heures + +**Type:** Graphique combine (barres + ligne) +**Source:** Donnees agregees +**Position:** Dashboard, zone inferieure droite + +--- + +## Phase 7: Slicers et Filtres (MANUEL) + +### Step 7.1: Creer Slicer Client + +1. Selectionner un TCD +2. Insertion > Segment +3. Choisir ClientID +4. Connecter aux autres TCD (clic droit > Connexions de rapport) + +### Step 7.2: Creer Slicer Periode + +1. Segment sur Date (annee/mois) +2. Connecter aux TCD + +### Step 7.3: Positionner les Slicers + +- Placer en haut a droite du Dashboard +- Redimensionner pour integration visuelle + +--- + +## Phase 8: Design et Mise en Forme (MANUEL) + +### Step 8.1: Palette Couleurs + +| Element | Couleur | Hex | +|---------|---------|-----| +| Titre/Headers | Bleu fonce | #2C3E50 | +| KPIs positifs | Vert | #27AE60 | +| Fond | Gris clair | #ECF0F1 | +| Alertes | Rouge | #E74C3C | + +### Step 8.2: Mise en forme des KPIs + +- Police: Calibri 24-28pt Bold pour valeurs +- Format nombres: `# ##0 "€"` pour montants +- Format heures: `0.0 "h"` +- Format taux: `0.00 "€/h"` + +### Step 8.3: Mise en forme conditionnelle + +**KPI CA vs Objectif:** +- Vert si >= Config!ObjectifMensuel +- Orange si >= 80% +- Rouge si < 80% + +### Step 8.4: Layout Final + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ FREELANCE DASHBOARD [Slicers] β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ CA Totalβ”‚ β”‚CA Mois β”‚ β”‚ Heures β”‚ β”‚Taux Moy β”‚ β”‚ +β”‚ β”‚ 17300€ β”‚ β”‚ 0€ β”‚ β”‚ 43.5h β”‚ β”‚ 398€/h β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ [Graph CA Mensuel] [Graph Repartition] β”‚ +β”‚ β”‚ +β”‚ [Graph Heures/Semaine] [Graph CA vs Heures] β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## Phase 9: VBA Optionnel (Macro Refresh) + +### Step 9.1: Valider le code VBA + +**Outil:** `validate_vba_code` + +**Code:** +```vba +Sub RefreshDashboard() + Application.ScreenUpdating = False + Application.CalculateFull + + Dim ws As Worksheet + Dim pt As PivotTable + + For Each ws In ThisWorkbook.Worksheets + For Each pt In ws.PivotTables + pt.RefreshTable + Next pt + Next ws + + Application.ScreenUpdating = True + MsgBox "Dashboard actualise!", vbInformation +End Sub +``` + +### Step 9.2: Sauvegarder en .xlsm + +**Action manuelle:** +- Fichier > Enregistrer sous > FreelanceDashboard.xlsm (format macro) + +### Step 9.3: Injecter le module VBA + +**Outil:** `inject_vba` + +**Parametres:** +```json +{ + "file_path": "...FreelanceDashboard.xlsm", + "module_name": "mod_Refresh", + "code": "..." +} +``` + +### Step 9.4: Tester la macro + +**Outil:** `run_macro` + +**Parametres:** +```json +{ + "file_path": "...FreelanceDashboard.xlsm", + "macro_name": "RefreshDashboard" +} +``` + +--- + +## Phase 10: Tests et Validation + +### Step 10.1: Verification des donnees + +- [ ] tbl_Clients contient 5 clients +- [ ] tbl_Temps contient 10 entrees +- [ ] tbl_Revenus contient 7 entrees + +### Step 10.2: Verification des KPIs + +| KPI | Valeur Attendue | +|-----|-----------------| +| CA Total | 17 300 € | +| Heures Totales | 43.5 h | +| Taux Horaire | ~397.70 €/h | +| Nb Clients | 5 | + +### Step 10.3: Tests fonctionnels + +- [ ] Les formules se calculent correctement +- [ ] Les TCD se rafraichissent +- [ ] Les graphiques se mettent a jour +- [ ] Les slicers filtrent les donnees +- [ ] La macro fonctionne (si .xlsm) + +### Step 10.4: Ouvrir et verifier visuellement + +**Outil:** `open_in_office` + +```json +{ + "file_path": "...FreelanceDashboard.xlsx" +} +``` + +--- + +## Resume des Actions par Type + +### Automatisables (MCP VBA) + +| Step | Action | Outil MCP | +|------|--------|-----------| +| 2.1 | Donnees Clients | set_worksheet_data | +| 2.2 | Table Clients | create_table | +| 2.3 | Donnees Temps | set_worksheet_data | +| 2.4 | Table Temps | create_table | +| 2.5 | Donnees Revenus | set_worksheet_data | +| 2.6 | Table Revenus | create_table | +| 3.1 | Config | set_worksheet_data | +| 4.1 | Labels Dashboard | set_worksheet_data | +| 4.2 | Formules KPIs | set_worksheet_data | +| 9.1 | Valider VBA | validate_vba_code | +| 9.3 | Injecter VBA | inject_vba | +| 9.4 | Tester macro | run_macro | +| 10.4 | Ouvrir Excel | open_in_office | + +### Manuelles (Excel UI) + +| Step | Action | +|------|--------| +| 1.2 | Creer fichier Excel + onglets | +| 5.x | Tableaux Croises Dynamiques | +| 6.x | Graphiques | +| 7.x | Slicers | +| 8.x | Design et mise en forme | +| 9.2 | Sauvegarder en .xlsm | + +--- + +## Ordre d'Execution Recommande + +``` +AUTOMATISE MANUEL AUTOMATISE + β”‚ β”‚ β”‚ + β–Ό β–Ό β–Ό +[Phase 2-4] β†’ [Phases 5-8] β†’ [Phase 9-10] + Donnees TCD/Graphs VBA + Tables Slicers Tests + Formules Design +``` + +**Workflow optimal:** +1. Agent execute Phases 2-4 (donnees + formules) +2. Utilisateur complete Phases 5-8 dans Excel UI +3. Agent execute Phase 9 (VBA optionnel) +4. Agent execute Phase 10 (tests) + +--- + +## Notes Importantes + +1. **Chemin absolu obligatoire** pour tous les outils MCP: + `C:\Users\alexi\Documents\projects\freelance-dashboard\templates\FreelanceDashboard.xlsx` + +2. **Backup avant modifications:** + Utiliser `backup_vba` avant inject_vba + +3. **Gestion des erreurs:** + - Si formule echoue, verifier syntaxe (guillemets, virgules) + - Si table existe deja, ne pas recreer + +4. **Format dates:** + Les dates doivent etre au format `jj/mm/aaaa` pour Excel FR + +--- + +**Version:** 1.0 +**Date:** 2025-12-30 +**Auteur:** Claude Agent diff --git a/templates/FreelanceDashboard.xlsx b/templates/FreelanceDashboard.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..035963940fb22fa083e3166fcca65a10544dcdf2 GIT binary patch literal 6695 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 literal 0 HcmV?d00001