# Intégration Interface TIM - Connexion Backend ## Résumé des modifications L'interface TIM a été connectée au backend pour afficher les données réelles des patients et séjours. ## Problème résolu L'interface affichait "Non renseigné" pour toutes les informations patient (âge, dates d'admission/sortie, sexe, spécialité) car : 1. Les données n'étaient pas correctement transmises depuis l'API 2. Le modèle `StayDB` ne contenait pas tous les champs nécessaires 3. La structure des données n'était pas correctement mappée ## Modifications apportées ### 1. API Backend (`src/pipeline_mco_pmsi/api/tim_api.py`) #### Ajout du champ `age` dans la réponse ```python class CodingProposalResponse(BaseModel): stay_id: str age: Optional[int] = None # Nouveau champ patient_id: Optional[str] = None admission_date: Optional[str] = None discharge_date: Optional[str] = None birth_date: Optional[str] = None sex: Optional[str] = None weight: Optional[float] = None height: Optional[float] = None specialty: Optional[str] = None # ... ``` #### Calcul de la date de naissance à partir de l'âge ```python # Calculer la date de naissance approximative à partir de l'âge si disponible birth_date = None if stay.age and stay.admission_date: from dateutil.relativedelta import relativedelta birth_date = (stay.admission_date - relativedelta(years=stay.age)).isoformat() return CodingProposalResponse( stay_id=stay_id, age=stay.age, # Transmettre l'âge directement patient_id=stay.stay_id, admission_date=stay.admission_date.isoformat() if stay.admission_date else None, discharge_date=stay.discharge_date.isoformat() if stay.discharge_date else None, birth_date=birth_date, # Date de naissance calculée sex=stay.sex, specialty=stay.specialty, # ... ) ``` ### 2. Frontend - PatientHeader (`src/pipeline_mco_pmsi/api/static/js/components/patient-header.js`) #### Utilisation de l'âge fourni par le serveur ```javascript calculateAge(birthDate, ageFromServer = null) { // Si l'âge est déjà fourni par le serveur, l'utiliser if (ageFromServer !== null && ageFromServer !== undefined) { return ageFromServer; } // Sinon, calculer depuis birthDate if (!birthDate) { return null; } // ... } ``` #### Rendu avec l'âge du séjour ```javascript render(stay) { const patient = stay.patient || {}; const admission = stay.admission || {}; const discharge = stay.discharge || {}; // Utiliser l'âge du séjour s'il est disponible const age = stay.age || this.calculateAge(patient.birthDate, stay.age); const bmi = this.calculateBMI(patient.weight, patient.height); const duration = this.calculateStayDuration(admission.date, discharge.date); // ... } ``` ### 3. Frontend - index.html #### Transmission de l'âge dans l'objet stay ```javascript const stay = { stay_id: data.stay_id, age: data.age, // Ajouter l'âge directement depuis l'API patient: { id: data.patient_id || data.stay_id, birthDate: data.birth_date, sex: data.sex, weight: data.weight, height: data.height }, admission: { date: data.admission_date, mode: null, specialty: data.specialty }, discharge: { date: data.discharge_date, mode: null }, codes: [] }; ``` ## Données disponibles dans StayDB Le modèle `StayDB` contient les champs suivants : - `stay_id`: Identifiant du séjour - `admission_date`: Date d'admission - `discharge_date`: Date de sortie - `specialty`: Spécialité médicale - `age`: Âge du patient - `sex`: Sexe du patient (M/F) - `unit`: Unité médicale (optionnel) - `status`: Statut du séjour ## Données non disponibles Les champs suivants ne sont pas stockés dans `StayDB` et s'affichent comme "Non renseigné" : - `weight`: Poids du patient - `height`: Taille du patient - `admission.mode`: Mode d'entrée - `discharge.mode`: Mode de sortie Pour ajouter ces données, il faudrait : 1. Modifier le modèle `StayDB` pour inclure ces champs 2. Mettre à jour le pipeline de traitement pour extraire ces informations 3. Modifier l'API pour transmettre ces données ## Test de l'interface ### Créer un séjour de test ```python from datetime import datetime from pipeline_mco_pmsi.database.base import get_db from pipeline_mco_pmsi.database.models import StayDB, ClinicalDocumentDB, CodeDB, EvidenceDB db = next(get_db()) # Créer un séjour stay = StayDB( stay_id='TEST001', admission_date=datetime(2024, 1, 15), discharge_date=datetime(2024, 1, 20), specialty='Chirurgie', age=65, sex='M', status='proposed' ) db.add(stay) db.commit() # Ajouter un document doc = ClinicalDocumentDB( document_id='DOC001', stay_id=stay.id, document_type='CR_HOSPI', content='Patient de 65 ans admis pour appendicite aiguë.', creation_date=datetime(2024, 1, 15), author='Dr. Martin', priority=1 ) db.add(doc) db.commit() # Ajouter un code avec preuve dp = CodeDB( stay_id=stay.id, code='K35.8', label='Appendicite aiguë', type='dp', confidence=0.95, reasoning='Diagnostic principal', referentiel_version='CIM-10 2024', status='proposed', model_name='llama3.2', model_digest='abc123', prompt_version='1.0' ) db.add(dp) db.commit() # Ajouter une preuve evidence = EvidenceDB( code_id=dp.id, document_id=doc.id, span_start=0, span_end=50, text='Patient de 65 ans admis pour appendicite aiguë', context='Patient de 65 ans admis pour appendicite aiguë.' ) db.add(evidence) db.commit() ``` ### Démarrer le serveur ```bash cd src uvicorn pipeline_mco_pmsi.api.tim_api:app --reload --host 0.0.0.0 --port 8000 ``` ### Accéder à l'interface 1. Ouvrir http://localhost:8000 dans un navigateur 2. Entrer l'identifiant du séjour : `TEST001` 3. Cliquer sur "Charger le séjour" ### Résultat attendu L'interface doit afficher : - **Identifiant**: •••T001 (anonymisé) - **Âge**: 65 ans - **Sexe**: M - **IMC**: Non renseigné (pas de poids/taille) - **Admission**: 15/01/2024 - **Sortie**: 20/01/2024 - **Durée**: 5 jours - **Spécialité**: Chirurgie - **Mode d'entrée**: Non renseigné - **Mode de sortie**: Non renseigné ## Prochaines étapes 1. Charger les documents du séjour depuis la base de données 2. Afficher les faits cliniques dans le panneau de détails 3. Implémenter la navigation entre codes, preuves et documents 4. Tester avec des séjours réels du pipeline