# 📋 Endobest Dashboard - Documentation Complète (Français)

**Synthèse complète du système - Guide de référence**

---

## 📌 À Propos du Projet

Le **Dashboard Endobest** est un système automatisé hautement performant de collecte et de traitement de données pour l'étude clinique Endobest. Il récupère les données d'inclusion des patients à partir de plusieurs centres hospitaliers via les APIs Ziwig (RC, GDD, IAM) et génère des rapports JSON et Excel avec validation complète de la qualité.

### Caractéristiques Principales

✅ **Configuration 100% externalisée** - Excel, zéro modification de code
✅ **Performance optimisée** - 4-5x plus rapide grâce aux appels API optimisés
✅ **Multithreading avancé** - 20+ workers parallèles
✅ **Qualité assurée** - Contrôles de cohérence + tests de non-régression
✅ **Export flexible** - JSON + Excel avec filtrage/tri/transformation
✅ **Robustesse** - Gestion d'erreurs, token refresh auto, retry automatiques

---

## 🏗️ Structure du Projet

### Modules Python

```
eb_dashboard.py                    (57.5 KB) - Orchestrateur principal
└─ Coordonne l'authentification, la collecte, le traitement des données

eb_dashboard_utils.py              (6.4 KB) - Utilitaires
└─ Clients HTTP thread-safe, navigation JSON, résolution chemins

eb_dashboard_quality_checks.py     (58.5 KB) - Validation de qualité
└─ Tests de cohérence, non-régression, contrôles de régression

eb_dashboard_excel_export.py       (32 KB) - Export Excel
└─ Génération de classeurs configurables, filtrage, tri, remplissage
```

### Configuration & Documentation

```
config/
├─ Endobest_Dashboard_Config.xlsx  - Configuration maître (5 feuilles)
│  ├─ Inclusions_Mapping: Définition des champs
│  ├─ Organizations_Mapping: Champs d'organisation
│  ├─ Excel_Workbooks: Métadonnées des classeurs
│  ├─ Excel_Sheets: Configuration des feuilles
│  └─ Regression_Check: Règles de validation
│
├─ eb_org_center_mapping.xlsx      - Enrichissement organisations (optionnel)
│
└─ templates/                      - Modèles Excel
   ├─ Endobest_Template.xlsx
   ├─ Statistics_Template.xlsx
   └─ (Autres modèles)

DOCUMENTATION_10_ARCHITECTURE.md   - Architecture système (43.7 KB)
DOCUMENTATION_11_FIELD_MAPPING.md  - Extraction et transformation (56.3 KB)
DOCUMENTATION_12_QUALITY_CHECKS.md - Validation et qualité (60.2 KB)
DOCUMENTATION_13_EXCEL_EXPORT.md   - Génération Excel (29.6 KB)
DOCUMENTATION_98_USER_GUIDE.md     - Guide utilisateur (8.4 KB)
DOCUMENTATION_99_CONFIG_GUIDE.md   - Guide configuration (24.8 KB)
```

---

## 🚀 Démarrage Rapide

### Installation

```bash
# 1. Python 3.7+
python --version

# 2. Dépendances
pip install httpx openpyxl questionary tqdm rich

# Optionnel (pour recalcul formules Excel)
pip install pywin32
pip install pytz
```

### Exécution Simple

```bash
# Mode 1: Collecte complète (recommandé)
python eb_dashboard.py
# → Collecte + Validation + Export JSON + Excel

# Mode 2: Export Excel rapide (5-15 sec)
python eb_dashboard.py --excel_only
# → Utilise données JSON existantes

# Mode 3: Validation uniquement
python eb_dashboard.py --check-only
# → Teste les données sans export

# Mode 4: Mode debug
python eb_dashboard.py --debug
# → Logs détaillés dans dashboard.log
```

### Identifiants par Défaut

```
Login: ziwig-invest2@yopmail.com
Mot de passe: pbrrA765$bP3beiuyuiyhiuy!agx
Threads: 12 (ajustable 1-20)
```

---

## 📊 Flux de Données Principal

### 5 Phases d'Exécution

```
PHASE 1: INITIALISATION (2-3 sec)
│
├─ Authentification IAM
├─ Échange de token RC
├─ Chargement configuration
└─ Setup thread pools
│
PHASE 2: ORGANISATIONS & COMPTEURS (5-8 sec)
│
├─ GET /api/inclusions/getAllOrganizations
├─ POST /api/inclusions/inclusion-statistics (20 workers)
├─ Enrichissement centre optionnel
└─ Tri organisations
│
PHASE 3: COLLECTE INCLUSIONS (2-4 min)
│
├─ Boucle Orgs: 20 workers parallèles
├─ Pour chaque patient:
│  ├─ Récupération dossier clinique
│  ├─ Récupération questionnaires (⚡ 1 appel optimisé!)
│  ├─ Récupération requêtes lab (async)
│  └─ Traitement champs selon configuration
└─ Combinaison de toutes les inclusions
│
PHASE 4: CONTRÔLE QUALITÉ (10-15 sec)
│
├─ Cohérence: API stats vs données réelles
├─ Non-régression: comparaison avec exécution précédente
└─ Confirmation utilisateur si problèmes critiques
│
PHASE 5: EXPORT (3-20 sec)
│
├─ Sauvegarde fichiers JSON
├─ Génération classeurs Excel
└─ Logs + temps écoulé
```

