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