""" Modèles de données pour le système notarial """ from sqlalchemy import Column, String, Integer, DateTime, Text, JSON, Boolean, Float, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship from datetime import datetime import uuid Base = declarative_base() class Document(Base): """Modèle pour les documents notariaux""" __tablename__ = "documents" id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) filename = Column(String(255), nullable=False) original_filename = Column(String(255), nullable=False) mime_type = Column(String(100), nullable=False) size = Column(Integer, nullable=False) # Métadonnées id_dossier = Column(String(100), nullable=False) etude_id = Column(String(100), nullable=False) utilisateur_id = Column(String(100), nullable=False) source = Column(String(50), default="upload") # Statut et progression status = Column(String(50), default="uploaded") # uploaded, processing, completed, error progress = Column(Integer, default=0) current_step = Column(String(100)) # Résultats du traitement ocr_text = Column(Text) document_type = Column(String(100)) confidence_score = Column(Float) # Timestamps created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) processed_at = Column(DateTime) # Relations entities = relationship("Entity", back_populates="document") verifications = relationship("Verification", back_populates="document") processing_logs = relationship("ProcessingLog", back_populates="document") class Entity(Base): """Modèle pour les entités extraites des documents""" __tablename__ = "entities" id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) document_id = Column(String, ForeignKey("documents.id"), nullable=False) # Type d'entité entity_type = Column(String(50), nullable=False) # person, address, property, company, etc. entity_value = Column(Text, nullable=False) # Position dans le document page_number = Column(Integer) bbox_x = Column(Float) bbox_y = Column(Float) bbox_width = Column(Float) bbox_height = Column(Float) # Métadonnées confidence = Column(Float) context = Column(Text) # Timestamps created_at = Column(DateTime, default=datetime.utcnow) # Relations document = relationship("Document", back_populates="entities") class Verification(Base): """Modèle pour les vérifications effectuées""" __tablename__ = "verifications" id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) document_id = Column(String, ForeignKey("documents.id"), nullable=False) # Type de vérification verification_type = Column(String(100), nullable=False) # cadastre, georisques, bodacc, etc. verification_status = Column(String(50), nullable=False) # pending, success, error, warning # Résultats result_data = Column(JSON) error_message = Column(Text) warning_message = Column(Text) # Métadonnées api_endpoint = Column(String(255)) response_time = Column(Float) # Timestamps created_at = Column(DateTime, default=datetime.utcnow) completed_at = Column(DateTime) # Relations document = relationship("Document", back_populates="verifications") class ProcessingLog(Base): """Modèle pour les logs de traitement""" __tablename__ = "processing_logs" id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) document_id = Column(String, ForeignKey("documents.id"), nullable=False) # Informations du log step_name = Column(String(100), nullable=False) step_status = Column(String(50), nullable=False) # started, completed, error message = Column(Text) error_details = Column(Text) # Métadonnées processing_time = Column(Float) input_hash = Column(String(64)) output_hash = Column(String(64)) # Timestamps created_at = Column(DateTime, default=datetime.utcnow) # Relations document = relationship("Document", back_populates="processing_logs") class Study(Base): """Modèle pour les études notariales""" __tablename__ = "studies" id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) name = Column(String(255), nullable=False) address = Column(Text) phone = Column(String(50)) email = Column(String(255)) # Configuration settings = Column(JSON) api_keys = Column(JSON) # Clés API pour les vérifications externes # Statut is_active = Column(Boolean, default=True) # Timestamps created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) class User(Base): """Modèle pour les utilisateurs""" __tablename__ = "users" id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) username = Column(String(100), unique=True, nullable=False) email = Column(String(255), unique=True, nullable=False) full_name = Column(String(255)) # Authentification hashed_password = Column(String(255)) is_active = Column(Boolean, default=True) is_admin = Column(Boolean, default=False) # Relations study_id = Column(String, ForeignKey("studies.id")) study = relationship("Study") # Timestamps created_at = Column(DateTime, default=datetime.utcnow) last_login = Column(DateTime) class Dossier(Base): """Modèle pour les dossiers notariaux""" __tablename__ = "dossiers" id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4())) dossier_number = Column(String(100), unique=True, nullable=False) title = Column(String(255)) description = Column(Text) # Relations study_id = Column(String, ForeignKey("studies.id"), nullable=False) study = relationship("Study") # Statut status = Column(String(50), default="open") # open, closed, archived # Métadonnées client_name = Column(String(255)) client_email = Column(String(255)) client_phone = Column(String(50)) # Timestamps created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) closed_at = Column(DateTime)