---

## ⚙️ Configuration (Excel)

### Fichier Principal: `Endobest_Dashboard_Config.xlsx`

#### Feuille 1: Inclusions_Mapping
Définit les champs patients à extraire

| Colonne | Type | Exemple | Usage |
|---------|------|---------|-------|
| field_group | Texte | Patient_Identification | Groupe logique |
| field_name | Texte | Patient_Id | Nom interne |
| source_type | Texte | q_id / record / inclusion / request / calculated | Où récupérer |
| source_value | Texte | questionnaire_uuid | Valeur source |
| field_path | JSON | ["patient_id"] | Chemin JSON |
| field_condition | Texte | Consent_Signed | Condition d'exécution |
| value_labels | JSON | {...} | Mappage valeurs |
| field_template | Texte | $value% | Formatage |
| true_if_any | JSON | [...] | Conversion booléenne |

#### Feuille 2: Organizations_Mapping
Champs d'organisation (rarement modifié)

#### Feuille 3: Excel_Workbooks
Définit les fichiers Excel à créer

| Colonne | Exemple |
|---------|---------|
| workbook_name | Endobest_Output |
| template_path | templates/Endobest_Template.xlsx |
| output_filename | {workbook_name}_{extract_date_time}.xlsx |
| output_exists_action | Overwrite / Increment / Backup |

#### Feuille 4: Excel_Sheets
Configure le contenu et les transformations

| Colonne | Exemple |
|---------|---------|
| workbook_name | Endobest_Output |
| sheet_name | Inclusions |
| source_type | Inclusions / Organizations / Variable |
| target | DataTable (named range) |
| column_mapping | JSON: {"col_id": "patient_id", ...} |
| filter_condition | JSON: {"status": "active"} |
| sort_keys | JSON: [{"field": "date", "order": "desc"}] |
| value_replacement | JSON: [{"type": "bool", ...}] |

#### Feuille 5: Regression_Check
Règles de validation de qualité

| Colonne | Signification |
|---------|---|
| rule_name | Nom de la règle |
| field_selection | Pipeline include/exclude |
| bloc_scope | Organisations concernées |
| transitions | Changements attendus |
| severity | Warning / Critical |

### Fichier Optionnel: `eb_org_center_mapping.xlsx`

Enrichit organisations avec identifiants centres

```
Org_Center_Mapping sheet:
│
├─ Organization_Name | Center_Name
├─ Hospital A        | HOSP-A
├─ Hospital B        | HOSP-B
└─ ...
```

---

## 🔄 Cycle de Traitement des Champs

Pour chaque champ configuré:

```
1. SOURCE
   ├─ Questionnaire (q_id/q_name/q_category)
   ├─ Record (dossier clinique)
   ├─ Inclusion (données inclusion patient)
   ├─ Request (requête lab)
   └─ Calculated (fonction personnalisée)
   │
2. EXTRACTION
   ├─ Navigation JSON avec chemin
   ├─ Support wildcards (*)
   └─ Valeur brute ou "undefined"
   │
3. CONDITION
   ├─ Si condition = false → "N/A"
   ├─ Si condition = undefined → "undefined"
   └─ Sinon → continuer
   │
4. TRANSFORMATION
   ├─ true_if_any (booléen)
   ├─ value_labels (texte localisé)
   ├─ field_template (formatage)
   └─ List joining (aplatissement)
   │
5. STOCKAGE
   └─ output_inclusion[groupe][champ] = valeur_finale
```

---

## 🛡️ Gestion d'Erreurs

### Stratégie de Récupération

```
APPEL API
  │
  ├─ Succès (200-299)
  │  └─→ Retour réponse
  │
  └─ Erreur
     ├─ HTTP 401 (Token expiré)
     │  └─→ Refresh token automatique + Retry
     ├─ Erreur réseau
     │  └─→ Retry après 0.5 sec
     ├─ Autre erreur HTTP
     │  └─→ Retry après 0.5 sec
     │
     └─ Max 10 tentatives (ERROR_MAX_RETRY)
        └─ Si écec: Erreur critique → Exit
```

### Dégradation Gracieuse

