""" Modèles de données pour le système notarial """ from sqlalchemy import Column, String, Integer, DateTime, Text, JSON, Boolean, Float, ForeignKey from enum import Enum from pydantic import BaseModel as PydanticBaseModel from typing import Optional, List, Dict, Any 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) # Données structurées (utilisées par les routes) processing_steps = Column(JSON, default=dict) extracted_data = Column(JSON, default=dict) errors = Column(JSON, default=list) # 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") # Enumérations et schémas utilisés par les routes class DocumentStatus(str, Enum): PENDING = "uploaded" PROCESSING = "processing" COMPLETED = "completed" FAILED = "error" MANUAL_REVIEW = "manual_review" class DocumentType(str, Enum): PDF = "application/pdf" JPEG = "image/jpeg" PNG = "image/png" TIFF = "image/tiff" class DocumentResponse(PydanticBaseModel): status: str id_document: str message: str class DocumentInfo(PydanticBaseModel): id: str filename: str mime_type: str size: int status: DocumentStatus id_dossier: str etude_id: str utilisateur_id: str created_at: Any updated_at: Any processing_steps: Dict[str, Any] = {} extracted_data: Dict[str, Any] = {} errors: List[Any] = [] class ProcessingRequest(PydanticBaseModel): id_dossier: str etude_id: str utilisateur_id: str source: str = "upload" type_document_attendu: Optional[str] = None 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)