""" SQLAlchemy models for Legal Documents — Rechtliche Texte mit Versionierung und Approval-Workflow. Tables: - compliance_legal_documents: Dokumenttypen (DSE, AGB, Cookie-Policy etc.) - compliance_legal_document_versions: Versionen mit Status-Workflow - compliance_legal_document_approvals: Audit-Trail fuer Freigaben """ import uuid from datetime import datetime from sqlalchemy import ( Column, String, Text, Boolean, DateTime, Index, ForeignKey ) from sqlalchemy.dialects.postgresql import UUID from classroom_engine.database import Base class LegalDocumentDB(Base): """Legal document type — DSE, AGB, Cookie-Policy, Impressum, AVV etc.""" __tablename__ = 'compliance_legal_documents' id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) tenant_id = Column(String(100)) type = Column(String(50), nullable=False) # privacy_policy|terms|cookie_policy|imprint|dpa name = Column(String(300), nullable=False) description = Column(Text) mandatory = Column(Boolean, default=False) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) __table_args__ = ( Index('idx_legal_docs_tenant', 'tenant_id'), Index('idx_legal_docs_type', 'type'), ) def __repr__(self): return f"" class LegalDocumentVersionDB(Base): """Version of a legal document with Approval-Workflow status.""" __tablename__ = 'compliance_legal_document_versions' id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) document_id = Column(UUID(as_uuid=True), ForeignKey('compliance_legal_documents.id', ondelete='CASCADE'), nullable=False) version = Column(String(20), nullable=False) language = Column(String(10), default='de') title = Column(String(300), nullable=False) content = Column(Text, nullable=False) summary = Column(Text) status = Column(String(20), default='draft') # draft|review|approved|published|archived|rejected created_by = Column(String(200)) approved_by = Column(String(200)) approved_at = Column(DateTime) rejection_reason = Column(Text) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) __table_args__ = ( Index('idx_legal_doc_versions_doc', 'document_id'), Index('idx_legal_doc_versions_status', 'status'), ) def __repr__(self): return f"" class LegalDocumentApprovalDB(Base): """Audit trail for all approval actions on document versions.""" __tablename__ = 'compliance_legal_document_approvals' id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) version_id = Column(UUID(as_uuid=True), ForeignKey('compliance_legal_document_versions.id', ondelete='CASCADE'), nullable=False) action = Column(String(50), nullable=False) # submitted|approved|rejected|published|archived approver = Column(String(200)) comment = Column(Text) created_at = Column(DateTime, default=datetime.utcnow, nullable=False) __table_args__ = ( Index('idx_legal_doc_approvals_version', 'version_id'), ) def __repr__(self): return f""