- **Fichier org mapping manquant?** → Ignoré silencieusement
- **Template Excel manquant?** → Erreur claire avec chemin
- **Problèmes qualité critiques?** → Confirmation utilisateur
- **Erreur thread?** → Shutdown gracieux, conservation données partielles

---

## 📈 Performance & Optimisations

### Impact Optimisation API Questionnaires

```
AVANT (Lent):
└─ 1,200 patients × 15 questionnaires
   = 18,000 appels API
   = 15-30 minutes

APRÈS (Optimisé):
└─ 1,200 patients × 1 appel
   = 1,200 appels API
   = 2-5 minutes
   = GAIN: 3-6x plus rapide ⚡
```

### Temps Typiques

| Étape | Durée |
|-------|-------|
| Login + Config | 2-3 sec |
| Compteurs (20 workers) | 5-8 sec |
| Inclusions (avec APIs) | 2-4 min |
| Checks qualité | 10-15 sec |
| Export JSON | 3-5 sec |
| Export Excel | 5-15 sec |
| **TOTAL** | **2.5-5 min** |

---

## ✅ Contrôles de Qualité

### 1. Test de Cohérence
Vérifie que les compteurs API correspondent aux données réelles

```
Pour chaque organisation:
  API Count = statistiques fournies
  Actual Count = enregistrements collectés

  Δ ≤ 10%  → ⚠️  Avertissement
  Δ > 10%  → 🔴 Critique
```

### 2. Test de Non-Régression
Détecte changements inattendus vs exécution précédente

```
Règles configurables:
├─ Sélection champs (pipeline include/exclude)
├─ Patterns de transition (états attendus)
├─ Exceptions (organisations spécifiques)
└─ Sévérité (Warning/Critical)

Détections:
├─ Nouvelles inclusions
├─ Inclusions supprimées
├─ Changements champs
└─ Transitions d'état invalides
```

---

## 📁 Fichiers de Sortie

### JSON Files

**endobest_inclusions.json** (~6-7 MB)
```json
[
  {
    "Patient_Identification": {
      "Organisation_Id": "...",
      "Organisation_Name": "...",
      "Center_Name": "...",
      "Patient_Id": "...",
      "Pseudo": "...",
      "Patient_Name": "...",
      "Patient_Birthday": "...",
      "Patient_Age": ...
    },
    "Inclusion": { ... },
    "Extended_Fields": { ... },
    "Endotest": { ... }
  }
]
```

**endobest_organizations.json** (~17-20 KB)
```json
[
  {
    "id": "org-uuid",
    "name": "Hospital A",
    "Center_Name": "HOSP-A",
    "patients_count": 45,
    "preincluded_count": 8,
    "included_count": 35,
    "prematurely_terminated_count": 2
  }
]
```

### Excel Files
Générés selon configuration, avec:
- Filtrage (conditions AND)
- Tri (multi-clés avec datetime)
- Remplacement valeurs (strict type matching)
- Remplissage cellules/plages nommées
- Recalcul formules (optionnel via win32com)

### Log File
**dashboard.log**
- Événements par exécution
- Avertissements API
- Erreurs avec contexte
- Statistiques exécution

---

## 🎯 Fonctions Personnalisées

### Fonctions Disponibles (Block 6)

#### 1. search_in_fields_using_regex
Recherche pattern dans plusieurs champs

```json
{
  "source_id": "search_in_fields_using_regex",
  "field_path": [".*surgery.*", "Indication", "Previous_Surgery"]
}
```

#### 2. extract_parentheses_content
Extrait texte entre parenthèses

```json
{
  "source_id": "extract_parentheses_content",
  "field_path": ["Status_Field"]
}
```

#### 3. append_terminated_suffix
Ajoute suffixe si prématurément terminé

```json
{
  "source_id": "append_terminated_suffix",
  "field_path": ["Inclusion_Status", "IsPrematurelyTerminated"]
}
```

#### 4. if_then_else
Logique conditionnelle unifiée

```json
{
  "source_id": "if_then_else",
  "field_path": ["is_defined", "Patient_Id", "$\"DEFINED\"", "$\"UNDEFINED\""]
}
```

**Opérateurs:** `is_true`, `is_false`, `is_defined`, `is_undefined`, `all_true`, `all_defined`, `==`, `!=`

---

## 🔑 APIs Utilisées

### Authentification (IAM)

```
POST https://api-auth.ziwig-connect.com/api/auth/ziwig-pro/login
Request: {username, password}
Response: {access_token, userId}

POST https://api-hcp.ziwig-connect.com/api/auth/config-token
Headers: Authorization: Bearer {master_token}
Response: {access_token, refresh_token}
```

### Research Clinic (RC)

