244 lines
7.6 KiB
Python

"""
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)