# Corrections Interface Web TIM - Affichage Patient et Mise en Page

## Date: 2026-02-12

## Problèmes Corrigés

### 1. ✅ En-tête Patient Vide

**Symptôme**: L'en-tête patient affichait "Non renseigné" pour toutes les informations (âge, sexe, dates).

**Cause**: Les informations patient (âge, sexe, date de naissance) n'étaient pas stockées dans la table `StayDB` lors du traitement du séjour.

**Solution**: 
- Ajouté une extraction automatique des informations patient depuis les documents dans l'endpoint `/stays/{stay_id}/coding-proposal`
- Extraction par regex des patterns suivants:
  - **Date de naissance**: `Né le DD/MM/YYYY` ou `Date de naissance: DD/MM/YYYY`
  - **Sexe**: `Monsieur` → M, `Madame` → F, ou `Sexe: Masculin/Féminin`
- Calcul automatique de l'âge à partir de la date de naissance et de la date d'admission

**Résultat**:
```
Age: 76 ans
Sex: M (Masculin)
Birth date: 1949-09-22
Admission: 2026-02-11
Discharge: 2026-02-11
Specialty: chirurgie
```

**Fichier modifié**: `src/pipeline_mco_pmsi/api/tim_api.py`

### 2. ✅ Mise en Page du Texte des Documents

**Symptôme**: Le texte des documents n'était pas bien cadré, difficile à lire avec une police monospace.

**Cause**: Le CSS utilisait `font-family: 'Courier New', monospace` sans padding ni bordure, rendant le texte difficile à lire.

**Solution**:
- Changé la police pour `'Segoe UI', Tahoma, Geneva, Verdana, sans-serif` (plus lisible)
- Ajouté un padding de 16px autour du texte
- Ajouté un fond gris clair (`#fafbfc`) avec bordure
- Ajouté `word-wrap: break-word` et `overflow-wrap: break-word` pour gérer les longs mots
- Conservé `white-space: pre-wrap` pour respecter les sauts de ligne

**Résultat**: Le texte est maintenant bien cadré dans une boîte avec fond gris clair, plus facile à lire.

**Fichier modifié**: `src/pipeline_mco_pmsi/api/static/css/documents.css`

### 3. ✅ Optimisation de l'En-tête Patient

**Symptôme**: L'en-tête patient prenait trop de place verticalement.

**Cause**: Padding et marges trop importants, taille de police trop grande.

**Solution**:
- Réduit le `min-height` de 80px à 60px
- Réduit le padding de `var(--spacing-lg)` à `var(--spacing-md) var(--spacing-lg)`
- Réduit la taille de police des labels (0.75em au lieu de 0.85em)
- Réduit la taille de police des valeurs (0.95em au lieu de 1.05em)
- Ajouté `text-transform: uppercase` et `letter-spacing: 0.5px` aux labels pour plus de clarté
- Réduit les gaps entre les éléments

**Résultat**: L'en-tête est plus compact tout en restant lisible.

**Fichier modifié**: `src/pipeline_mco_pmsi/api/static/css/main.css`

## Résultats Visuels

### Avant
```
┌─────────────────────────────────────────────────────────────┐
│ Informations Patient                                        │
│ Identifiant: ••••6332    Âge: Non renseigné               │
│ Sexe: Non renseigné      IMC: Non renseigné               │
└─────────────────────────────────────────────────────────────┘
```

### Après
```
┌─────────────────────────────────────────────────────────────┐
│ INFORMATIONS PATIENT                                        │
│ IDENTIFIANT: ••••6332    ÂGE: 76 ans                       │
│ SEXE: M                  IMC: Non renseigné                │
│                                                             │
│ INFORMATIONS SÉJOUR                                         │
│ ADMISSION: 11/02/2026    SORTIE: 11/02/2026               │
│ DURÉE: 0 jours          SPÉCIALITÉ: chirurgie             │
└─────────────────────────────────────────────────────────────┘
```