```
GET /api/inclusions/getAllOrganizations
POST /api/inclusions/inclusion-statistics
POST /api/inclusions/search?limit=1000&page=1
POST /api/records/byPatient
POST /api/surveys/filter/with-answers ⚡ OPTIMISÉE
```

### Lab (GDD)

```
GET /api/requests/by-tube-id/{tubeId}
```

---

## 📚 Documentation Détaillée

| Document | Contenu |
|----------|---------|
| **DOCUMENTATION_10_ARCHITECTURE.md** | Design système, APIs, multithreading |
| **DOCUMENTATION_11_FIELD_MAPPING.md** | Extraction champs, fonctions, exemples |
| **DOCUMENTATION_12_QUALITY_CHECKS.md** | Framework QA, règles régression |
| **DOCUMENTATION_13_EXCEL_EXPORT.md** | Génération Excel, pipeline transformation |
| **DOCUMENTATION_98_USER_GUIDE.md** | Instructions utilisateur, FAQ |
| **DOCUMENTATION_99_CONFIG_GUIDE.md** | Référence configuration, tableaux Excel |

---

## 🆘 Dépannage Courant

| Problème | Cause | Solution |
|----------|-------|----------|
| **Login échoue** | Credentials invalides | Vérifier identifiants |
| **Template non trouvé** | Chemin incorrect | Vérifier `config/templates/` |
| **Pas de données Excel** | Filtre trop restrictif | Vérifier filter_condition |
| **Script lent** | Trop peu de threads | Augmenter jusqu'à 20 |
| **Erreur configuration** | JSON invalide | Valider JSON dans Excel |

---

## 🎯 Cas d'Usage Typiques

### 1. Collecte Hebdomadaire
```bash
# Programmé chaque lundi 6h
python eb_dashboard.py
```

### 2. Reconfiguration Rapide
```bash
# Modification fichier Excel config
python eb_dashboard.py --excel_only
# Résultats en 5-15 secondes
```

### 3. Vérification Qualité
```bash
python eb_dashboard.py --check-only
# Validation avant distribution
```

### 4. Débogage
```bash
python eb_dashboard.py --debug
# Consulter dashboard.log
```

---

## 🔐 Sécurité

⚠️ **Points Importants:**
- Fichiers JSON contiennent données patients
- Stocker en lieu sûr
- Gérer selon protocoles établis
- Supprimer fichiers `_old` si inutiles
- Logs peuvent contenir infos sensibles

---

## 💡 Bonnes Pratiques

1. **Première exécution:** Toujours mode complet (collecte)
2. **Configurations:** Tester avec `--excel_only`
3. **Programmation:** Utiliser task scheduler ou cron
4. **Threads:** Plus = plus rapide (mais utilisation réseau)
5. **Sauvegardes:** Les fichiers `_old` sont automatiques

---

## 📞 Support

### Vérifications
1. Consulter ce document
2. Consulter FAQ (DOCUMENTATION_98_USER_GUIDE.md)
3. Consulter dashboard.log
4. Exécuter avec `--debug`

### Logs
```bash
# Dernières 50 lignes
tail -n 50 dashboard.log

# Erreurs uniquement
grep ERROR dashboard.log

# Exécution spécifique
grep "2025-01-15" dashboard.log
```

---

## ✨ Points Forts

✅ Configuration 100% Excel (zéro code)
✅ Performance 4-5x supérieure
✅ Gestion erreurs robuste
✅ Interface utilisateur conviviale
✅ Architecture maintenable
✅ Documentation complète
✅ Prêt production

---

## 📝 Résumé Technique

- **Langage:** Python 3.7+
- **Modules:** httpx, openpyxl, questionary, tqdm, rich
- **Architecture:** Multi-threading, async I/O
- **Configuration:** 100% Excel (5 feuilles)
- **Export:** JSON + Excel
- **Validation:** Cohérence + non-régression
- **Performance:** 2.5-5 minutes (1,200+ patients)
- **Logging:** dashboard.log complet

---

## 🎓 Prochaines Étapes

**Démarrage:**
1. Installer Python 3.7+
2. `pip install httpx openpyxl questionary tqdm rich`
3. `python eb_dashboard.py`

**Configuration:**
1. Consulter DOCUMENTATION_99_CONFIG_GUIDE.md
2. Éditer config/Endobest_Dashboard_Config.xlsx
3. Ajouter/modifier champs selon besoin

**Avancé:**
1. DOCUMENTATION_11_FIELD_MAPPING.md (extraction)
2. DOCUMENTATION_12_QUALITY_CHECKS.md (validation)
3. DOCUMENTATION_13_EXCEL_EXPORT.md (export)

---

**Version:** 1.0
**Date:** 2025-11-08
**Statut:** ✅ Production Ready
**Langue:** Français (avec documentation anglaise complète)

**Pour plus de détails, consultez les fichiers DOCUMENTATION_*.md**
