""" Modèles ORM SQLAlchemy pour la base de données PostgreSQL. Contient les 4 tables du schéma : - employees : dataset brut d'entraînement (1470 lignes) - prediction_inputs : données brutes envoyées à l'API - prediction_outputs : résultat de la prédiction - api_logs : traçabilité des échanges API ↔ DB """ from datetime import datetime from sqlalchemy import Column, DateTime, Float, ForeignKey, Integer, String from sqlalchemy.orm import relationship from src.db.database import Base class Employee(Base): """Table du dataset brut (1470 employés).""" __tablename__ = "employees" id_employee = Column(Integer, primary_key=True) age = Column(Integer, nullable=False) genre = Column(String(1), nullable=False) revenu_mensuel = Column(Integer, nullable=False) statut_marital = Column(String(20), nullable=False) departement = Column(String(20), nullable=False) poste = Column(String(30), nullable=False) annee_experience_totale = Column(Integer, nullable=False) annees_dans_l_entreprise = Column(Integer, nullable=False) satisfaction_employee_environnement = Column(Integer, nullable=False) note_evaluation_precedente = Column(Integer, nullable=False) satisfaction_employee_nature_travail = Column(Integer, nullable=False) satisfaction_employee_equipe = Column(Integer, nullable=False) satisfaction_employee_equilibre_pro_perso = Column(Integer, nullable=False) note_evaluation_actuelle = Column(Integer, nullable=False) heure_supplementaires = Column(String(5), nullable=False) augementation_salaire_precedente = Column(Integer, nullable=False) nombre_participation_pee = Column(Integer, nullable=False) nb_formations_suivies = Column(Integer, nullable=False) distance_domicile_travail = Column(Integer, nullable=False) niveau_education = Column(Integer, nullable=False) frequence_deplacement = Column(String(20), nullable=False) annees_depuis_la_derniere_promotion = Column(Integer, nullable=False) a_quitte_l_entreprise = Column(String(5), nullable=False) class PredictionInput(Base): """Données brutes envoyées à l'API (avant transformation).""" __tablename__ = "prediction_inputs" id = Column(Integer, primary_key=True, autoincrement=True) id_employee = Column(Integer, nullable=False) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) age = Column(Integer, nullable=False) genre = Column(String(1), nullable=False) revenu_mensuel = Column(Integer, nullable=False) statut_marital = Column(String(20), nullable=False) departement = Column(String(20), nullable=False) poste = Column(String(30), nullable=False) annee_experience_totale = Column(Integer, nullable=False) annees_dans_l_entreprise = Column(Integer, nullable=False) satisfaction_employee_environnement = Column(Integer, nullable=False) note_evaluation_precedente = Column(Integer, nullable=False) satisfaction_employee_nature_travail = Column(Integer, nullable=False) satisfaction_employee_equipe = Column(Integer, nullable=False) satisfaction_employee_equilibre_pro_perso = Column(Integer, nullable=False) note_evaluation_actuelle = Column(Integer, nullable=False) heure_supplementaires = Column(String(5), nullable=False) augementation_salaire_precedente = Column(Integer, nullable=False) nombre_participation_pee = Column(Integer, nullable=False) nb_formations_suivies = Column(Integer, nullable=False) distance_domicile_travail = Column(Integer, nullable=False) niveau_education = Column(Integer, nullable=False) frequence_deplacement = Column(String(20), nullable=False) annees_depuis_la_derniere_promotion = Column(Integer, nullable=False) output = relationship("PredictionOutput", back_populates="input", uselist=False) class PredictionOutput(Base): """Résultat de la prédiction du modèle.""" __tablename__ = "prediction_outputs" id = Column(Integer, primary_key=True, autoincrement=True) input_id = Column( Integer, ForeignKey("prediction_inputs.id"), nullable=False, unique=True ) prediction = Column(String(5), nullable=False) probabilite = Column(Float, nullable=False) classe = Column(Integer, nullable=False) input = relationship("PredictionInput", back_populates="output") class ApiLog(Base): """Traçabilité des échanges entre l'API et la base de données.""" __tablename__ = "api_logs" id = Column(Integer, primary_key=True, autoincrement=True) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) operation = Column(String(30), nullable=False) table_cible = Column(String(20), nullable=False) details = Column(String(255), nullable=True) statut = Column(String(10), nullable=False)