## Code Ajouté

### Extraction des Informations Patient (tim_api.py)

```python
# Extraire les informations patient depuis les documents si non disponibles
age = stay.age
sex = stay.sex
birth_date = None

if not age or not sex:
    import re
    from datetime import datetime
    
    for doc in stay.documents:
        content = doc.content
        
        # Extraire la date de naissance
        if not birth_date:
            birth_match = re.search(r'(?:Né|Date de naissance).*?(\d{2})/(\d{2})/(\d{4})', content, re.IGNORECASE)
            if birth_match:
                day, month, year = birth_match.groups()
                birth_date = f"{year}-{month}-{day}"
                
                # Calculer l'âge
                if stay.admission_date:
                    birth_dt = datetime.strptime(birth_date, "%Y-%m-%d")
                    admission_dt = stay.admission_date
                    age = admission_dt.year - birth_dt.year
                    if (admission_dt.month, admission_dt.day) < (birth_dt.month, birth_dt.day):
                        age -= 1
        
        # Extraire le sexe
        if not sex:
            if re.search(r'\bMonsieur\b', content, re.IGNORECASE):
                sex = "M"
            elif re.search(r'\bMadame\b', content, re.IGNORECASE):
                sex = "F"
            elif re.search(r'Sexe\s*:\s*Masculin', content, re.IGNORECASE):
                sex = "M"
            elif re.search(r'Sexe\s*:\s*Féminin', content, re.IGNORECASE):
                sex = "F"
```

### Nouveau CSS pour les Documents (documents.css)

```css
.document-text {
    line-height: 1.8;
    white-space: pre-wrap;
    word-wrap: break-word;
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    font-size: 0.9em;
    color: var(--text-primary);
    max-width: 100%;
    overflow-wrap: break-word;
    padding: 16px;
    background: #fafbfc;
    border-radius: 6px;
    border: 1px solid #e1e4e8;
}
```

## Test de Vérification

```bash
# Tester l'API
curl -s http://localhost:8001/stays/15_23096332/coding-proposal | python3 -c "
import sys, json
data = json.load(sys.stdin)
print(f'Age: {data.get(\"age\")} ans')
print(f'Sex: {data.get(\"sex\")}')
print(f'Birth date: {data.get(\"birth_date\")}')
print(f'Admission: {data.get(\"admission_date\")}')
print(f'Specialty: {data.get(\"specialty\")}')
"

# Résultat attendu:
# Age: 76 ans
# Sex: M
# Birth date: 1949-09-22
# Admission: 2026-02-11T23:09:28.661735
# Specialty: chirurgie
```

## Prochaines Étapes

1. **Améliorer l'extraction des informations patient**:
   - Extraire le poids et la taille si disponibles
   - Extraire les modes d'entrée et de sortie
   - Stocker ces informations dans la base lors du traitement initial

2. **Améliorer la mise en page des documents**:
   - Ajouter la coloration syntaxique pour les sections importantes
   - Ajouter des boutons pour zoomer/dézoomer le texte
   - Améliorer la recherche dans les documents

3. **Optimiser les performances**:
   - Mettre en cache les informations patient extraites
   - Éviter de re-parser les documents à chaque requête

## Fichiers Modifiés

- `src/pipeline_mco_pmsi/api/tim_api.py` - Extraction des infos patient
- `src/pipeline_mco_pmsi/api/static/css/main.css` - Optimisation en-tête
- `src/pipeline_mco_pmsi/api/static/css/documents.css` - Amélioration mise en page texte

## Commandes Utiles

```bash
# Redémarrer le serveur
pkill -f "uvicorn pipeline_mco_pmsi.api.tim_api"
python -m uvicorn pipeline_mco_pmsi.api.tim_api:app --host 0.0.0.0 --port 8001

# Tester l'interface
firefox http://localhost:8001

# Voir les logs
tail -f api_server.log
```
