ncantu 884a8eed96 fix: Corrections finales et optimisations
- Corrections mineures dans les pipelines
- Optimisations de l'API complète
- Améliorations de la documentation
- Finalisation du système
2025-09-09 04:57:45 +02:00

195 lines
6.3 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 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)