import enum
import uuid
from datetime import datetime, timezone
from sqlalchemy import BigInteger, Boolean, DateTime, Enum, ForeignKey, Integer, JSON, String, Text, UniqueConstraint
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.core.database import Base


def utcnow(): return datetime.now(timezone.utc)
def uid(): return str(uuid.uuid4())

class Role(str, enum.Enum):
    admin='admin'; director='director'; manager='manager'; user='user'; data_engineer='data_engineer'; data_steward='data_steward'; auditor='auditor'; viewer='viewer'
class DatabaseType(str, enum.Enum): oracle='oracle'; sqlserver='sqlserver'; mysql='mysql'; postgresql='postgresql'; api='api'
class JobStatus(str, enum.Enum): pending='pending'; running='running'; success='success'; failed='failed'

class Department(Base):
    __tablename__='departments'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); name: Mapped[str]=mapped_column(String(160),unique=True); code: Mapped[str]=mapped_column(String(50),unique=True); parent_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True); active: Mapped[bool]=mapped_column(Boolean,default=True)
class User(Base):
    __tablename__='users'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); email: Mapped[str]=mapped_column(String(255),unique=True,index=True); password_hash: Mapped[str]=mapped_column(String(255)); full_name: Mapped[str]=mapped_column(String(180),default=''); job_title: Mapped[str]=mapped_column(String(180),default=''); phone: Mapped[str]=mapped_column(String(50),default=''); avatar_url: Mapped[str]=mapped_column(String(500),default=''); locale: Mapped[str]=mapped_column(String(10),default='pt-BR'); timezone: Mapped[str]=mapped_column(String(60),default='America/Sao_Paulo'); role: Mapped[Role]=mapped_column(Enum(Role),default=Role.user); department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True,index=True); manager_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True,index=True); is_active: Mapped[bool]=mapped_column(Boolean,default=True); mfa_enabled: Mapped[bool]=mapped_column(Boolean,default=False); preferences: Mapped[dict]=mapped_column(JSON,default=dict); created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow); last_login_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
class Team(Base):
    __tablename__='teams'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); name: Mapped[str]=mapped_column(String(160)); department_id: Mapped[str]=mapped_column(ForeignKey('departments.id')); leader_id: Mapped[str]=mapped_column(ForeignKey('users.id')); description: Mapped[str]=mapped_column(Text,default=''); active: Mapped[bool]=mapped_column(Boolean,default=True)
class TeamMember(Base):
    __tablename__='team_members'; __table_args__=(UniqueConstraint('team_id','user_id'),); id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); team_id: Mapped[str]=mapped_column(ForeignKey('teams.id',ondelete='CASCADE')); user_id: Mapped[str]=mapped_column(ForeignKey('users.id',ondelete='CASCADE'))
class DataSource(Base):
    __tablename__='data_sources'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); name: Mapped[str]=mapped_column(String(120),unique=True); db_type: Mapped[DatabaseType]=mapped_column(Enum(DatabaseType)); host: Mapped[str]=mapped_column(String(255),default=''); port: Mapped[int]=mapped_column(Integer,default=0); database: Mapped[str]=mapped_column(String(255),default=''); username: Mapped[str]=mapped_column(String(255),default=''); encrypted_password: Mapped[str]=mapped_column(Text,default=''); options: Mapped[dict]=mapped_column(JSON,default=dict); enabled: Mapped[bool]=mapped_column(Boolean,default=True); department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True); created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow); datasets: Mapped[list['Dataset']]=relationship(back_populates='source')
class Dataset(Base):
    __tablename__='datasets'; __table_args__=(UniqueConstraint('source_id','name',name='uq_dataset_source_name'),); id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); source_id: Mapped[str]=mapped_column(ForeignKey('data_sources.id',ondelete='CASCADE')); name: Mapped[str]=mapped_column(String(180)); source_object: Mapped[str]=mapped_column(String(500)); extraction_mode: Mapped[str]=mapped_column(String(30),default='full'); incremental_column: Mapped[str|None]=mapped_column(String(255),nullable=True); watermark_value: Mapped[str|None]=mapped_column(String(500),nullable=True); schedule_cron: Mapped[str|None]=mapped_column(String(120),nullable=True); destination_zone: Mapped[str]=mapped_column(String(20),default='bronze'); enabled: Mapped[bool]=mapped_column(Boolean,default=True); sensitive_columns: Mapped[list]=mapped_column(JSON,default=list); masking_policy: Mapped[dict]=mapped_column(JSON,default=dict); owner_department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True); row_filter: Mapped[dict]=mapped_column(JSON,default=dict); allowed_roles: Mapped[list]=mapped_column(JSON,default=list); created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow); source: Mapped[DataSource]=relationship(back_populates='datasets')
class IngestionRun(Base):
    __tablename__='ingestion_runs'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True); status: Mapped[JobStatus]=mapped_column(Enum(JobStatus),default=JobStatus.pending); started_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True); finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True); row_count: Mapped[int]=mapped_column(Integer,default=0); object_key: Mapped[str|None]=mapped_column(String(1000),nullable=True); checksum: Mapped[str|None]=mapped_column(String(128),nullable=True); error_message: Mapped[str|None]=mapped_column(Text,nullable=True)
class Dashboard(Base):
    __tablename__='dashboards'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); name: Mapped[str]=mapped_column(String(180)); owner_id: Mapped[str]=mapped_column(ForeignKey('users.id')); department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True); layout: Mapped[dict]=mapped_column(JSON,default=dict); filters: Mapped[dict]=mapped_column(JSON,default=dict); is_shared: Mapped[bool]=mapped_column(Boolean,default=False); created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
class DashboardWidget(Base):
    __tablename__='dashboard_widgets'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); dashboard_id: Mapped[str]=mapped_column(ForeignKey('dashboards.id',ondelete='CASCADE')); title: Mapped[str]=mapped_column(String(180)); widget_type: Mapped[str]=mapped_column(String(50)); dataset_id: Mapped[str|None]=mapped_column(ForeignKey('datasets.id'),nullable=True); metric: Mapped[dict]=mapped_column(JSON,default=dict); visualization: Mapped[dict]=mapped_column(JSON,default=dict); position: Mapped[dict]=mapped_column(JSON,default=dict)
class Report(Base):
    __tablename__='reports'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); name: Mapped[str]=mapped_column(String(180)); owner_id: Mapped[str]=mapped_column(ForeignKey('users.id')); department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True); dataset_id: Mapped[str|None]=mapped_column(ForeignKey('datasets.id'),nullable=True); definition: Mapped[dict]=mapped_column(JSON,default=dict); format: Mapped[str]=mapped_column(String(20),default='pdf'); created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
class Automation(Base):
    __tablename__='automations'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); name: Mapped[str]=mapped_column(String(180)); owner_id: Mapped[str]=mapped_column(ForeignKey('users.id')); trigger_type: Mapped[str]=mapped_column(String(40)); trigger_config: Mapped[dict]=mapped_column(JSON,default=dict); action_type: Mapped[str]=mapped_column(String(40)); action_config: Mapped[dict]=mapped_column(JSON,default=dict); schedule_cron: Mapped[str|None]=mapped_column(String(120),nullable=True); enabled: Mapped[bool]=mapped_column(Boolean,default=True); last_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
class Message(Base):
    __tablename__='messages'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); sender_id: Mapped[str]=mapped_column(ForeignKey('users.id')); recipient_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True); team_id: Mapped[str|None]=mapped_column(ForeignKey('teams.id'),nullable=True); subject: Mapped[str]=mapped_column(String(250),default=''); body: Mapped[str]=mapped_column(Text); created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow); read_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
class ApiDefinition(Base):
    __tablename__='api_definitions'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); name: Mapped[str]=mapped_column(String(180)); direction: Mapped[str]=mapped_column(String(20),default='outbound'); base_url: Mapped[str]=mapped_column(String(800),default=''); specification: Mapped[dict]=mapped_column(JSON,default=dict); generated_routes: Mapped[list]=mapped_column(JSON,default=list); auth_type: Mapped[str]=mapped_column(String(30),default='none'); encrypted_auth: Mapped[str]=mapped_column(Text,default=''); owner_id: Mapped[str]=mapped_column(ForeignKey('users.id')); department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True); enabled: Mapped[bool]=mapped_column(Boolean,default=True); created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
class AIProvider(Base):
    __tablename__='ai_providers'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); name: Mapped[str]=mapped_column(String(100)); provider: Mapped[str]=mapped_column(String(30)); model: Mapped[str]=mapped_column(String(100)); encrypted_api_key: Mapped[str]=mapped_column(Text); endpoint: Mapped[str]=mapped_column(String(500),default=''); enabled: Mapped[bool]=mapped_column(Boolean,default=True); policy: Mapped[dict]=mapped_column(JSON,default=dict)
class AIConversation(Base):
    __tablename__='ai_conversations'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); user_id: Mapped[str]=mapped_column(ForeignKey('users.id')); provider_id: Mapped[str]=mapped_column(ForeignKey('ai_providers.id')); prompt: Mapped[str]=mapped_column(Text); sanitized_context: Mapped[dict]=mapped_column(JSON,default=dict); response: Mapped[str]=mapped_column(Text,default=''); status: Mapped[str]=mapped_column(String(30),default='pending'); created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
class AuditLog(Base):
    __tablename__='audit_logs'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); actor: Mapped[str]=mapped_column(String(255),index=True); action: Mapped[str]=mapped_column(String(120),index=True); entity_type: Mapped[str]=mapped_column(String(120)); entity_id: Mapped[str|None]=mapped_column(String(36),nullable=True); details: Mapped[dict]=mapped_column(JSON,default=dict); created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
class ApiTransaction(Base):
    __tablename__='api_transactions'; id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid); api_definition_id: Mapped[str]=mapped_column(ForeignKey('api_definitions.id',ondelete='CASCADE')); direction: Mapped[str]=mapped_column(String(20)); method: Mapped[str]=mapped_column(String(10)); path: Mapped[str]=mapped_column(String(800)); status_code: Mapped[int]=mapped_column(Integer,default=0); request_data: Mapped[dict]=mapped_column(JSON,default=dict); response_data: Mapped[dict]=mapped_column(JSON,default=dict); created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class PermissionEffect(str, enum.Enum): allow='allow'; deny='deny'
class AccessStatus(str, enum.Enum): pending='pending'; approved='approved'; rejected='rejected'; revoked='revoked'

class DatasetPermission(Base):
    __tablename__='dataset_permissions'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    subject_type: Mapped[str]=mapped_column(String(30))
    subject_id: Mapped[str]=mapped_column(String(100),index=True)
    actions: Mapped[list]=mapped_column(JSON,default=list)
    allowed_columns: Mapped[list]=mapped_column(JSON,default=list)
    denied_columns: Mapped[list]=mapped_column(JSON,default=list)
    row_filter: Mapped[dict]=mapped_column(JSON,default=dict)
    effect: Mapped[PermissionEffect]=mapped_column(Enum(PermissionEffect),default=PermissionEffect.allow)
    valid_from: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    valid_until: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class DataAccessRequest(Base):
    __tablename__='data_access_requests'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    requester_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id'),index=True)
    requested_actions: Mapped[list]=mapped_column(JSON,default=list)
    requested_columns: Mapped[list]=mapped_column(JSON,default=list)
    purpose: Mapped[str]=mapped_column(Text)
    status: Mapped[AccessStatus]=mapped_column(Enum(AccessStatus),default=AccessStatus.pending,index=True)
    reviewer_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    review_notes: Mapped[str]=mapped_column(Text,default='')
    expires_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    reviewed_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class DataCatalogEntry(Base):
    __tablename__='data_catalog_entries'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),unique=True,index=True)
    business_name: Mapped[str]=mapped_column(String(220),default='')
    description: Mapped[str]=mapped_column(Text,default='')
    owner_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    steward_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    domain: Mapped[str]=mapped_column(String(120),default='')
    classification: Mapped[str]=mapped_column(String(40),default='internal')
    tags: Mapped[list]=mapped_column(JSON,default=list)
    glossary_terms: Mapped[list]=mapped_column(JSON,default=list)
    retention_days: Mapped[int]=mapped_column(Integer,default=1825)
    quality_score: Mapped[int]=mapped_column(Integer,default=0)
    certified: Mapped[bool]=mapped_column(Boolean,default=False)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class DataLineage(Base):
    __tablename__='data_lineage'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    upstream_dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    downstream_dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    transformation: Mapped[dict]=mapped_column(JSON,default=dict)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class DataQualityRule(Base):
    __tablename__='data_quality_rules'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180))
    rule_type: Mapped[str]=mapped_column(String(50))
    column_name: Mapped[str|None]=mapped_column(String(255),nullable=True)
    config: Mapped[dict]=mapped_column(JSON,default=dict)
    severity: Mapped[str]=mapped_column(String(20),default='warning')
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    last_status: Mapped[str]=mapped_column(String(20),default='not_run')
    last_result: Mapped[dict]=mapped_column(JSON,default=dict)
    last_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class SavedQuery(Base):
    __tablename__='saved_queries'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180))
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id'),index=True)
    query_definition: Mapped[dict]=mapped_column(JSON,default=dict)
    shared_department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class Notification(Base):
    __tablename__='notifications'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    title: Mapped[str]=mapped_column(String(220))
    body: Mapped[str]=mapped_column(Text,default='')
    level: Mapped[str]=mapped_column(String(20),default='info')
    link: Mapped[str]=mapped_column(String(500),default='')
    read_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class ApiExecution(Base):
    __tablename__='api_executions'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    api_definition_id: Mapped[str]=mapped_column(ForeignKey('api_definitions.id',ondelete='CASCADE'),index=True)
    user_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    route: Mapped[str]=mapped_column(String(800))
    method: Mapped[str]=mapped_column(String(10))
    request_meta: Mapped[dict]=mapped_column(JSON,default=dict)
    response_status: Mapped[int]=mapped_column(Integer,default=0)
    duration_ms: Mapped[int]=mapped_column(Integer,default=0)
    success: Mapped[bool]=mapped_column(Boolean,default=False)
    error: Mapped[str]=mapped_column(Text,default='')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class DashboardRevision(Base):
    __tablename__='dashboard_revisions'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    dashboard_id: Mapped[str]=mapped_column(ForeignKey('dashboards.id',ondelete='CASCADE'),index=True)
    version: Mapped[int]=mapped_column(Integer,default=1)
    snapshot: Mapped[dict]=mapped_column(JSON,default=dict)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class CalculatedField(Base):
    __tablename__='calculated_fields'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    name: Mapped[str]=mapped_column(String(160))
    expression: Mapped[str]=mapped_column(Text)
    result_type: Mapped[str]=mapped_column(String(30),default='number')
    shared_department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class ReportSchedule(Base):
    __tablename__='report_schedules'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    report_id: Mapped[str]=mapped_column(ForeignKey('reports.id',ondelete='CASCADE'),index=True)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    cron: Mapped[str]=mapped_column(String(120))
    timezone: Mapped[str]=mapped_column(String(80),default='America/Sao_Paulo')
    formats: Mapped[list]=mapped_column(JSON,default=list)
    recipients: Mapped[list]=mapped_column(JSON,default=list)
    subject_template: Mapped[str]=mapped_column(String(300),default='Relatório {{report_name}}')
    body_template: Mapped[str]=mapped_column(Text,default='Segue o relatório agendado.')
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    last_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    next_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class ReportDelivery(Base):
    __tablename__='report_deliveries'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    schedule_id: Mapped[str]=mapped_column(ForeignKey('report_schedules.id',ondelete='CASCADE'),index=True)
    status: Mapped[str]=mapped_column(String(30),default='queued')
    formats: Mapped[list]=mapped_column(JSON,default=list)
    recipients: Mapped[list]=mapped_column(JSON,default=list)
    object_keys: Mapped[list]=mapped_column(JSON,default=list)
    error: Mapped[str]=mapped_column(Text,default='')
    started_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class IntegrationFlow(Base):
    __tablename__='integration_flows'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180))
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True,index=True)
    api_definition_id: Mapped[str]=mapped_column(ForeignKey('api_definitions.id',ondelete='CASCADE'),index=True)
    auth_config: Mapped[dict]=mapped_column(JSON,default=dict)
    request_mapping: Mapped[dict]=mapped_column(JSON,default=dict)
    response_mapping: Mapped[dict]=mapped_column(JSON,default=dict)
    transformations: Mapped[list]=mapped_column(JSON,default=list)
    retry_policy: Mapped[dict]=mapped_column(JSON,default=dict)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class SecureDownload(Base):
    __tablename__='secure_downloads'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    token_hash: Mapped[str]=mapped_column(String(128),unique=True,index=True)
    object_key: Mapped[str]=mapped_column(String(1000))
    filename: Mapped[str]=mapped_column(String(300))
    media_type: Mapped[str]=mapped_column(String(150),default='application/octet-stream')
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    expires_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),index=True)
    max_downloads: Mapped[int]=mapped_column(Integer,default=1)
    download_count: Mapped[int]=mapped_column(Integer,default=0)
    revoked: Mapped[bool]=mapped_column(Boolean,default=False)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class WorkflowDefinition(Base):
    __tablename__='workflow_definitions'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180),index=True)
    description: Mapped[str]=mapped_column(Text,default='')
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True,index=True)
    version: Mapped[int]=mapped_column(Integer,default=1)
    status: Mapped[str]=mapped_column(String(30),default='draft')
    definition: Mapped[dict]=mapped_column(JSON,default=dict)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class WorkflowInstance(Base):
    __tablename__='workflow_instances'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    workflow_id: Mapped[str]=mapped_column(ForeignKey('workflow_definitions.id',ondelete='CASCADE'),index=True)
    started_by: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    status: Mapped[str]=mapped_column(String(30),default='running',index=True)
    current_node_id: Mapped[str|None]=mapped_column(String(100),nullable=True)
    context: Mapped[dict]=mapped_column(JSON,default=dict)
    started_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class WorkflowTask(Base):
    __tablename__='workflow_tasks'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    instance_id: Mapped[str]=mapped_column(ForeignKey('workflow_instances.id',ondelete='CASCADE'),index=True)
    node_id: Mapped[str]=mapped_column(String(100),index=True)
    title: Mapped[str]=mapped_column(String(220))
    assignee_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True,index=True)
    assignee_role: Mapped[str|None]=mapped_column(String(50),nullable=True)
    assignee_department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True)
    status: Mapped[str]=mapped_column(String(30),default='open',index=True)
    form_schema: Mapped[dict]=mapped_column(JSON,default=dict)
    result: Mapped[dict]=mapped_column(JSON,default=dict)
    due_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True,index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    completed_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class WorkflowEvent(Base):
    __tablename__='workflow_events'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    instance_id: Mapped[str]=mapped_column(ForeignKey('workflow_instances.id',ondelete='CASCADE'),index=True)
    node_id: Mapped[str|None]=mapped_column(String(100),nullable=True)
    event_type: Mapped[str]=mapped_column(String(80),index=True)
    actor_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    payload: Mapped[dict]=mapped_column(JSON,default=dict)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class AlertRule(Base):
    __tablename__='alert_rules'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180))
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True,index=True)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id'),index=True)
    query_definition: Mapped[dict]=mapped_column(JSON,default=dict)
    operator: Mapped[str]=mapped_column(String(20),default='lt')
    threshold: Mapped[str]=mapped_column(String(100),default='0')
    severity: Mapped[str]=mapped_column(String(20),default='warning')
    channels: Mapped[list]=mapped_column(JSON,default=list)
    recipients: Mapped[list]=mapped_column(JSON,default=list)
    cooldown_minutes: Mapped[int]=mapped_column(Integer,default=60)
    schedule_cron: Mapped[str]=mapped_column(String(120),default='*/15 * * * *')
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    last_value: Mapped[str|None]=mapped_column(String(200),nullable=True)
    last_triggered_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class AlertEvent(Base):
    __tablename__='alert_events'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    rule_id: Mapped[str]=mapped_column(ForeignKey('alert_rules.id',ondelete='CASCADE'),index=True)
    status: Mapped[str]=mapped_column(String(30),default='triggered')
    value: Mapped[str]=mapped_column(String(200),default='')
    message: Mapped[str]=mapped_column(Text,default='')
    delivery_results: Mapped[dict]=mapped_column(JSON,default=dict)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class ApiCredential(Base):
    __tablename__='api_credentials'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    api_definition_id: Mapped[str]=mapped_column(ForeignKey('api_definitions.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(160))
    auth_type: Mapped[str]=mapped_column(String(40))
    encrypted_config: Mapped[str]=mapped_column(Text,default='')
    active: Mapped[bool]=mapped_column(Boolean,default=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class EnterpriseAIProvider(Base):
    __tablename__='ai_providers_v008'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180),unique=True)
    provider_type: Mapped[str]=mapped_column(String(40),index=True)
    base_url: Mapped[str]=mapped_column(String(800),default='')
    model_name: Mapped[str]=mapped_column(String(180),default='')
    encrypted_config: Mapped[str]=mapped_column(Text,default='')
    is_local: Mapped[bool]=mapped_column(Boolean,default=False)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class AIPolicy(Base):
    __tablename__='ai_policies_v008'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180),unique=True)
    department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True,index=True)
    allowed_provider_ids: Mapped[list]=mapped_column(JSON,default=list)
    allowed_roles: Mapped[list]=mapped_column(JSON,default=list)
    max_context_chars: Mapped[int]=mapped_column(Integer,default=30000)
    max_output_tokens: Mapped[int]=mapped_column(Integer,default=1200)
    allow_external: Mapped[bool]=mapped_column(Boolean,default=False)
    require_approved_prompt: Mapped[bool]=mapped_column(Boolean,default=True)
    redact_patterns: Mapped[list]=mapped_column(JSON,default=list)
    system_rules: Mapped[str]=mapped_column(Text,default='')
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class KnowledgeBase(Base):
    __tablename__='knowledge_bases_v008'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180),index=True)
    description: Mapped[str]=mapped_column(Text,default='')
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True,index=True)
    classification: Mapped[str]=mapped_column(String(40),default='internal')
    allowed_roles: Mapped[list]=mapped_column(JSON,default=list)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class KnowledgeDocument(Base):
    __tablename__='knowledge_documents_v008'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    knowledge_base_id: Mapped[str]=mapped_column(ForeignKey('knowledge_bases_v008.id',ondelete='CASCADE'),index=True)
    title: Mapped[str]=mapped_column(String(300))
    source_type: Mapped[str]=mapped_column(String(40),default='text')
    source_uri: Mapped[str]=mapped_column(String(1000),default='')
    content_hash: Mapped[str]=mapped_column(String(128),index=True)
    status: Mapped[str]=mapped_column(String(30),default='ready')
    metadata_json: Mapped[dict]=mapped_column(JSON,default=dict)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class KnowledgeChunk(Base):
    __tablename__='knowledge_chunks_v008'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    document_id: Mapped[str]=mapped_column(ForeignKey('knowledge_documents_v008.id',ondelete='CASCADE'),index=True)
    chunk_index: Mapped[int]=mapped_column(Integer)
    content: Mapped[str]=mapped_column(Text)
    embedding: Mapped[list]=mapped_column(JSON,default=list)
    token_estimate: Mapped[int]=mapped_column(Integer,default=0)
    metadata_json: Mapped[dict]=mapped_column(JSON,default=dict)

class PromptTemplate(Base):
    __tablename__='prompt_templates_v008'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180),index=True)
    description: Mapped[str]=mapped_column(Text,default='')
    template: Mapped[str]=mapped_column(Text)
    variables: Mapped[list]=mapped_column(JSON,default=list)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True,index=True)
    status: Mapped[str]=mapped_column(String(30),default='draft')
    version: Mapped[int]=mapped_column(Integer,default=1)
    approved_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    approved_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class EnterpriseAIConversation(Base):
    __tablename__='ai_conversations_v008'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    title: Mapped[str]=mapped_column(String(240),default='Nova conversa')
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True,index=True)
    provider_id: Mapped[str]=mapped_column(ForeignKey('ai_providers_v008.id'))
    knowledge_base_ids: Mapped[list]=mapped_column(JSON,default=list)
    prompt_template_id: Mapped[str|None]=mapped_column(ForeignKey('prompt_templates_v008.id'),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class AIMessage(Base):
    __tablename__='ai_messages_v008'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    conversation_id: Mapped[str]=mapped_column(ForeignKey('ai_conversations_v008.id',ondelete='CASCADE'),index=True)
    role: Mapped[str]=mapped_column(String(30))
    content: Mapped[str]=mapped_column(Text)
    citations: Mapped[list]=mapped_column(JSON,default=list)
    safety_flags: Mapped[list]=mapped_column(JSON,default=list)
    prompt_tokens: Mapped[int]=mapped_column(Integer,default=0)
    completion_tokens: Mapped[int]=mapped_column(Integer,default=0)
    latency_ms: Mapped[int]=mapped_column(Integer,default=0)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class AIAuditEvent(Base):
    __tablename__='ai_audit_events_v008'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    conversation_id: Mapped[str|None]=mapped_column(ForeignKey('ai_conversations_v008.id'),nullable=True,index=True)
    action: Mapped[str]=mapped_column(String(80),index=True)
    provider_id: Mapped[str|None]=mapped_column(ForeignKey('ai_providers_v008.id'),nullable=True)
    external_transfer: Mapped[bool]=mapped_column(Boolean,default=False)
    context_chars: Mapped[int]=mapped_column(Integer,default=0)
    details: Mapped[dict]=mapped_column(JSON,default=dict)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class CommunicationChannel(Base):
    __tablename__='communication_channels_v009'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180),index=True)
    description: Mapped[str]=mapped_column(Text,default='')
    channel_type: Mapped[str]=mapped_column(String(30),default='channel',index=True)
    visibility: Mapped[str]=mapped_column(String(30),default='private')
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True,index=True)
    team_id: Mapped[str|None]=mapped_column(ForeignKey('teams.id'),nullable=True,index=True)
    archived: Mapped[bool]=mapped_column(Boolean,default=False)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class ChannelMember(Base):
    __tablename__='channel_members_v009'
    __table_args__=(UniqueConstraint('channel_id','user_id',name='uq_channel_member_v009'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    channel_id: Mapped[str]=mapped_column(ForeignKey('communication_channels_v009.id',ondelete='CASCADE'),index=True)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id',ondelete='CASCADE'),index=True)
    member_role: Mapped[str]=mapped_column(String(30),default='member')
    muted: Mapped[bool]=mapped_column(Boolean,default=False)
    last_read_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    joined_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class ChannelMessage(Base):
    __tablename__='channel_messages_v009'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    channel_id: Mapped[str]=mapped_column(ForeignKey('communication_channels_v009.id',ondelete='CASCADE'),index=True)
    sender_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    parent_message_id: Mapped[str|None]=mapped_column(ForeignKey('channel_messages_v009.id'),nullable=True,index=True)
    content: Mapped[str]=mapped_column(Text)
    mentions: Mapped[list]=mapped_column(JSON,default=list)
    attachments: Mapped[list]=mapped_column(JSON,default=list)
    edited_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    deleted_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class MessageReaction(Base):
    __tablename__='message_reactions_v009'
    __table_args__=(UniqueConstraint('message_id','user_id','emoji',name='uq_message_reaction_v009'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    message_id: Mapped[str]=mapped_column(ForeignKey('channel_messages_v009.id',ondelete='CASCADE'),index=True)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id',ondelete='CASCADE'),index=True)
    emoji: Mapped[str]=mapped_column(String(40))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class ContextComment(Base):
    __tablename__='context_comments_v009'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    target_type: Mapped[str]=mapped_column(String(40),index=True)
    target_id: Mapped[str]=mapped_column(String(36),index=True)
    author_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    parent_id: Mapped[str|None]=mapped_column(ForeignKey('context_comments_v009.id'),nullable=True)
    content: Mapped[str]=mapped_column(Text)
    mentions: Mapped[list]=mapped_column(JSON,default=list)
    resolved: Mapped[bool]=mapped_column(Boolean,default=False)
    resolved_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    resolved_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class UserPresence(Base):
    __tablename__='user_presence_v009'
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id',ondelete='CASCADE'),primary_key=True)
    status: Mapped[str]=mapped_column(String(30),default='offline',index=True)
    custom_message: Mapped[str]=mapped_column(String(240),default='')
    last_seen_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class CommunicationAttachment(Base):
    __tablename__='communication_attachments_v009'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    uploaded_by: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    object_key: Mapped[str]=mapped_column(String(1000),unique=True)
    filename: Mapped[str]=mapped_column(String(300))
    media_type: Mapped[str]=mapped_column(String(150),default='application/octet-stream')
    size_bytes: Mapped[int]=mapped_column(Integer,default=0)
    sha256: Mapped[str]=mapped_column(String(128),index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

# V010 - Mobile, PWA, push and offline synchronization
class MobileDevice(Base):
    __tablename__='mobile_devices_v010'
    __table_args__=(UniqueConstraint('user_id','device_key',name='uq_mobile_device_user_key_v010'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id',ondelete='CASCADE'),index=True)
    device_key: Mapped[str]=mapped_column(String(180),index=True)
    platform: Mapped[str]=mapped_column(String(30),default='pwa')
    device_name: Mapped[str]=mapped_column(String(180),default='')
    app_version: Mapped[str]=mapped_column(String(30),default='1.0.0')
    locale: Mapped[str]=mapped_column(String(20),default='pt-BR')
    timezone: Mapped[str]=mapped_column(String(80),default='America/Sao_Paulo')
    capabilities: Mapped[dict]=mapped_column(JSON,default=dict)
    active: Mapped[bool]=mapped_column(Boolean,default=True)
    last_seen_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class PushSubscription(Base):
    __tablename__='push_subscriptions_v010'
    __table_args__=(UniqueConstraint('endpoint_hash',name='uq_push_endpoint_hash_v010'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id',ondelete='CASCADE'),index=True)
    device_id: Mapped[str|None]=mapped_column(ForeignKey('mobile_devices_v010.id',ondelete='CASCADE'),nullable=True,index=True)
    endpoint_hash: Mapped[str]=mapped_column(String(128),index=True)
    encrypted_subscription: Mapped[str]=mapped_column(Text)
    content_encoding: Mapped[str]=mapped_column(String(30),default='aes128gcm')
    active: Mapped[bool]=mapped_column(Boolean,default=True)
    failure_count: Mapped[int]=mapped_column(Integer,default=0)
    last_success_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    last_failure_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class MobileNotificationPreference(Base):
    __tablename__='mobile_notification_preferences_v010'
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id',ondelete='CASCADE'),primary_key=True)
    push_enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    mentions: Mapped[bool]=mapped_column(Boolean,default=True)
    direct_messages: Mapped[bool]=mapped_column(Boolean,default=True)
    workflow_tasks: Mapped[bool]=mapped_column(Boolean,default=True)
    alerts: Mapped[bool]=mapped_column(Boolean,default=True)
    reports: Mapped[bool]=mapped_column(Boolean,default=True)
    quiet_hours_start: Mapped[str]=mapped_column(String(5),default='22:00')
    quiet_hours_end: Mapped[str]=mapped_column(String(5),default='07:00')
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class OfflineSyncOperation(Base):
    __tablename__='offline_sync_operations_v010'
    __table_args__=(UniqueConstraint('user_id','client_operation_id',name='uq_offline_operation_v010'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id',ondelete='CASCADE'),index=True)
    device_id: Mapped[str|None]=mapped_column(ForeignKey('mobile_devices_v010.id',ondelete='SET NULL'),nullable=True,index=True)
    client_operation_id: Mapped[str]=mapped_column(String(100),index=True)
    operation_type: Mapped[str]=mapped_column(String(60),index=True)
    payload: Mapped[dict]=mapped_column(JSON,default=dict)
    status: Mapped[str]=mapped_column(String(30),default='received',index=True)
    result: Mapped[dict]=mapped_column(JSON,default=dict)
    error: Mapped[str]=mapped_column(Text,default='')
    client_created_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    processed_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class MobileSyncCursor(Base):
    __tablename__='mobile_sync_cursors_v010'
    __table_args__=(UniqueConstraint('user_id','device_id','resource_type',name='uq_mobile_sync_cursor_v010'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id',ondelete='CASCADE'),index=True)
    device_id: Mapped[str]=mapped_column(ForeignKey('mobile_devices_v010.id',ondelete='CASCADE'),index=True)
    resource_type: Mapped[str]=mapped_column(String(60),index=True)
    cursor_value: Mapped[str]=mapped_column(String(200),default='')
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class PushDelivery(Base):
    __tablename__='push_deliveries_v010'
    __table_args__=(UniqueConstraint('notification_id','subscription_id',name='uq_push_delivery_v010'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    notification_id: Mapped[str]=mapped_column(ForeignKey('notifications.id',ondelete='CASCADE'),index=True)
    subscription_id: Mapped[str]=mapped_column(ForeignKey('push_subscriptions_v010.id',ondelete='CASCADE'),index=True)
    status: Mapped[str]=mapped_column(String(30),default='pending',index=True)
    attempts: Mapped[int]=mapped_column(Integer,default=0)
    response_code: Mapped[int]=mapped_column(Integer,default=0)
    error: Mapped[str]=mapped_column(Text,default='')
    delivered_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class MasterEntity(Base):
    __tablename__='master_entities_v011'
    __table_args__=(UniqueConstraint('entity_type','master_code',name='uq_mdm_type_code'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    entity_type: Mapped[str]=mapped_column(String(40),index=True)
    master_code: Mapped[str]=mapped_column(String(80),index=True)
    legal_name: Mapped[str]=mapped_column(String(300),default='')
    display_name: Mapped[str]=mapped_column(String(300),default='')
    tax_id: Mapped[str]=mapped_column(String(80),default='',index=True)
    country_code: Mapped[str]=mapped_column(String(3),default='BRA')
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    lifecycle_status: Mapped[str]=mapped_column(String(30),default='active')
    department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True,index=True)
    steward_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True,index=True)
    golden_data: Mapped[dict]=mapped_column(JSON,default=dict)
    quality_score: Mapped[int]=mapped_column(Integer,default=0)
    source_count: Mapped[int]=mapped_column(Integer,default=0)
    approved_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    approved_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class MasterSourceRecord(Base):
    __tablename__='master_source_records_v011'
    __table_args__=(UniqueConstraint('source_system','source_key',name='uq_mdm_source_key'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    master_entity_id: Mapped[str|None]=mapped_column(ForeignKey('master_entities_v011.id',ondelete='SET NULL'),nullable=True,index=True)
    entity_type: Mapped[str]=mapped_column(String(40),index=True)
    source_system: Mapped[str]=mapped_column(String(120),index=True)
    source_key: Mapped[str]=mapped_column(String(200),index=True)
    source_data: Mapped[dict]=mapped_column(JSON,default=dict)
    normalized_data: Mapped[dict]=mapped_column(JSON,default=dict)
    source_priority: Mapped[int]=mapped_column(Integer,default=100)
    active: Mapped[bool]=mapped_column(Boolean,default=True)
    last_seen_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class MatchRule(Base):
    __tablename__='match_rules_v011'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180))
    entity_type: Mapped[str]=mapped_column(String(40),index=True)
    fields: Mapped[list]=mapped_column(JSON,default=list)
    weights: Mapped[dict]=mapped_column(JSON,default=dict)
    exact_fields: Mapped[list]=mapped_column(JSON,default=list)
    threshold: Mapped[int]=mapped_column(Integer,default=85)
    auto_merge_threshold: Mapped[int]=mapped_column(Integer,default=98)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class DuplicateCandidate(Base):
    __tablename__='duplicate_candidates_v011'
    __table_args__=(UniqueConstraint('left_entity_id','right_entity_id',name='uq_mdm_duplicate_pair'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    entity_type: Mapped[str]=mapped_column(String(40),index=True)
    left_entity_id: Mapped[str]=mapped_column(ForeignKey('master_entities_v011.id',ondelete='CASCADE'),index=True)
    right_entity_id: Mapped[str]=mapped_column(ForeignKey('master_entities_v011.id',ondelete='CASCADE'),index=True)
    rule_id: Mapped[str|None]=mapped_column(ForeignKey('match_rules_v011.id'),nullable=True)
    score: Mapped[int]=mapped_column(Integer,default=0,index=True)
    evidence: Mapped[dict]=mapped_column(JSON,default=dict)
    status: Mapped[str]=mapped_column(String(30),default='pending',index=True)
    reviewed_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    reviewed_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class SurvivorshipRule(Base):
    __tablename__='survivorship_rules_v011'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    entity_type: Mapped[str]=mapped_column(String(40),index=True)
    field_name: Mapped[str]=mapped_column(String(120),index=True)
    strategy: Mapped[str]=mapped_column(String(40),default='source_priority')
    source_order: Mapped[list]=mapped_column(JSON,default=list)
    required: Mapped[bool]=mapped_column(Boolean,default=False)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))

class MasterChangeRequest(Base):
    __tablename__='master_change_requests_v011'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    master_entity_id: Mapped[str]=mapped_column(ForeignKey('master_entities_v011.id',ondelete='CASCADE'),index=True)
    requested_by: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    change_type: Mapped[str]=mapped_column(String(40),default='update')
    proposed_data: Mapped[dict]=mapped_column(JSON,default=dict)
    reason: Mapped[str]=mapped_column(Text,default='')
    status: Mapped[str]=mapped_column(String(30),default='pending',index=True)
    reviewed_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    reviewed_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class MasterAuditEvent(Base):
    __tablename__='master_audit_events_v011'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    master_entity_id: Mapped[str|None]=mapped_column(ForeignKey('master_entities_v011.id',ondelete='SET NULL'),nullable=True,index=True)
    actor_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    action: Mapped[str]=mapped_column(String(80),index=True)
    before_data: Mapped[dict]=mapped_column(JSON,default=dict)
    after_data: Mapped[dict]=mapped_column(JSON,default=dict)
    details: Mapped[dict]=mapped_column(JSON,default=dict)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

# V012 - Enterprise Data Quality
class QualityProfile(Base):
    __tablename__='quality_profiles_v012'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    run_id: Mapped[str|None]=mapped_column(ForeignKey('ingestion_runs.id',ondelete='SET NULL'),nullable=True,index=True)
    row_count: Mapped[int]=mapped_column(Integer,default=0)
    column_count: Mapped[int]=mapped_column(Integer,default=0)
    profile: Mapped[dict]=mapped_column(JSON,default=dict)
    anomaly_summary: Mapped[dict]=mapped_column(JSON,default=dict)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class EnterpriseQualityRule(Base):
    __tablename__='enterprise_quality_rules_v012'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180))
    description: Mapped[str]=mapped_column(Text,default='')
    dimension: Mapped[str]=mapped_column(String(40),default='validity',index=True)
    rule_type: Mapped[str]=mapped_column(String(60),index=True)
    column_name: Mapped[str|None]=mapped_column(String(255),nullable=True)
    config: Mapped[dict]=mapped_column(JSON,default=dict)
    severity: Mapped[str]=mapped_column(String(20),default='warning',index=True)
    weight: Mapped[int]=mapped_column(Integer,default=10)
    schedule_cron: Mapped[str|None]=mapped_column(String(120),nullable=True)
    quarantine_on_failure: Mapped[bool]=mapped_column(Boolean,default=False)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'))
    last_status: Mapped[str]=mapped_column(String(30),default='not_run')
    last_score: Mapped[int]=mapped_column(Integer,default=0)
    last_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class QualityRun(Base):
    __tablename__='quality_runs_v012'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    trigger_type: Mapped[str]=mapped_column(String(30),default='manual')
    status: Mapped[str]=mapped_column(String(30),default='running',index=True)
    overall_score: Mapped[int]=mapped_column(Integer,default=0)
    dimension_scores: Mapped[dict]=mapped_column(JSON,default=dict)
    total_rules: Mapped[int]=mapped_column(Integer,default=0)
    passed_rules: Mapped[int]=mapped_column(Integer,default=0)
    failed_rules: Mapped[int]=mapped_column(Integer,default=0)
    error: Mapped[str]=mapped_column(Text,default='')
    initiated_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    started_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class QualityResult(Base):
    __tablename__='quality_results_v012'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    quality_run_id: Mapped[str]=mapped_column(ForeignKey('quality_runs_v012.id',ondelete='CASCADE'),index=True)
    rule_id: Mapped[str]=mapped_column(ForeignKey('enterprise_quality_rules_v012.id',ondelete='CASCADE'),index=True)
    status: Mapped[str]=mapped_column(String(30),index=True)
    score: Mapped[int]=mapped_column(Integer,default=0)
    checked_rows: Mapped[int]=mapped_column(Integer,default=0)
    failed_rows: Mapped[int]=mapped_column(Integer,default=0)
    failure_rate: Mapped[int]=mapped_column(Integer,default=0)
    sample_failures: Mapped[list]=mapped_column(JSON,default=list)
    metrics: Mapped[dict]=mapped_column(JSON,default=dict)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class QualityIncident(Base):
    __tablename__='quality_incidents_v012'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    quality_run_id: Mapped[str|None]=mapped_column(ForeignKey('quality_runs_v012.id',ondelete='SET NULL'),nullable=True,index=True)
    rule_id: Mapped[str|None]=mapped_column(ForeignKey('enterprise_quality_rules_v012.id',ondelete='SET NULL'),nullable=True)
    title: Mapped[str]=mapped_column(String(250))
    description: Mapped[str]=mapped_column(Text,default='')
    severity: Mapped[str]=mapped_column(String(20),default='warning',index=True)
    status: Mapped[str]=mapped_column(String(30),default='open',index=True)
    owner_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True,index=True)
    due_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    resolution: Mapped[str]=mapped_column(Text,default='')
    resolved_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    resolved_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class QuarantineRecord(Base):
    __tablename__='quality_quarantine_v012'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    quality_run_id: Mapped[str]=mapped_column(ForeignKey('quality_runs_v012.id',ondelete='CASCADE'),index=True)
    rule_id: Mapped[str]=mapped_column(ForeignKey('enterprise_quality_rules_v012.id',ondelete='CASCADE'))
    row_reference: Mapped[str]=mapped_column(String(300),default='')
    row_data: Mapped[dict]=mapped_column(JSON,default=dict)
    reason: Mapped[str]=mapped_column(Text,default='')
    status: Mapped[str]=mapped_column(String(30),default='quarantined',index=True)
    released_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    released_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class RemediationPlan(Base):
    __tablename__='quality_remediation_plans_v012'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    incident_id: Mapped[str]=mapped_column(ForeignKey('quality_incidents_v012.id',ondelete='CASCADE'),index=True)
    title: Mapped[str]=mapped_column(String(250))
    actions: Mapped[list]=mapped_column(JSON,default=list)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'))
    status: Mapped[str]=mapped_column(String(30),default='planned')
    target_date: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    progress: Mapped[int]=mapped_column(Integer,default=0)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class ServiceHealthSnapshot(Base):
    __tablename__='service_health_snapshots_v013'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    service_name: Mapped[str]=mapped_column(String(100),index=True)
    status: Mapped[str]=mapped_column(String(30),default='unknown',index=True)
    latency_ms: Mapped[int]=mapped_column(Integer,default=0)
    details: Mapped[dict]=mapped_column(JSON,default=dict)
    checked_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class OperationalIncident(Base):
    __tablename__='operational_incidents_v013'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    title: Mapped[str]=mapped_column(String(250))
    description: Mapped[str]=mapped_column(Text,default='')
    source: Mapped[str]=mapped_column(String(100),default='platform',index=True)
    severity: Mapped[str]=mapped_column(String(20),default='warning',index=True)
    status: Mapped[str]=mapped_column(String(30),default='open',index=True)
    fingerprint: Mapped[str]=mapped_column(String(128),default='',index=True)
    owner_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True,index=True)
    evidence: Mapped[dict]=mapped_column(JSON,default=dict)
    resolution: Mapped[str]=mapped_column(Text,default='')
    opened_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    acknowledged_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    resolved_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class ObservabilityAlertPolicy(Base):
    __tablename__='observability_alert_policies_v013'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180),unique=True)
    metric_name: Mapped[str]=mapped_column(String(180),index=True)
    operator: Mapped[str]=mapped_column(String(10),default='gt')
    threshold: Mapped[int]=mapped_column(Integer,default=0)
    window_minutes: Mapped[int]=mapped_column(Integer,default=5)
    severity: Mapped[str]=mapped_column(String(20),default='warning')
    cooldown_minutes: Mapped[int]=mapped_column(Integer,default=30)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    channels: Mapped[list]=mapped_column(JSON,default=list)
    last_triggered_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class OperationalLogEvent(Base):
    __tablename__='operational_log_events_v013'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    level: Mapped[str]=mapped_column(String(20),default='INFO',index=True)
    service: Mapped[str]=mapped_column(String(100),default='api',index=True)
    event_name: Mapped[str]=mapped_column(String(160),index=True)
    message: Mapped[str]=mapped_column(Text,default='')
    trace_id: Mapped[str]=mapped_column(String(64),default='',index=True)
    request_id: Mapped[str]=mapped_column(String(64),default='',index=True)
    user_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True,index=True)
    attributes: Mapped[dict]=mapped_column(JSON,default=dict)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

# V014 - High Availability, Cluster and Disaster Recovery
class ClusterNode(Base):
    __tablename__='cluster_nodes_v014'
    __table_args__=(UniqueConstraint('node_name','node_type',name='uq_cluster_node_name_type'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    node_name: Mapped[str]=mapped_column(String(160),index=True)
    node_type: Mapped[str]=mapped_column(String(40),default='api',index=True)
    region: Mapped[str]=mapped_column(String(80),default='primary')
    zone: Mapped[str]=mapped_column(String(80),default='zone-a')
    address: Mapped[str]=mapped_column(String(500),default='')
    version: Mapped[str]=mapped_column(String(40),default='0.14.0')
    status: Mapped[str]=mapped_column(String(30),default='starting',index=True)
    role: Mapped[str]=mapped_column(String(30),default='follower',index=True)
    capabilities: Mapped[list]=mapped_column(JSON,default=list)
    metadata_json: Mapped[dict]=mapped_column(JSON,default=dict)
    last_heartbeat_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    started_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class ClusterLease(Base):
    __tablename__='cluster_leases_v014'
    name: Mapped[str]=mapped_column(String(160),primary_key=True)
    holder_node_id: Mapped[str|None]=mapped_column(ForeignKey('cluster_nodes_v014.id',ondelete='SET NULL'),nullable=True,index=True)
    fencing_token: Mapped[int]=mapped_column(Integer,default=0)
    acquired_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    expires_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True,index=True)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class FailoverEvent(Base):
    __tablename__='failover_events_v014'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    component: Mapped[str]=mapped_column(String(100),index=True)
    event_type: Mapped[str]=mapped_column(String(60),index=True)
    from_node_id: Mapped[str|None]=mapped_column(ForeignKey('cluster_nodes_v014.id',ondelete='SET NULL'),nullable=True)
    to_node_id: Mapped[str|None]=mapped_column(ForeignKey('cluster_nodes_v014.id',ondelete='SET NULL'),nullable=True)
    reason: Mapped[str]=mapped_column(Text,default='')
    status: Mapped[str]=mapped_column(String(30),default='completed',index=True)
    evidence: Mapped[dict]=mapped_column(JSON,default=dict)
    initiated_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class BackupPolicy(Base):
    __tablename__='backup_policies_v014'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180),unique=True)
    resource_type: Mapped[str]=mapped_column(String(50),default='metadata_database',index=True)
    schedule_cron: Mapped[str]=mapped_column(String(120),default='0 2 * * *')
    retention_days: Mapped[int]=mapped_column(Integer,default=30)
    backup_type: Mapped[str]=mapped_column(String(30),default='logical')
    destination_prefix: Mapped[str]=mapped_column(String(500),default='backups/v014')
    encryption_required: Mapped[bool]=mapped_column(Boolean,default=True)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    last_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    next_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class BackupRun(Base):
    __tablename__='backup_runs_v014'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    policy_id: Mapped[str]=mapped_column(ForeignKey('backup_policies_v014.id',ondelete='CASCADE'),index=True)
    status: Mapped[str]=mapped_column(String(30),default='queued',index=True)
    object_key: Mapped[str]=mapped_column(String(1000),default='')
    checksum: Mapped[str]=mapped_column(String(128),default='')
    size_bytes: Mapped[int]=mapped_column(Integer,default=0)
    encryption: Mapped[str]=mapped_column(String(80),default='fernet')
    error: Mapped[str]=mapped_column(Text,default='')
    triggered_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    started_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class DisasterRecoveryPlan(Base):
    __tablename__='disaster_recovery_plans_v014'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180),unique=True)
    scope: Mapped[str]=mapped_column(String(100),default='platform')
    rpo_minutes: Mapped[int]=mapped_column(Integer,default=60)
    rto_minutes: Mapped[int]=mapped_column(Integer,default=240)
    primary_region: Mapped[str]=mapped_column(String(80),default='primary')
    recovery_region: Mapped[str]=mapped_column(String(80),default='dr')
    runbook: Mapped[list]=mapped_column(JSON,default=list)
    validation_checks: Mapped[list]=mapped_column(JSON,default=list)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'))
    status: Mapped[str]=mapped_column(String(30),default='draft')
    approved_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    approved_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class DisasterRecoveryDrill(Base):
    __tablename__='disaster_recovery_drills_v014'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    plan_id: Mapped[str]=mapped_column(ForeignKey('disaster_recovery_plans_v014.id',ondelete='CASCADE'),index=True)
    status: Mapped[str]=mapped_column(String(30),default='planned',index=True)
    scenario: Mapped[str]=mapped_column(Text,default='')
    results: Mapped[dict]=mapped_column(JSON,default=dict)
    measured_rpo_minutes: Mapped[int|None]=mapped_column(Integer,nullable=True)
    measured_rto_minutes: Mapped[int|None]=mapped_column(Integer,nullable=True)
    passed: Mapped[bool|None]=mapped_column(Boolean,nullable=True)
    executed_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    scheduled_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    started_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class BusinessTerm(Base):
    __tablename__='business_terms_v015'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180),unique=True,index=True)
    definition: Mapped[str]=mapped_column(Text)
    synonyms: Mapped[list]=mapped_column(JSON,default=list)
    domain: Mapped[str]=mapped_column(String(100),default='corporate',index=True)
    classification: Mapped[str]=mapped_column(String(40),default='internal')
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'))
    steward_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    examples: Mapped[list]=mapped_column(JSON,default=list)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class SemanticModel(Base):
    __tablename__='semantic_models_v015'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180),unique=True,index=True)
    description: Mapped[str]=mapped_column(Text,default='')
    domain: Mapped[str]=mapped_column(String(100),default='corporate',index=True)
    dataset_id: Mapped[str|None]=mapped_column(ForeignKey('datasets.id',ondelete='SET NULL'),nullable=True,index=True)
    business_object: Mapped[str]=mapped_column(String(120),index=True)
    source_mapping: Mapped[dict]=mapped_column(JSON,default=dict)
    default_filters: Mapped[dict]=mapped_column(JSON,default=dict)
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    version: Mapped[int]=mapped_column(Integer,default=1)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'))
    approved_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    approved_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class SemanticMetric(Base):
    __tablename__='semantic_metrics_v015'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    model_id: Mapped[str]=mapped_column(ForeignKey('semantic_models_v015.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180),index=True)
    label: Mapped[str]=mapped_column(String(180))
    description: Mapped[str]=mapped_column(Text,default='')
    expression: Mapped[str]=mapped_column(Text)
    aggregation: Mapped[str]=mapped_column(String(30),default='sum')
    data_type: Mapped[str]=mapped_column(String(30),default='number')
    format: Mapped[str]=mapped_column(String(80),default='')
    certified: Mapped[bool]=mapped_column(Boolean,default=False,index=True)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    __table_args__=(UniqueConstraint('model_id','name',name='uq_semantic_metric_model_name_v015'),)

class SemanticDimension(Base):
    __tablename__='semantic_dimensions_v015'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    model_id: Mapped[str]=mapped_column(ForeignKey('semantic_models_v015.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180),index=True)
    label: Mapped[str]=mapped_column(String(180))
    expression: Mapped[str]=mapped_column(Text)
    data_type: Mapped[str]=mapped_column(String(30),default='string')
    hierarchy: Mapped[list]=mapped_column(JSON,default=list)
    hidden: Mapped[bool]=mapped_column(Boolean,default=False)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    __table_args__=(UniqueConstraint('model_id','name',name='uq_semantic_dimension_model_name_v015'),)

class KnowledgeGraphNode(Base):
    __tablename__='knowledge_graph_nodes_v015'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    node_type: Mapped[str]=mapped_column(String(80),index=True)
    external_id: Mapped[str]=mapped_column(String(180),index=True)
    label: Mapped[str]=mapped_column(String(250),index=True)
    properties: Mapped[dict]=mapped_column(JSON,default=dict)
    domain: Mapped[str]=mapped_column(String(100),default='corporate',index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    __table_args__=(UniqueConstraint('node_type','external_id',name='uq_kg_node_type_external_v015'),)

class KnowledgeGraphEdge(Base):
    __tablename__='knowledge_graph_edges_v015'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    source_node_id: Mapped[str]=mapped_column(ForeignKey('knowledge_graph_nodes_v015.id',ondelete='CASCADE'),index=True)
    target_node_id: Mapped[str]=mapped_column(ForeignKey('knowledge_graph_nodes_v015.id',ondelete='CASCADE'),index=True)
    relation_type: Mapped[str]=mapped_column(String(100),index=True)
    properties: Mapped[dict]=mapped_column(JSON,default=dict)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    __table_args__=(UniqueConstraint('source_node_id','target_node_id','relation_type',name='uq_kg_edge_v015'),)

class SemanticPermission(Base):
    __tablename__='semantic_permissions_v015'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    model_id: Mapped[str]=mapped_column(ForeignKey('semantic_models_v015.id',ondelete='CASCADE'),index=True)
    subject_type: Mapped[str]=mapped_column(String(30),default='role')
    subject_value: Mapped[str]=mapped_column(String(180),index=True)
    object_type: Mapped[str]=mapped_column(String(30),default='model')
    object_name: Mapped[str]=mapped_column(String(180),default='*')
    action: Mapped[str]=mapped_column(String(30),default='read')
    row_filter: Mapped[dict]=mapped_column(JSON,default=dict)
    masking: Mapped[dict]=mapped_column(JSON,default=dict)
    effect: Mapped[str]=mapped_column(String(10),default='allow')
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class SemanticQueryAudit(Base):
    __tablename__='semantic_query_audit_v015'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    model_id: Mapped[str|None]=mapped_column(ForeignKey('semantic_models_v015.id',ondelete='SET NULL'),nullable=True,index=True)
    query: Mapped[dict]=mapped_column(JSON,default=dict)
    resolved_plan: Mapped[dict]=mapped_column(JSON,default=dict)
    status: Mapped[str]=mapped_column(String(30),default='success',index=True)
    error: Mapped[str]=mapped_column(Text,default='')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)


class SemanticExecution(Base):
    __tablename__='semantic_executions_v016'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    model_id: Mapped[str]=mapped_column(ForeignKey('semantic_models_v015.id',ondelete='CASCADE'),index=True)
    plan: Mapped[dict]=mapped_column(JSON,default=dict)
    generated_sql: Mapped[str]=mapped_column(Text,default='')
    status: Mapped[str]=mapped_column(String(30),default='queued',index=True)
    row_count: Mapped[int]=mapped_column(Integer,default=0)
    duration_ms: Mapped[int]=mapped_column(Integer,default=0)
    cache_hit: Mapped[bool]=mapped_column(Boolean,default=False)
    cost_units: Mapped[int]=mapped_column(Integer,default=0)
    error: Mapped[str]=mapped_column(Text,default='')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class SemanticQueryCache(Base):
    __tablename__='semantic_query_cache_v016'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    cache_key: Mapped[str]=mapped_column(String(64),unique=True,index=True)
    model_id: Mapped[str]=mapped_column(ForeignKey('semantic_models_v015.id',ondelete='CASCADE'),index=True)
    payload: Mapped[dict]=mapped_column(JSON,default=dict)
    row_count: Mapped[int]=mapped_column(Integer,default=0)
    expires_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class SemanticCostPolicy(Base):
    __tablename__='semantic_cost_policies_v016'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180),unique=True)
    subject_type: Mapped[str]=mapped_column(String(30),default='role')
    subject_value: Mapped[str]=mapped_column(String(180),default='viewer',index=True)
    max_rows: Mapped[int]=mapped_column(Integer,default=5000)
    max_dimensions: Mapped[int]=mapped_column(Integer,default=8)
    max_metrics: Mapped[int]=mapped_column(Integer,default=12)
    max_cost_units: Mapped[int]=mapped_column(Integer,default=10000)
    timeout_seconds: Mapped[int]=mapped_column(Integer,default=30)
    cache_ttl_seconds: Mapped[int]=mapped_column(Integer,default=300)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class SemanticMaterialization(Base):
    __tablename__='semantic_materializations_v016'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    model_id: Mapped[str]=mapped_column(ForeignKey('semantic_models_v015.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180),unique=True)
    metrics: Mapped[list]=mapped_column(JSON,default=list)
    dimensions: Mapped[list]=mapped_column(JSON,default=list)
    filters: Mapped[dict]=mapped_column(JSON,default=dict)
    schedule_cron: Mapped[str]=mapped_column(String(120),default='0 * * * *')
    destination_object: Mapped[str]=mapped_column(String(300),default='')
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    last_refresh_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    last_row_count: Mapped[int]=mapped_column(Integer,default=0)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

# V017 - Federated Query Mesh, Streaming and Distributed Cache
class FederatedQueryJob(Base):
    __tablename__='federated_query_jobs_v017'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    request_json: Mapped[dict]=mapped_column(JSON,default=dict)
    execution_plan: Mapped[dict]=mapped_column(JSON,default=dict)
    status: Mapped[str]=mapped_column(String(30),default='queued',index=True)
    progress_percent: Mapped[int]=mapped_column(Integer,default=0)
    row_count: Mapped[int]=mapped_column(Integer,default=0)
    result_key: Mapped[str]=mapped_column(String(1000),default='')
    cursor_token: Mapped[str]=mapped_column(String(128),default='',index=True)
    cancel_requested: Mapped[bool]=mapped_column(Boolean,default=False,index=True)
    error: Mapped[str]=mapped_column(Text,default='')
    started_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class FederatedJoinDefinition(Base):
    __tablename__='federated_join_definitions_v017'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180),unique=True)
    left_model_id: Mapped[str]=mapped_column(ForeignKey('semantic_models_v015.id'),index=True)
    right_model_id: Mapped[str]=mapped_column(ForeignKey('semantic_models_v015.id'),index=True)
    join_type: Mapped[str]=mapped_column(String(20),default='inner')
    left_key: Mapped[str]=mapped_column(String(180))
    right_key: Mapped[str]=mapped_column(String(180))
    cardinality: Mapped[str]=mapped_column(String(30),default='many_to_one')
    max_rows_per_side: Mapped[int]=mapped_column(Integer,default=100000)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class QueryQuota(Base):
    __tablename__='query_quotas_v017'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    subject_type: Mapped[str]=mapped_column(String(30),default='role')
    subject_value: Mapped[str]=mapped_column(String(160),index=True)
    max_concurrent: Mapped[int]=mapped_column(Integer,default=3)
    daily_row_limit: Mapped[int]=mapped_column(Integer,default=1000000)
    daily_cost_limit: Mapped[int]=mapped_column(Integer,default=1000000)
    max_export_rows: Mapped[int]=mapped_column(Integer,default=100000)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class QueryUsageLedger(Base):
    __tablename__='query_usage_ledger_v017'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    job_id: Mapped[str|None]=mapped_column(ForeignKey('federated_query_jobs_v017.id',ondelete='SET NULL'),nullable=True,index=True)
    rows_processed: Mapped[int]=mapped_column(Integer,default=0)
    cost_units: Mapped[int]=mapped_column(Integer,default=0)
    cache_hit: Mapped[bool]=mapped_column(Boolean,default=False)
    operation: Mapped[str]=mapped_column(String(40),default='query')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)


# V018 - Distributed Federated Worker, Spill and Async Exports
class FederatedWorkerRun(Base):
    __tablename__='federated_worker_runs_v018'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    job_id: Mapped[str]=mapped_column(ForeignKey('federated_query_jobs_v017.id',ondelete='CASCADE'),index=True)
    worker_name: Mapped[str]=mapped_column(String(180),default='federated-worker')
    status: Mapped[str]=mapped_column(String(30),default='queued',index=True)
    phase: Mapped[str]=mapped_column(String(60),default='queued')
    checkpoint: Mapped[dict]=mapped_column(JSON,default=dict)
    memory_limit_mb: Mapped[int]=mapped_column(Integer,default=256)
    peak_memory_mb: Mapped[int]=mapped_column(Integer,default=0)
    spilled_bytes: Mapped[int]=mapped_column(Integer,default=0)
    heartbeat_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True,index=True)
    error: Mapped[str]=mapped_column(Text,default='')
    started_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class QuerySpillSegment(Base):
    __tablename__='query_spill_segments_v018'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    worker_run_id: Mapped[str]=mapped_column(ForeignKey('federated_worker_runs_v018.id',ondelete='CASCADE'),index=True)
    side: Mapped[str]=mapped_column(String(20),default='left')
    partition_no: Mapped[int]=mapped_column(Integer,default=0)
    object_key: Mapped[str]=mapped_column(String(1000))
    checksum: Mapped[str]=mapped_column(String(128))
    row_count: Mapped[int]=mapped_column(Integer,default=0)
    size_bytes: Mapped[int]=mapped_column(Integer,default=0)
    encrypted: Mapped[bool]=mapped_column(Boolean,default=False)
    expires_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True,index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class QueryExport(Base):
    __tablename__='query_exports_v018'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    job_id: Mapped[str]=mapped_column(ForeignKey('federated_query_jobs_v017.id',ondelete='CASCADE'),index=True)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    format: Mapped[str]=mapped_column(String(20),default='csv')
    status: Mapped[str]=mapped_column(String(30),default='queued',index=True)
    object_key: Mapped[str]=mapped_column(String(1000),default='')
    checksum: Mapped[str]=mapped_column(String(128),default='')
    row_count: Mapped[int]=mapped_column(Integer,default=0)
    size_bytes: Mapped[int]=mapped_column(Integer,default=0)
    error: Mapped[str]=mapped_column(Text,default='')
    expires_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True,index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)


# V019 - Adaptive Federated Orchestrator and Secure Object Exports
class FederatedExecutionProfile(Base):
    __tablename__='federated_execution_profiles_v019'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    name: Mapped[str]=mapped_column(String(180),unique=True)
    subject_type: Mapped[str]=mapped_column(String(30),default='role')
    subject_value: Mapped[str]=mapped_column(String(180),index=True)
    strategy: Mapped[str]=mapped_column(String(40),default='auto')
    parallel_sources: Mapped[bool]=mapped_column(Boolean,default=True)
    memory_limit_mb: Mapped[int]=mapped_column(Integer,default=512)
    sort_merge_threshold_rows: Mapped[int]=mapped_column(Integer,default=250000)
    pushdown_enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    source_timeout_seconds: Mapped[int]=mapped_column(Integer,default=120)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class FederatedSourceExecution(Base):
    __tablename__='federated_source_executions_v019'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    worker_run_id: Mapped[str]=mapped_column(ForeignKey('federated_worker_runs_v018.id',ondelete='CASCADE'),index=True)
    side: Mapped[str]=mapped_column(String(20),index=True)
    status: Mapped[str]=mapped_column(String(30),default='queued',index=True)
    source_name: Mapped[str]=mapped_column(String(180),default='')
    cancel_token: Mapped[str]=mapped_column(String(180),default='')
    row_count: Mapped[int]=mapped_column(Integer,default=0)
    duration_ms: Mapped[int]=mapped_column(Integer,default=0)
    error: Mapped[str]=mapped_column(Text,default='')
    started_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class ObjectStorageArtifact(Base):
    __tablename__='object_storage_artifacts_v019'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    job_id: Mapped[str|None]=mapped_column(ForeignKey('federated_query_jobs_v017.id',ondelete='SET NULL'),nullable=True,index=True)
    artifact_type: Mapped[str]=mapped_column(String(40),default='export')
    provider: Mapped[str]=mapped_column(String(30),default='local')
    bucket: Mapped[str]=mapped_column(String(180),default='')
    object_key: Mapped[str]=mapped_column(String(1000))
    content_type: Mapped[str]=mapped_column(String(120),default='application/octet-stream')
    checksum: Mapped[str]=mapped_column(String(128),default='')
    size_bytes: Mapped[int]=mapped_column(Integer,default=0)
    encrypted: Mapped[bool]=mapped_column(Boolean,default=False)
    expires_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True,index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

# V020 - Enterprise SaaS Multi-Tenant Foundation
class Tenant(Base):
    __tablename__='tenants_v020'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    slug: Mapped[str]=mapped_column(String(100),unique=True,index=True)
    legal_name: Mapped[str]=mapped_column(String(220))
    trade_name: Mapped[str]=mapped_column(String(220),default='')
    tax_id: Mapped[str]=mapped_column(String(80),default='',index=True)
    status: Mapped[str]=mapped_column(String(30),default='provisioning',index=True)
    isolation_mode: Mapped[str]=mapped_column(String(30),default='shared_schema')
    region: Mapped[str]=mapped_column(String(60),default='sa-east-1')
    default_locale: Mapped[str]=mapped_column(String(20),default='pt-BR')
    default_timezone: Mapped[str]=mapped_column(String(80),default='America/Sao_Paulo')
    data_residency: Mapped[str]=mapped_column(String(60),default='BR')
    settings_json: Mapped[dict]=mapped_column(JSON,default=dict)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    activated_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class TenantMembership(Base):
    __tablename__='tenant_memberships_v020'
    __table_args__=(UniqueConstraint('tenant_id','user_id',name='uq_tenant_user_v020'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id',ondelete='CASCADE'),index=True)
    tenant_role: Mapped[str]=mapped_column(String(40),default='member',index=True)
    status: Mapped[str]=mapped_column(String(30),default='active',index=True)
    permissions: Mapped[list]=mapped_column(JSON,default=list)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class SaaSPlan(Base):
    __tablename__='saas_plans_v020'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    code: Mapped[str]=mapped_column(String(80),unique=True,index=True)
    name: Mapped[str]=mapped_column(String(180))
    currency: Mapped[str]=mapped_column(String(10),default='BRL')
    monthly_price_cents: Mapped[int]=mapped_column(Integer,default=0)
    annual_price_cents: Mapped[int]=mapped_column(Integer,default=0)
    limits_json: Mapped[dict]=mapped_column(JSON,default=dict)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class SaaSSubscription(Base):
    __tablename__='saas_subscriptions_v020'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    plan_id: Mapped[str]=mapped_column(ForeignKey('saas_plans_v020.id'),index=True)
    status: Mapped[str]=mapped_column(String(30),default='trialing',index=True)
    billing_cycle: Mapped[str]=mapped_column(String(20),default='monthly')
    seats: Mapped[int]=mapped_column(Integer,default=5)
    trial_ends_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    current_period_start: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    current_period_end: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    external_customer_id: Mapped[str]=mapped_column(String(180),default='')
    external_subscription_id: Mapped[str]=mapped_column(String(180),default='')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class SaaSModule(Base):
    __tablename__='saas_modules_v020'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    code: Mapped[str]=mapped_column(String(80),unique=True,index=True)
    name: Mapped[str]=mapped_column(String(180))
    description: Mapped[str]=mapped_column(Text,default='')
    metered: Mapped[bool]=mapped_column(Boolean,default=False)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)

class TenantEntitlement(Base):
    __tablename__='tenant_entitlements_v020'
    __table_args__=(UniqueConstraint('tenant_id','module_id',name='uq_tenant_module_v020'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    module_id: Mapped[str]=mapped_column(ForeignKey('saas_modules_v020.id'),index=True)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    limits_json: Mapped[dict]=mapped_column(JSON,default=dict)
    activated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class TenantBranding(Base):
    __tablename__='tenant_branding_v020'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),unique=True,index=True)
    logo_url: Mapped[str]=mapped_column(String(1000),default='')
    favicon_url: Mapped[str]=mapped_column(String(1000),default='')
    primary_color: Mapped[str]=mapped_column(String(20),default='#16324F')
    secondary_color: Mapped[str]=mapped_column(String(20),default='#2E7D32')
    custom_domain: Mapped[str]=mapped_column(String(255),default='',unique=True)
    product_name: Mapped[str]=mapped_column(String(180),default='Enterprise Data Platform')
    support_email: Mapped[str]=mapped_column(String(255),default='')
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class TenantUsageMeter(Base):
    __tablename__='tenant_usage_meters_v020'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    metric_code: Mapped[str]=mapped_column(String(100),index=True)
    quantity: Mapped[int]=mapped_column(Integer,default=0)
    unit: Mapped[str]=mapped_column(String(30),default='unit')
    dimensions: Mapped[dict]=mapped_column(JSON,default=dict)
    occurred_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class TenantProvisioningRun(Base):
    __tablename__='tenant_provisioning_runs_v020'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str|None]=mapped_column(ForeignKey('tenants_v020.id',ondelete='SET NULL'),nullable=True,index=True)
    requested_by: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    status: Mapped[str]=mapped_column(String(30),default='running',index=True)
    steps_json: Mapped[list]=mapped_column(JSON,default=list)
    error: Mapped[str]=mapped_column(Text,default='')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

# V021 - Full Tenant Isolation and Legacy Migration
class TenantResourceScope(Base):
    __tablename__='tenant_resource_scopes_v021'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    resource_type: Mapped[str]=mapped_column(String(120),index=True)
    resource_id: Mapped[str]=mapped_column(String(120),index=True)
    source_table: Mapped[str]=mapped_column(String(180),default='')
    isolation_mode: Mapped[str]=mapped_column(String(30),default='physical')
    assigned_by: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True)
    assigned_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class TenantIsolationViolation(Base):
    __tablename__='tenant_isolation_violations_v021'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str|None]=mapped_column(ForeignKey('tenants_v020.id',ondelete='SET NULL'),nullable=True,index=True)
    user_id: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True,index=True)
    resource_type: Mapped[str]=mapped_column(String(120),index=True)
    resource_id: Mapped[str]=mapped_column(String(120),default='')
    action: Mapped[str]=mapped_column(String(80),default='read')
    reason: Mapped[str]=mapped_column(String(300),default='tenant_mismatch')
    request_id: Mapped[str]=mapped_column(String(120),default='',index=True)
    details: Mapped[dict]=mapped_column(JSON,default=dict)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class TenantMigrationBatch(Base):
    __tablename__='tenant_migration_batches_v021'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    resource_type: Mapped[str]=mapped_column(String(120),index=True)
    status: Mapped[str]=mapped_column(String(30),default='queued',index=True)
    strategy: Mapped[str]=mapped_column(String(40),default='owner_membership')
    scanned_count: Mapped[int]=mapped_column(Integer,default=0)
    assigned_count: Mapped[int]=mapped_column(Integer,default=0)
    skipped_count: Mapped[int]=mapped_column(Integer,default=0)
    error_count: Mapped[int]=mapped_column(Integer,default=0)
    checkpoint: Mapped[dict]=mapped_column(JSON,default=dict)
    dry_run: Mapped[bool]=mapped_column(Boolean,default=True)
    requested_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    started_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class TenantIsolationPolicy(Base):
    __tablename__='tenant_isolation_policies_v021'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),unique=True,index=True)
    enforcement_mode: Mapped[str]=mapped_column(String(30),default='strict')
    require_tenant_header: Mapped[bool]=mapped_column(Boolean,default=True)
    block_unscoped_resources: Mapped[bool]=mapped_column(Boolean,default=True)
    audit_denied_access: Mapped[bool]=mapped_column(Boolean,default=True)
    allow_platform_override: Mapped[bool]=mapped_column(Boolean,default=False)
    legacy_migration_complete: Mapped[bool]=mapped_column(Boolean,default=False)
    updated_by: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

# V022 - Tenant Runtime Enforcement, RLS, Namespaces and Quotas
class TenantDomain(Base):
    __tablename__='tenant_domains_v022'
    __table_args__=(UniqueConstraint('hostname',name='uq_tenant_domain_v022'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    hostname: Mapped[str]=mapped_column(String(255),unique=True,index=True)
    verified: Mapped[bool]=mapped_column(Boolean,default=False,index=True)
    verification_token: Mapped[str]=mapped_column(String(128),default='')
    is_primary: Mapped[bool]=mapped_column(Boolean,default=False)
    tls_status: Mapped[str]=mapped_column(String(30),default='pending')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    verified_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class TenantRuntimeNamespace(Base):
    __tablename__='tenant_runtime_namespaces_v022'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),unique=True,index=True)
    redis_prefix: Mapped[str]=mapped_column(String(180),unique=True)
    celery_queue: Mapped[str]=mapped_column(String(180),unique=True)
    object_prefix: Mapped[str]=mapped_column(String(500),unique=True)
    schema_name: Mapped[str]=mapped_column(String(120),default='public')
    database_alias: Mapped[str]=mapped_column(String(120),default='metadata')
    isolation_mode: Mapped[str]=mapped_column(String(30),default='shared_schema')
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class TenantQuotaReservation(Base):
    __tablename__='tenant_quota_reservations_v022'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    metric_code: Mapped[str]=mapped_column(String(100),index=True)
    quantity: Mapped[int]=mapped_column(Integer,default=0)
    status: Mapped[str]=mapped_column(String(30),default='reserved',index=True)
    idempotency_key: Mapped[str]=mapped_column(String(160),unique=True,index=True)
    reference_type: Mapped[str]=mapped_column(String(80),default='')
    reference_id: Mapped[str]=mapped_column(String(120),default='')
    expires_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True,index=True)
    created_by: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    finalized_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class TenantRuntimeAudit(Base):
    __tablename__='tenant_runtime_audits_v022'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str|None]=mapped_column(ForeignKey('tenants_v020.id',ondelete='SET NULL'),nullable=True,index=True)
    user_id: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True,index=True)
    event_type: Mapped[str]=mapped_column(String(100),index=True)
    request_id: Mapped[str]=mapped_column(String(120),default='',index=True)
    hostname: Mapped[str]=mapped_column(String(255),default='')
    route: Mapped[str]=mapped_column(String(500),default='')
    outcome: Mapped[str]=mapped_column(String(30),default='success',index=True)
    details: Mapped[dict]=mapped_column(JSON,default=dict)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

# V023 - SaaS Commercial Operations, Onboarding, Billing and Reconciliation
class SaaSOnboardingApplication(Base):
    __tablename__='saas_onboarding_applications_v023'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    company_name: Mapped[str]=mapped_column(String(220))
    tax_id: Mapped[str]=mapped_column(String(80),default='',index=True)
    admin_name: Mapped[str]=mapped_column(String(180))
    admin_email: Mapped[str]=mapped_column(String(255),index=True)
    plan_code: Mapped[str]=mapped_column(String(80),default='trial')
    status: Mapped[str]=mapped_column(String(30),default='pending_email',index=True)
    activation_token_hash: Mapped[str]=mapped_column(String(128),unique=True,index=True)
    activation_expires_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),index=True)
    tenant_id: Mapped[str|None]=mapped_column(ForeignKey('tenants_v020.id',ondelete='SET NULL'),nullable=True,index=True)
    metadata_json: Mapped[dict]=mapped_column(JSON,default=dict)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    activated_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class BillingCustomer(Base):
    __tablename__='billing_customers_v023'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),unique=True,index=True)
    provider: Mapped[str]=mapped_column(String(40),default='manual')
    external_customer_id: Mapped[str]=mapped_column(String(180),default='',index=True)
    billing_email: Mapped[str]=mapped_column(String(255),default='')
    tax_id: Mapped[str]=mapped_column(String(80),default='')
    status: Mapped[str]=mapped_column(String(30),default='active',index=True)
    provider_metadata: Mapped[dict]=mapped_column(JSON,default=dict)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class BillingInvoice(Base):
    __tablename__='billing_invoices_v023'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    subscription_id: Mapped[str|None]=mapped_column(ForeignKey('saas_subscriptions_v020.id',ondelete='SET NULL'),nullable=True,index=True)
    provider: Mapped[str]=mapped_column(String(40),default='manual')
    external_invoice_id: Mapped[str]=mapped_column(String(180),default='',index=True)
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    currency: Mapped[str]=mapped_column(String(10),default='BRL')
    subtotal_cents: Mapped[int]=mapped_column(Integer,default=0)
    tax_cents: Mapped[int]=mapped_column(Integer,default=0)
    total_cents: Mapped[int]=mapped_column(Integer,default=0)
    due_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True,index=True)
    paid_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    line_items: Mapped[list]=mapped_column(JSON,default=list)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class BillingWebhookEvent(Base):
    __tablename__='billing_webhook_events_v023'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    provider: Mapped[str]=mapped_column(String(40),index=True)
    external_event_id: Mapped[str]=mapped_column(String(180),unique=True,index=True)
    event_type: Mapped[str]=mapped_column(String(120),index=True)
    signature_valid: Mapped[bool]=mapped_column(Boolean,default=False)
    status: Mapped[str]=mapped_column(String(30),default='received',index=True)
    payload: Mapped[dict]=mapped_column(JSON,default=dict)
    error: Mapped[str]=mapped_column(Text,default='')
    received_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    processed_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class TenantRateLimitPolicy(Base):
    __tablename__='tenant_rate_limit_policies_v023'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    scope: Mapped[str]=mapped_column(String(100),default='api',index=True)
    requests_per_minute: Mapped[int]=mapped_column(Integer,default=600)
    burst: Mapped[int]=mapped_column(Integer,default=100)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)
    __table_args__=(UniqueConstraint('tenant_id','scope',name='uq_tenant_rate_scope_v023'),)

class UsageReconciliationRun(Base):
    __tablename__='usage_reconciliation_runs_v023'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str|None]=mapped_column(ForeignKey('tenants_v020.id',ondelete='SET NULL'),nullable=True,index=True)
    status: Mapped[str]=mapped_column(String(30),default='running',index=True)
    expired_reservations: Mapped[int]=mapped_column(Integer,default=0)
    released_quantity: Mapped[int]=mapped_column(Integer,default=0)
    duplicate_meter_events: Mapped[int]=mapped_column(Integer,default=0)
    discrepancies: Mapped[list]=mapped_column(JSON,default=list)
    started_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

# V024 - Modular SaaS, Visual Data Catalog and Governed Automation
class TenantModuleAssignment(Base):
    __tablename__='tenant_module_assignments_v024'
    __table_args__=(UniqueConstraint('tenant_id','module_code',name='uq_tenant_module_code_v024'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    module_code: Mapped[str]=mapped_column(String(100),index=True)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    contract_limits: Mapped[dict]=mapped_column(JSON,default=dict)
    configuration: Mapped[dict]=mapped_column(JSON,default=dict)
    activated_by: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True)
    activated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class DataFieldMetadata(Base):
    __tablename__='data_field_metadata_v024'
    __table_args__=(UniqueConstraint('tenant_id','source_id','qualified_object','column_name',name='uq_field_metadata_v024'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    source_id: Mapped[str]=mapped_column(ForeignKey('data_sources.id',ondelete='CASCADE'),index=True)
    dataset_id: Mapped[str|None]=mapped_column(ForeignKey('datasets.id',ondelete='SET NULL'),nullable=True,index=True)
    qualified_object: Mapped[str]=mapped_column(String(500),index=True)
    column_name: Mapped[str]=mapped_column(String(255),index=True)
    physical_type: Mapped[str]=mapped_column(String(180),default='')
    friendly_name: Mapped[str]=mapped_column(String(255),default='')
    description: Mapped[str]=mapped_column(Text,default='')
    business_notes: Mapped[str]=mapped_column(Text,default='')
    classification: Mapped[str]=mapped_column(String(60),default='internal',index=True)
    tags: Mapped[list]=mapped_column(JSON,default=list)
    nullable: Mapped[bool]=mapped_column(Boolean,default=True)
    visible: Mapped[bool]=mapped_column(Boolean,default=True)
    searchable: Mapped[bool]=mapped_column(Boolean,default=True)
    aggregatable: Mapped[bool]=mapped_column(Boolean,default=True)
    updated_by: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class VisualGovernancePolicy(Base):
    __tablename__='visual_governance_policies_v024'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180))
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    subject_type: Mapped[str]=mapped_column(String(30),index=True)  # user, role, department, team
    subject_id: Mapped[str]=mapped_column(String(120),index=True)
    effect: Mapped[str]=mapped_column(String(20),default='allow')
    actions: Mapped[list]=mapped_column(JSON,default=lambda:['read'])
    allowed_columns: Mapped[list]=mapped_column(JSON,default=list)
    denied_columns: Mapped[list]=mapped_column(JSON,default=list)
    scope_type: Mapped[str]=mapped_column(String(30),default='all') # all, department, region, customers, expression
    scope_config: Mapped[dict]=mapped_column(JSON,default=dict)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    priority: Mapped[int]=mapped_column(Integer,default=100)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class DataProcessFlow(Base):
    __tablename__='data_process_flows_v024'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180))
    description: Mapped[str]=mapped_column(Text,default='')
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True,index=True)
    source_id: Mapped[str|None]=mapped_column(ForeignKey('data_sources.id'),nullable=True,index=True)
    nodes: Mapped[list]=mapped_column(JSON,default=list)
    edges: Mapped[list]=mapped_column(JSON,default=list)
    schedule_cron: Mapped[str|None]=mapped_column(String(120),nullable=True)
    timezone: Mapped[str]=mapped_column(String(60),default='America/Sao_Paulo')
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    publish_status: Mapped[str]=mapped_column(String(30),default='draft')
    last_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    next_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class DataProcessRun(Base):
    __tablename__='data_process_runs_v024'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    flow_id: Mapped[str]=mapped_column(ForeignKey('data_process_flows_v024.id',ondelete='CASCADE'),index=True)
    status: Mapped[str]=mapped_column(String(30),default='queued',index=True)
    node_status: Mapped[dict]=mapped_column(JSON,default=dict)
    rows_processed: Mapped[int]=mapped_column(Integer,default=0)
    error: Mapped[str]=mapped_column(Text,default='')
    started_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class GovernedReportSchedule(Base):
    __tablename__='governed_report_schedules_v024'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    report_id: Mapped[str]=mapped_column(ForeignKey('reports.id',ondelete='CASCADE'),index=True)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    name: Mapped[str]=mapped_column(String(180))
    cron: Mapped[str]=mapped_column(String(120))
    timezone: Mapped[str]=mapped_column(String(60),default='America/Sao_Paulo')
    formats: Mapped[list]=mapped_column(JSON,default=lambda:['pdf'])
    channels: Mapped[list]=mapped_column(JSON,default=lambda:['dashboard'])
    recipient_user_ids: Mapped[list]=mapped_column(JSON,default=list)
    recipient_team_ids: Mapped[list]=mapped_column(JSON,default=list)
    recipient_emails: Mapped[list]=mapped_column(JSON,default=list)
    subject_template: Mapped[str]=mapped_column(String(255),default='Relatório atualizado')
    message_template: Mapped[str]=mapped_column(Text,default='')
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    next_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    last_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

# V025 - Universal Connectivity Hub
class ConnectorDefinition(Base):
    __tablename__='connector_definitions_v025'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    code: Mapped[str]=mapped_column(String(80),unique=True,index=True)
    name: Mapped[str]=mapped_column(String(160))
    category: Mapped[str]=mapped_column(String(50),index=True)
    protocol: Mapped[str]=mapped_column(String(50),default='sql')
    capabilities: Mapped[list]=mapped_column(JSON,default=list)
    config_schema: Mapped[dict]=mapped_column(JSON,default=dict)
    auth_methods: Mapped[list]=mapped_column(JSON,default=list)
    driver_package: Mapped[str]=mapped_column(String(180),default='')
    enabled: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    marketplace_visible: Mapped[bool]=mapped_column(Boolean,default=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class TenantConnectorInstance(Base):
    __tablename__='tenant_connector_instances_v025'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    connector_code: Mapped[str]=mapped_column(String(80),index=True)
    name: Mapped[str]=mapped_column(String(180))
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    encrypted_config: Mapped[str]=mapped_column(Text,default='')
    public_config: Mapped[dict]=mapped_column(JSON,default=dict)
    last_test_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    last_test_status: Mapped[str]=mapped_column(String(30),default='never')
    last_test_message: Mapped[str]=mapped_column(Text,default='')
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)
    __table_args__=(UniqueConstraint('tenant_id','name',name='uq_tenant_connector_name_v025'),)

class ConnectorDiscoveredObject(Base):
    __tablename__='connector_discovered_objects_v025'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    connector_instance_id: Mapped[str]=mapped_column(ForeignKey('tenant_connector_instances_v025.id',ondelete='CASCADE'),index=True)
    object_type: Mapped[str]=mapped_column(String(30),default='table')
    namespace: Mapped[str]=mapped_column(String(180),default='')
    object_name: Mapped[str]=mapped_column(String(255))
    qualified_name: Mapped[str]=mapped_column(String(500),index=True)
    columns_json: Mapped[list]=mapped_column(JSON,default=list)
    estimated_rows: Mapped[int|None]=mapped_column(BigInteger,nullable=True)
    selected: Mapped[bool]=mapped_column(Boolean,default=False,index=True)
    discovered_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    __table_args__=(UniqueConstraint('tenant_id','connector_instance_id','qualified_name',name='uq_discovered_object_v025'),)

class ConnectorSyncProfile(Base):
    __tablename__='connector_sync_profiles_v025'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    connector_instance_id: Mapped[str]=mapped_column(ForeignKey('tenant_connector_instances_v025.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180))
    selected_objects: Mapped[list]=mapped_column(JSON,default=list)
    mode: Mapped[str]=mapped_column(String(30),default='incremental')
    watermark_column: Mapped[str]=mapped_column(String(180),default='')
    cdc_strategy: Mapped[str]=mapped_column(String(50),default='watermark')
    schedule_cron: Mapped[str|None]=mapped_column(String(120),nullable=True)
    timezone: Mapped[str]=mapped_column(String(60),default='America/Sao_Paulo')
    destination_zone: Mapped[str]=mapped_column(String(20),default='bronze')
    enabled: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    last_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    next_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class ConnectorTestRun(Base):
    __tablename__='connector_test_runs_v025'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    connector_instance_id: Mapped[str]=mapped_column(ForeignKey('tenant_connector_instances_v025.id',ondelete='CASCADE'),index=True)
    status: Mapped[str]=mapped_column(String(30),default='running',index=True)
    latency_ms: Mapped[int|None]=mapped_column(Integer,nullable=True)
    details: Mapped[dict]=mapped_column(JSON,default=dict)
    error: Mapped[str]=mapped_column(Text,default='')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

# V026 - Visual ETL Studio
class ETLPipeline(Base):
    __tablename__='etl_pipelines_v026'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180))
    description: Mapped[str]=mapped_column(Text,default='')
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    nodes: Mapped[list]=mapped_column(JSON,default=list)
    edges: Mapped[list]=mapped_column(JSON,default=list)
    variables: Mapped[dict]=mapped_column(JSON,default=dict)
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    schedule_cron: Mapped[str|None]=mapped_column(String(120),nullable=True)
    timezone: Mapped[str]=mapped_column(String(60),default='America/Sao_Paulo')
    enabled: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    version: Mapped[int]=mapped_column(Integer,default=1)
    last_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    next_run_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)
    __table_args__=(UniqueConstraint('tenant_id','name',name='uq_etl_pipeline_name_v026'),)

class ETLPipelineVersion(Base):
    __tablename__='etl_pipeline_versions_v026'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    pipeline_id: Mapped[str]=mapped_column(ForeignKey('etl_pipelines_v026.id',ondelete='CASCADE'),index=True)
    version: Mapped[int]=mapped_column(Integer)
    snapshot: Mapped[dict]=mapped_column(JSON,default=dict)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    __table_args__=(UniqueConstraint('pipeline_id','version',name='uq_etl_pipeline_version_v026'),)

class ETLPipelineRun(Base):
    __tablename__='etl_pipeline_runs_v026'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    pipeline_id: Mapped[str]=mapped_column(ForeignKey('etl_pipelines_v026.id',ondelete='CASCADE'),index=True)
    requested_by: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    mode: Mapped[str]=mapped_column(String(30),default='full')
    status: Mapped[str]=mapped_column(String(30),default='queued',index=True)
    progress: Mapped[int]=mapped_column(Integer,default=0)
    rows_in: Mapped[int]=mapped_column(Integer,default=0)
    rows_out: Mapped[int]=mapped_column(Integer,default=0)
    output_key: Mapped[str]=mapped_column(String(1000),default='')
    checksum: Mapped[str]=mapped_column(String(128),default='')
    error: Mapped[str]=mapped_column(Text,default='')
    started_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class ETLNodeRun(Base):
    __tablename__='etl_node_runs_v026'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    pipeline_run_id: Mapped[str]=mapped_column(ForeignKey('etl_pipeline_runs_v026.id',ondelete='CASCADE'),index=True)
    node_id: Mapped[str]=mapped_column(String(120),index=True)
    node_type: Mapped[str]=mapped_column(String(50))
    status: Mapped[str]=mapped_column(String(30),default='queued')
    rows_in: Mapped[int]=mapped_column(Integer,default=0)
    rows_out: Mapped[int]=mapped_column(Integer,default=0)
    sample: Mapped[list]=mapped_column(JSON,default=list)
    error: Mapped[str]=mapped_column(Text,default='')
    started_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class ETLTemplate(Base):
    __tablename__='etl_templates_v026'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str|None]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),nullable=True,index=True)
    name: Mapped[str]=mapped_column(String(180))
    category: Mapped[str]=mapped_column(String(80),default='general')
    description: Mapped[str]=mapped_column(Text,default='')
    nodes: Mapped[list]=mapped_column(JSON,default=list)
    edges: Mapped[list]=mapped_column(JSON,default=list)
    public: Mapped[bool]=mapped_column(Boolean,default=False,index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

# V027 - Enterprise AI Center
class AICenterProvider(Base):
    __tablename__='ai_center_providers_v027'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(160))
    provider_type: Mapped[str]=mapped_column(String(50),index=True)
    base_url: Mapped[str]=mapped_column(String(700),default='')
    encrypted_config: Mapped[str]=mapped_column(Text,default='')
    enabled: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class AICenterModel(Base):
    __tablename__='ai_center_models_v027'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    provider_id: Mapped[str]=mapped_column(ForeignKey('ai_center_providers_v027.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180))
    model_code: Mapped[str]=mapped_column(String(220),index=True)
    capabilities: Mapped[list]=mapped_column(JSON,default=list)
    context_window: Mapped[int]=mapped_column(Integer,default=0)
    input_cost_per_million: Mapped[int]=mapped_column(Integer,default=0)
    output_cost_per_million: Mapped[int]=mapped_column(Integer,default=0)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    __table_args__=(UniqueConstraint('tenant_id','provider_id','model_code',name='uq_ai_center_model_v027'),)

class AICenterTool(Base):
    __tablename__='ai_center_tools_v027'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str|None]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),nullable=True,index=True)
    code: Mapped[str]=mapped_column(String(120),index=True)
    name: Mapped[str]=mapped_column(String(180))
    description: Mapped[str]=mapped_column(Text,default='')
    risk_level: Mapped[str]=mapped_column(String(30),default='low')
    requires_approval: Mapped[bool]=mapped_column(Boolean,default=False)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    configuration: Mapped[dict]=mapped_column(JSON,default=dict)
    __table_args__=(UniqueConstraint('tenant_id','code',name='uq_ai_center_tool_v027'),)

class AIAgent(Base):
    __tablename__='ai_agents_v027'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180))
    description: Mapped[str]=mapped_column(Text,default='')
    department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id'),nullable=True,index=True)
    model_id: Mapped[str]=mapped_column(ForeignKey('ai_center_models_v027.id'),index=True)
    system_prompt: Mapped[str]=mapped_column(Text,default='')
    tool_codes: Mapped[list]=mapped_column(JSON,default=list)
    knowledge_base_ids: Mapped[list]=mapped_column(JSON,default=list)
    dataset_ids: Mapped[list]=mapped_column(JSON,default=list)
    allowed_roles: Mapped[list]=mapped_column(JSON,default=list)
    memory_enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    max_context_chars: Mapped[int]=mapped_column(Integer,default=20000)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class AICenterConversation(Base):
    __tablename__='ai_center_conversations_v027'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    agent_id: Mapped[str]=mapped_column(ForeignKey('ai_agents_v027.id',ondelete='CASCADE'),index=True)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    title: Mapped[str]=mapped_column(String(220),default='Nova conversa')
    status: Mapped[str]=mapped_column(String(30),default='active')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class AICenterMessage(Base):
    __tablename__='ai_center_messages_v027'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    conversation_id: Mapped[str]=mapped_column(ForeignKey('ai_center_conversations_v027.id',ondelete='CASCADE'),index=True)
    role: Mapped[str]=mapped_column(String(30),index=True)
    content: Mapped[str]=mapped_column(Text)
    citations: Mapped[list]=mapped_column(JSON,default=list)
    tool_calls: Mapped[list]=mapped_column(JSON,default=list)
    safety_flags: Mapped[list]=mapped_column(JSON,default=list)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class AIPromptAsset(Base):
    __tablename__='ai_prompt_assets_v027'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180))
    template: Mapped[str]=mapped_column(Text)
    version: Mapped[int]=mapped_column(Integer,default=1)
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    variables: Mapped[list]=mapped_column(JSON,default=list)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    approved_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class AIApprovalRequest(Base):
    __tablename__='ai_approval_requests_v027'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    conversation_id: Mapped[str|None]=mapped_column(ForeignKey('ai_center_conversations_v027.id',ondelete='SET NULL'),nullable=True,index=True)
    requested_by: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    tool_code: Mapped[str]=mapped_column(String(120),index=True)
    arguments: Mapped[dict]=mapped_column(JSON,default=dict)
    status: Mapped[str]=mapped_column(String(30),default='pending',index=True)
    reviewer_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    reason: Mapped[str]=mapped_column(Text,default='')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    decided_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class AICostLedger(Base):
    __tablename__='ai_cost_ledger_v027'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    agent_id: Mapped[str]=mapped_column(ForeignKey('ai_agents_v027.id'),index=True)
    model_id: Mapped[str]=mapped_column(ForeignKey('ai_center_models_v027.id'),index=True)
    input_tokens: Mapped[int]=mapped_column(Integer,default=0)
    output_tokens: Mapped[int]=mapped_column(Integer,default=0)
    estimated_cost_micros: Mapped[int]=mapped_column(BigInteger,default=0)
    latency_ms: Mapped[int]=mapped_column(Integer,default=0)
    status: Mapped[str]=mapped_column(String(30),default='success')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

# V029 - Commercial Platform, Billing, Support and Customer Success
class CommercialLead(Base):
    __tablename__='commercial_leads_v029'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str|None]=mapped_column(ForeignKey('tenants_v020.id',ondelete='SET NULL'),nullable=True,index=True)
    company_name: Mapped[str]=mapped_column(String(220),index=True)
    contact_name: Mapped[str]=mapped_column(String(180))
    email: Mapped[str]=mapped_column(String(255),index=True)
    phone: Mapped[str]=mapped_column(String(60),default='')
    segment: Mapped[str]=mapped_column(String(100),default='')
    source: Mapped[str]=mapped_column(String(80),default='website',index=True)
    status: Mapped[str]=mapped_column(String(40),default='new',index=True)
    score: Mapped[int]=mapped_column(Integer,default=0)
    notes: Mapped[str]=mapped_column(Text,default='')
    owner_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True,index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class CommercialOpportunity(Base):
    __tablename__='commercial_opportunities_v029'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    lead_id: Mapped[str|None]=mapped_column(ForeignKey('commercial_leads_v029.id',ondelete='SET NULL'),nullable=True,index=True)
    tenant_id: Mapped[str|None]=mapped_column(ForeignKey('tenants_v020.id',ondelete='SET NULL'),nullable=True,index=True)
    name: Mapped[str]=mapped_column(String(220))
    stage: Mapped[str]=mapped_column(String(50),default='qualification',index=True)
    plan_code: Mapped[str]=mapped_column(String(80),default='')
    amount_cents: Mapped[int]=mapped_column(BigInteger,default=0)
    probability: Mapped[int]=mapped_column(Integer,default=10)
    expected_close_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    owner_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True,index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class PaymentGatewayConfig(Base):
    __tablename__='payment_gateway_configs_v029'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    provider: Mapped[str]=mapped_column(String(50),index=True)
    name: Mapped[str]=mapped_column(String(160))
    environment: Mapped[str]=mapped_column(String(30),default='sandbox')
    encrypted_config: Mapped[str]=mapped_column(Text,default='')
    webhook_secret_encrypted: Mapped[str]=mapped_column(Text,default='')
    enabled: Mapped[bool]=mapped_column(Boolean,default=False,index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    __table_args__=(UniqueConstraint('provider','environment',name='uq_gateway_provider_env_v029'),)

class CheckoutSession(Base):
    __tablename__='checkout_sessions_v029'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    onboarding_application_id: Mapped[str|None]=mapped_column(ForeignKey('saas_onboarding_applications_v023.id',ondelete='SET NULL'),nullable=True,index=True)
    tenant_id: Mapped[str|None]=mapped_column(ForeignKey('tenants_v020.id',ondelete='SET NULL'),nullable=True,index=True)
    provider: Mapped[str]=mapped_column(String(50),index=True)
    external_session_id: Mapped[str]=mapped_column(String(255),default='',index=True)
    plan_code: Mapped[str]=mapped_column(String(80),index=True)
    billing_cycle: Mapped[str]=mapped_column(String(20),default='monthly')
    status: Mapped[str]=mapped_column(String(40),default='created',index=True)
    customer_email: Mapped[str]=mapped_column(String(255),index=True)
    checkout_url: Mapped[str]=mapped_column(String(1000),default='')
    trial_days: Mapped[int]=mapped_column(Integer,default=14)
    expires_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class CustomerPaymentMethod(Base):
    __tablename__='customer_payment_methods_v029'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    provider: Mapped[str]=mapped_column(String(50),index=True)
    external_payment_method_id: Mapped[str]=mapped_column(String(255),index=True)
    brand: Mapped[str]=mapped_column(String(40),default='')
    last4: Mapped[str]=mapped_column(String(4),default='')
    expiry_month: Mapped[int]=mapped_column(Integer,default=0)
    expiry_year: Mapped[int]=mapped_column(Integer,default=0)
    is_default: Mapped[bool]=mapped_column(Boolean,default=True)
    active: Mapped[bool]=mapped_column(Boolean,default=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    __table_args__=(UniqueConstraint('tenant_id','provider','external_payment_method_id',name='uq_payment_method_v029'),)

class SupportTicket(Base):
    __tablename__='support_tickets_v029'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    requester_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    assigned_to: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True,index=True)
    subject: Mapped[str]=mapped_column(String(250))
    description: Mapped[str]=mapped_column(Text)
    category: Mapped[str]=mapped_column(String(80),default='general',index=True)
    priority: Mapped[str]=mapped_column(String(30),default='normal',index=True)
    status: Mapped[str]=mapped_column(String(30),default='open',index=True)
    sla_due_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True,index=True)
    first_response_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    resolved_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class SupportTicketMessage(Base):
    __tablename__='support_ticket_messages_v029'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    ticket_id: Mapped[str]=mapped_column(ForeignKey('support_tickets_v029.id',ondelete='CASCADE'),index=True)
    author_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    body: Mapped[str]=mapped_column(Text)
    internal: Mapped[bool]=mapped_column(Boolean,default=False)
    attachments: Mapped[list]=mapped_column(JSON,default=list)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class KnowledgeArticleV029(Base):
    __tablename__='knowledge_articles_v029'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str|None]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),nullable=True,index=True)
    title: Mapped[str]=mapped_column(String(250),index=True)
    slug: Mapped[str]=mapped_column(String(250),index=True)
    category: Mapped[str]=mapped_column(String(100),default='general',index=True)
    body: Mapped[str]=mapped_column(Text)
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    public: Mapped[bool]=mapped_column(Boolean,default=False,index=True)
    tags: Mapped[list]=mapped_column(JSON,default=list)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)
    __table_args__=(UniqueConstraint('tenant_id','slug',name='uq_kb_article_slug_v029'),)

class CustomerHealthSnapshot(Base):
    __tablename__='customer_health_snapshots_v029'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    score: Mapped[int]=mapped_column(Integer,default=50,index=True)
    adoption_score: Mapped[int]=mapped_column(Integer,default=0)
    support_score: Mapped[int]=mapped_column(Integer,default=100)
    billing_score: Mapped[int]=mapped_column(Integer,default=100)
    engagement_score: Mapped[int]=mapped_column(Integer,default=0)
    risk_level: Mapped[str]=mapped_column(String(30),default='medium',index=True)
    signals: Mapped[dict]=mapped_column(JSON,default=dict)
    calculated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class CustomerSuccessPlan(Base):
    __tablename__='customer_success_plans_v029'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    owner_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True,index=True)
    objectives: Mapped[list]=mapped_column(JSON,default=list)
    milestones: Mapped[list]=mapped_column(JSON,default=list)
    risks: Mapped[list]=mapped_column(JSON,default=list)
    next_review_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    status: Mapped[str]=mapped_column(String(30),default='active',index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class NPSSurveyResponse(Base):
    __tablename__='nps_survey_responses_v029'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    score: Mapped[int]=mapped_column(Integer,index=True)
    comment: Mapped[str]=mapped_column(Text,default='')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

# V030 - Marketplace, Partner Portal and Ecosystem
class MarketplacePublisher(Base):
    __tablename__='marketplace_publishers_v030'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    publisher_type: Mapped[str]=mapped_column(String(30),default='partner',index=True)
    legal_name: Mapped[str]=mapped_column(String(220),index=True)
    trade_name: Mapped[str]=mapped_column(String(180),default='')
    tax_id: Mapped[str]=mapped_column(String(80),default='',index=True)
    website: Mapped[str]=mapped_column(String(500),default='')
    support_email: Mapped[str]=mapped_column(String(255),default='')
    status: Mapped[str]=mapped_column(String(30),default='pending',index=True)
    revenue_share_bps: Mapped[int]=mapped_column(Integer,default=2000)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    approved_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    approved_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class MarketplaceAsset(Base):
    __tablename__='marketplace_assets_v030'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    publisher_id: Mapped[str]=mapped_column(ForeignKey('marketplace_publishers_v030.id',ondelete='CASCADE'),index=True)
    code: Mapped[str]=mapped_column(String(140),unique=True,index=True)
    asset_type: Mapped[str]=mapped_column(String(50),index=True)
    name: Mapped[str]=mapped_column(String(220),index=True)
    short_description: Mapped[str]=mapped_column(String(500),default='')
    description: Mapped[str]=mapped_column(Text,default='')
    category: Mapped[str]=mapped_column(String(100),default='general',index=True)
    tags: Mapped[list]=mapped_column(JSON,default=list)
    icon_url: Mapped[str]=mapped_column(String(1000),default='')
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    visibility: Mapped[str]=mapped_column(String(30),default='public',index=True)
    pricing_model: Mapped[str]=mapped_column(String(30),default='free')
    monthly_price_cents: Mapped[int]=mapped_column(BigInteger,default=0)
    one_time_price_cents: Mapped[int]=mapped_column(BigInteger,default=0)
    currency: Mapped[str]=mapped_column(String(10),default='BRL')
    trial_days: Mapped[int]=mapped_column(Integer,default=0)
    required_plan_codes: Mapped[list]=mapped_column(JSON,default=list)
    required_module_codes: Mapped[list]=mapped_column(JSON,default=list)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class MarketplaceAssetVersion(Base):
    __tablename__='marketplace_asset_versions_v030'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    asset_id: Mapped[str]=mapped_column(ForeignKey('marketplace_assets_v030.id',ondelete='CASCADE'),index=True)
    version: Mapped[str]=mapped_column(String(60),index=True)
    min_platform_version: Mapped[str]=mapped_column(String(60),default='0.29.0')
    max_platform_version: Mapped[str]=mapped_column(String(60),default='')
    manifest: Mapped[dict]=mapped_column(JSON,default=dict)
    dependencies: Mapped[list]=mapped_column(JSON,default=list)
    package_path: Mapped[str]=mapped_column(String(1000),default='')
    package_sha256: Mapped[str]=mapped_column(String(64),default='',index=True)
    signature: Mapped[str]=mapped_column(Text,default='')
    changelog: Mapped[str]=mapped_column(Text,default='')
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    security_review_status: Mapped[str]=mapped_column(String(30),default='pending',index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    __table_args__=(UniqueConstraint('asset_id','version',name='uq_marketplace_asset_version_v030'),)

class TenantMarketplaceInstallation(Base):
    __tablename__='tenant_marketplace_installations_v030'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    asset_id: Mapped[str]=mapped_column(ForeignKey('marketplace_assets_v030.id'),index=True)
    asset_version_id: Mapped[str]=mapped_column(ForeignKey('marketplace_asset_versions_v030.id'),index=True)
    status: Mapped[str]=mapped_column(String(30),default='installed',index=True)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    configuration: Mapped[dict]=mapped_column(JSON,default=dict)
    installed_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    installed_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)
    __table_args__=(UniqueConstraint('tenant_id','asset_id',name='uq_tenant_asset_install_v030'),)

class MarketplaceLicense(Base):
    __tablename__='marketplace_licenses_v030'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    asset_id: Mapped[str]=mapped_column(ForeignKey('marketplace_assets_v030.id'),index=True)
    license_type: Mapped[str]=mapped_column(String(30),default='subscription')
    status: Mapped[str]=mapped_column(String(30),default='active',index=True)
    seats: Mapped[int]=mapped_column(Integer,default=0)
    starts_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    ends_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True,index=True)
    external_subscription_id: Mapped[str]=mapped_column(String(255),default='')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    __table_args__=(UniqueConstraint('tenant_id','asset_id',name='uq_marketplace_license_v030'),)

class MarketplaceReview(Base):
    __tablename__='marketplace_reviews_v030'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    asset_id: Mapped[str]=mapped_column(ForeignKey('marketplace_assets_v030.id',ondelete='CASCADE'),index=True)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    rating: Mapped[int]=mapped_column(Integer,index=True)
    title: Mapped[str]=mapped_column(String(180),default='')
    comment: Mapped[str]=mapped_column(Text,default='')
    status: Mapped[str]=mapped_column(String(30),default='published',index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    __table_args__=(UniqueConstraint('tenant_id','asset_id','user_id',name='uq_marketplace_review_v030'),)

class PartnerReferral(Base):
    __tablename__='partner_referrals_v030'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    publisher_id: Mapped[str]=mapped_column(ForeignKey('marketplace_publishers_v030.id',ondelete='CASCADE'),index=True)
    tenant_id: Mapped[str|None]=mapped_column(ForeignKey('tenants_v020.id',ondelete='SET NULL'),nullable=True,index=True)
    lead_id: Mapped[str|None]=mapped_column(ForeignKey('commercial_leads_v029.id',ondelete='SET NULL'),nullable=True,index=True)
    referral_code: Mapped[str]=mapped_column(String(80),unique=True,index=True)
    status: Mapped[str]=mapped_column(String(30),default='registered',index=True)
    notes: Mapped[str]=mapped_column(Text,default='')
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    converted_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class PartnerCommission(Base):
    __tablename__='partner_commissions_v030'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    publisher_id: Mapped[str]=mapped_column(ForeignKey('marketplace_publishers_v030.id',ondelete='CASCADE'),index=True)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    asset_id: Mapped[str|None]=mapped_column(ForeignKey('marketplace_assets_v030.id',ondelete='SET NULL'),nullable=True,index=True)
    reference_type: Mapped[str]=mapped_column(String(50),index=True)
    reference_id: Mapped[str]=mapped_column(String(100),index=True)
    gross_amount_cents: Mapped[int]=mapped_column(BigInteger,default=0)
    commission_bps: Mapped[int]=mapped_column(Integer,default=0)
    commission_amount_cents: Mapped[int]=mapped_column(BigInteger,default=0)
    currency: Mapped[str]=mapped_column(String(10),default='BRL')
    status: Mapped[str]=mapped_column(String(30),default='pending',index=True)
    payable_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    paid_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

# V031 - Advanced Data Quality & Master Data Management
class QualityRulePackV031(Base):
    __tablename__='quality_rule_packs_v031'
    __table_args__=(UniqueConstraint('tenant_id','code',name='uq_quality_rule_pack_v031'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    code: Mapped[str]=mapped_column(String(80),index=True)
    name: Mapped[str]=mapped_column(String(180))
    domain: Mapped[str]=mapped_column(String(80),default='general',index=True)
    description: Mapped[str]=mapped_column(Text,default='')
    rules: Mapped[list]=mapped_column(JSON,default=list)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class DataCorrectionPolicyV031(Base):
    __tablename__='data_correction_policies_v031'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180))
    column_name: Mapped[str]=mapped_column(String(255),index=True)
    correction_type: Mapped[str]=mapped_column(String(50),index=True)
    config: Mapped[dict]=mapped_column(JSON,default=dict)
    on_failure: Mapped[str]=mapped_column(String(30),default='quarantine')
    priority: Mapped[int]=mapped_column(Integer,default=100)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class QualityCorrectionRunV031(Base):
    __tablename__='quality_correction_runs_v031'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    status: Mapped[str]=mapped_column(String(30),default='queued',index=True)
    dry_run: Mapped[bool]=mapped_column(Boolean,default=True)
    rows_read: Mapped[int]=mapped_column(Integer,default=0)
    rows_changed: Mapped[int]=mapped_column(Integer,default=0)
    rows_quarantined: Mapped[int]=mapped_column(Integer,default=0)
    output_object_key: Mapped[str]=mapped_column(String(1000),default='')
    checksum: Mapped[str]=mapped_column(String(128),default='')
    summary: Mapped[dict]=mapped_column(JSON,default=dict)
    error: Mapped[str]=mapped_column(Text,default='')
    initiated_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    started_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class StewardshipAssignmentV031(Base):
    __tablename__='stewardship_assignments_v031'
    __table_args__=(UniqueConstraint('tenant_id','domain','steward_id',name='uq_stewardship_assignment_v031'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    domain: Mapped[str]=mapped_column(String(100),index=True)
    owner_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True,index=True)
    steward_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    technical_owner_id: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True,index=True)
    approver_ids: Mapped[list]=mapped_column(JSON,default=list)
    active: Mapped[bool]=mapped_column(Boolean,default=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class MasterMergeProposalV031(Base):
    __tablename__='master_merge_proposals_v031'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    entity_type: Mapped[str]=mapped_column(String(50),index=True)
    survivor_id: Mapped[str]=mapped_column(ForeignKey('master_entities_v011.id',ondelete='CASCADE'),index=True)
    duplicate_ids: Mapped[list]=mapped_column(JSON,default=list)
    confidence_score: Mapped[int]=mapped_column(Integer,default=0,index=True)
    evidence: Mapped[dict]=mapped_column(JSON,default=dict)
    proposed_golden_data: Mapped[dict]=mapped_column(JSON,default=dict)
    status: Mapped[str]=mapped_column(String(30),default='pending',index=True)
    proposed_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    reviewed_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    reviewed_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class DataQualityScorecardV031(Base):
    __tablename__='data_quality_scorecards_v031'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    domain: Mapped[str]=mapped_column(String(100),default='general',index=True)
    overall_score: Mapped[int]=mapped_column(Integer,default=0)
    completeness_score: Mapped[int]=mapped_column(Integer,default=0)
    validity_score: Mapped[int]=mapped_column(Integer,default=0)
    uniqueness_score: Mapped[int]=mapped_column(Integer,default=0)
    consistency_score: Mapped[int]=mapped_column(Integer,default=0)
    freshness_score: Mapped[int]=mapped_column(Integer,default=0)
    invalid_rows: Mapped[int]=mapped_column(Integer,default=0)
    duplicate_rows: Mapped[int]=mapped_column(Integer,default=0)
    quarantined_rows: Mapped[int]=mapped_column(Integer,default=0)
    details: Mapped[dict]=mapped_column(JSON,default=dict)
    measured_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class AdvancedQuarantineRecordV031(Base):
    __tablename__='advanced_quarantine_records_v031'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    dataset_id: Mapped[str]=mapped_column(ForeignKey('datasets.id',ondelete='CASCADE'),index=True)
    correction_run_id: Mapped[str]=mapped_column(ForeignKey('quality_correction_runs_v031.id',ondelete='CASCADE'),index=True)
    policy_id: Mapped[str|None]=mapped_column(ForeignKey('data_correction_policies_v031.id',ondelete='SET NULL'),nullable=True,index=True)
    row_reference: Mapped[str]=mapped_column(String(300),default='')
    row_data: Mapped[dict]=mapped_column(JSON,default=dict)
    reason: Mapped[str]=mapped_column(Text,default='')
    status: Mapped[str]=mapped_column(String(30),default='quarantined',index=True)
    released_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    released_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)


# V032 - AI Studio and Agent Builder
class AIAgentVersionV032(Base):
    __tablename__='ai_agent_versions_v032'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    agent_id: Mapped[str]=mapped_column(ForeignKey('ai_agents_v027.id',ondelete='CASCADE'),index=True)
    version: Mapped[int]=mapped_column(Integer,default=1)
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    definition: Mapped[dict]=mapped_column(JSON,default=dict)
    change_notes: Mapped[str]=mapped_column(Text,default='')
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    approved_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    approved_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    __table_args__=(UniqueConstraint('agent_id','version',name='uq_ai_agent_version_v032'),)

class AIEvaluationSuiteV032(Base):
    __tablename__='ai_evaluation_suites_v032'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180))
    description: Mapped[str]=mapped_column(Text,default='')
    cases: Mapped[list]=mapped_column(JSON,default=list)
    thresholds: Mapped[dict]=mapped_column(JSON,default=dict)
    active: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class AIEvaluationRunV032(Base):
    __tablename__='ai_evaluation_runs_v032'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    suite_id: Mapped[str]=mapped_column(ForeignKey('ai_evaluation_suites_v032.id',ondelete='CASCADE'),index=True)
    agent_id: Mapped[str]=mapped_column(ForeignKey('ai_agents_v027.id',ondelete='CASCADE'),index=True)
    agent_version_id: Mapped[str|None]=mapped_column(ForeignKey('ai_agent_versions_v032.id',ondelete='SET NULL'),nullable=True)
    status: Mapped[str]=mapped_column(String(30),default='running',index=True)
    score: Mapped[int]=mapped_column(Integer,default=0)
    results: Mapped[list]=mapped_column(JSON,default=list)
    started_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    started_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class AIBudgetPolicyV032(Base):
    __tablename__='ai_budget_policies_v032'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    subject_type: Mapped[str]=mapped_column(String(30),default='tenant')
    subject_value: Mapped[str]=mapped_column(String(120),default='*')
    monthly_budget_micros: Mapped[int]=mapped_column(BigInteger,default=0)
    warning_percent: Mapped[int]=mapped_column(Integer,default=80)
    hard_block: Mapped[bool]=mapped_column(Boolean,default=True)
    allowed_model_ids: Mapped[list]=mapped_column(JSON,default=list)
    active: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    __table_args__=(UniqueConstraint('tenant_id','subject_type','subject_value',name='uq_ai_budget_subject_v032'),)

class AIAgentMemoryV032(Base):
    __tablename__='ai_agent_memory_v032'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    agent_id: Mapped[str]=mapped_column(ForeignKey('ai_agents_v027.id',ondelete='CASCADE'),index=True)
    user_id: Mapped[str]=mapped_column(ForeignKey('users.id',ondelete='CASCADE'),index=True)
    memory_type: Mapped[str]=mapped_column(String(30),default='preference',index=True)
    content: Mapped[str]=mapped_column(Text)
    metadata_json: Mapped[dict]=mapped_column(JSON,default=dict)
    expires_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

# V033 - Corporate Operating System and Digital Twin
class CorporateUnitV033(Base):
    __tablename__='corporate_units_v033'
    __table_args__=(UniqueConstraint('tenant_id','code',name='uq_corporate_unit_code_v033'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    code: Mapped[str]=mapped_column(String(80),index=True)
    name: Mapped[str]=mapped_column(String(180))
    unit_type: Mapped[str]=mapped_column(String(50),default='department',index=True)
    parent_unit_id: Mapped[str|None]=mapped_column(ForeignKey('corporate_units_v033.id',ondelete='SET NULL'),nullable=True,index=True)
    manager_id: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True,index=True)
    region: Mapped[str]=mapped_column(String(100),default='',index=True)
    country: Mapped[str]=mapped_column(String(80),default='')
    timezone: Mapped[str]=mapped_column(String(80),default='America/Sao_Paulo')
    metadata_json: Mapped[dict]=mapped_column(JSON,default=dict)
    active: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class CorporateProcessV033(Base):
    __tablename__='corporate_processes_v033'
    __table_args__=(UniqueConstraint('tenant_id','code',name='uq_corporate_process_code_v033'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    code: Mapped[str]=mapped_column(String(80),index=True)
    name: Mapped[str]=mapped_column(String(180))
    description: Mapped[str]=mapped_column(Text,default='')
    owner_id: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True,index=True)
    owner_unit_id: Mapped[str|None]=mapped_column(ForeignKey('corporate_units_v033.id',ondelete='SET NULL'),nullable=True,index=True)
    workflow_definition_id: Mapped[str|None]=mapped_column(ForeignKey('workflow_definitions.id',ondelete='SET NULL'),nullable=True,index=True)
    criticality: Mapped[str]=mapped_column(String(30),default='medium',index=True)
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    sla_minutes: Mapped[int]=mapped_column(Integer,default=0)
    nodes: Mapped[list]=mapped_column(JSON,default=list)
    edges: Mapped[list]=mapped_column(JSON,default=list)
    inputs: Mapped[list]=mapped_column(JSON,default=list)
    outputs: Mapped[list]=mapped_column(JSON,default=list)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class CorporateAssetV033(Base):
    __tablename__='corporate_assets_v033'
    __table_args__=(UniqueConstraint('tenant_id','asset_type','code',name='uq_corporate_asset_code_v033'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    asset_type: Mapped[str]=mapped_column(String(60),index=True)
    code: Mapped[str]=mapped_column(String(100),index=True)
    name: Mapped[str]=mapped_column(String(200))
    description: Mapped[str]=mapped_column(Text,default='')
    owner_unit_id: Mapped[str|None]=mapped_column(ForeignKey('corporate_units_v033.id',ondelete='SET NULL'),nullable=True,index=True)
    owner_id: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True,index=True)
    linked_resource_type: Mapped[str]=mapped_column(String(80),default='',index=True)
    linked_resource_id: Mapped[str]=mapped_column(String(80),default='',index=True)
    classification: Mapped[str]=mapped_column(String(30),default='internal',index=True)
    status: Mapped[str]=mapped_column(String(30),default='active',index=True)
    metadata_json: Mapped[dict]=mapped_column(JSON,default=dict)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class StrategicObjectiveV033(Base):
    __tablename__='strategic_objectives_v033'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    title: Mapped[str]=mapped_column(String(220))
    description: Mapped[str]=mapped_column(Text,default='')
    owner_id: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True,index=True)
    owner_unit_id: Mapped[str|None]=mapped_column(ForeignKey('corporate_units_v033.id',ondelete='SET NULL'),nullable=True,index=True)
    period_start: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    period_end: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    status: Mapped[str]=mapped_column(String(30),default='active',index=True)
    progress_percent: Mapped[int]=mapped_column(Integer,default=0)
    tags: Mapped[list]=mapped_column(JSON,default=list)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class KeyResultV033(Base):
    __tablename__='key_results_v033'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    objective_id: Mapped[str]=mapped_column(ForeignKey('strategic_objectives_v033.id',ondelete='CASCADE'),index=True)
    title: Mapped[str]=mapped_column(String(220))
    metric_code: Mapped[str]=mapped_column(String(120),default='',index=True)
    baseline_value: Mapped[float]=mapped_column(default=0.0)
    target_value: Mapped[float]=mapped_column(default=0.0)
    current_value: Mapped[float]=mapped_column(default=0.0)
    unit: Mapped[str]=mapped_column(String(40),default='number')
    direction: Mapped[str]=mapped_column(String(20),default='increase')
    semantic_model_id: Mapped[str|None]=mapped_column(ForeignKey('semantic_models_v015.id',ondelete='SET NULL'),nullable=True,index=True)
    metric_definition: Mapped[dict]=mapped_column(JSON,default=dict)
    weight: Mapped[int]=mapped_column(Integer,default=100)
    progress_percent: Mapped[int]=mapped_column(Integer,default=0)
    updated_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class OperatingKpiV033(Base):
    __tablename__='operating_kpis_v033'
    __table_args__=(UniqueConstraint('tenant_id','code',name='uq_operating_kpi_code_v033'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    code: Mapped[str]=mapped_column(String(100),index=True)
    name: Mapped[str]=mapped_column(String(200))
    description: Mapped[str]=mapped_column(Text,default='')
    owner_unit_id: Mapped[str|None]=mapped_column(ForeignKey('corporate_units_v033.id',ondelete='SET NULL'),nullable=True,index=True)
    owner_id: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True,index=True)
    semantic_model_id: Mapped[str|None]=mapped_column(ForeignKey('semantic_models_v015.id',ondelete='SET NULL'),nullable=True,index=True)
    metric_definition: Mapped[dict]=mapped_column(JSON,default=dict)
    target_value: Mapped[float]=mapped_column(default=0.0)
    warning_value: Mapped[float]=mapped_column(default=0.0)
    critical_value: Mapped[float]=mapped_column(default=0.0)
    current_value: Mapped[float]=mapped_column(default=0.0)
    unit: Mapped[str]=mapped_column(String(40),default='number')
    direction: Mapped[str]=mapped_column(String(20),default='increase')
    frequency: Mapped[str]=mapped_column(String(30),default='monthly')
    status: Mapped[str]=mapped_column(String(30),default='unknown',index=True)
    last_measured_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    active: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class DigitalTwinRelationV033(Base):
    __tablename__='digital_twin_relations_v033'
    __table_args__=(UniqueConstraint('tenant_id','source_type','source_id','relation_type','target_type','target_id',name='uq_twin_relation_v033'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    source_type: Mapped[str]=mapped_column(String(60),index=True)
    source_id: Mapped[str]=mapped_column(String(80),index=True)
    relation_type: Mapped[str]=mapped_column(String(80),index=True)
    target_type: Mapped[str]=mapped_column(String(60),index=True)
    target_id: Mapped[str]=mapped_column(String(80),index=True)
    metadata_json: Mapped[dict]=mapped_column(JSON,default=dict)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class OperatingRecommendationV033(Base):
    __tablename__='operating_recommendations_v033'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    title: Mapped[str]=mapped_column(String(220))
    rationale: Mapped[str]=mapped_column(Text,default='')
    source_type: Mapped[str]=mapped_column(String(60),default='manual',index=True)
    source_id: Mapped[str]=mapped_column(String(80),default='')
    priority: Mapped[str]=mapped_column(String(20),default='medium',index=True)
    proposed_action: Mapped[dict]=mapped_column(JSON,default=dict)
    status: Mapped[str]=mapped_column(String(30),default='proposed',index=True)
    owner_id: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True,index=True)
    approved_by: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True)
    approved_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

# V034 - Enterprise Deployment, Observability and Implementation Wizard
class ImplementationProjectV034(Base):
    __tablename__='implementation_projects_v034'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180),default='Implantação inicial')
    status: Mapped[str]=mapped_column(String(30),default='in_progress',index=True)
    current_step: Mapped[str]=mapped_column(String(80),default='company_profile')
    progress_percent: Mapped[int]=mapped_column(Integer,default=0)
    checklist: Mapped[list]=mapped_column(JSON,default=list)
    configuration: Mapped[dict]=mapped_column(JSON,default=dict)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'))
    started_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    completed_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class PlatformDiagnosticRunV034(Base):
    __tablename__='platform_diagnostic_runs_v034'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str|None]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),nullable=True,index=True)
    scope: Mapped[str]=mapped_column(String(40),default='platform',index=True)
    status: Mapped[str]=mapped_column(String(30),default='running',index=True)
    score: Mapped[int]=mapped_column(Integer,default=0)
    checks: Mapped[list]=mapped_column(JSON,default=list)
    recommendations: Mapped[list]=mapped_column(JSON,default=list)
    started_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    started_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class NativeBackupRunV034(Base):
    __tablename__='native_backup_runs_v034'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str|None]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),nullable=True,index=True)
    backup_type: Mapped[str]=mapped_column(String(30),default='metadata')
    status: Mapped[str]=mapped_column(String(30),default='running',index=True)
    file_path: Mapped[str]=mapped_column(Text,default='')
    checksum_sha256: Mapped[str]=mapped_column(String(64),default='')
    size_bytes: Mapped[int]=mapped_column(BigInteger,default=0)
    encrypted: Mapped[bool]=mapped_column(Boolean,default=False)
    error_message: Mapped[str]=mapped_column(Text,default='')
    started_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    started_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class PlatformReleaseV034(Base):
    __tablename__='platform_releases_v034'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    version: Mapped[str]=mapped_column(String(40),unique=True,index=True)
    channel: Mapped[str]=mapped_column(String(30),default='stable',index=True)
    package_path: Mapped[str]=mapped_column(Text,default='')
    checksum_sha256: Mapped[str]=mapped_column(String(64),default='')
    changelog: Mapped[str]=mapped_column(Text,default='')
    status: Mapped[str]=mapped_column(String(30),default='available',index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class PlatformUpdateRunV034(Base):
    __tablename__='platform_update_runs_v034'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    release_id: Mapped[str]=mapped_column(ForeignKey('platform_releases_v034.id',ondelete='RESTRICT'),index=True)
    status: Mapped[str]=mapped_column(String(30),default='planned',index=True)
    previous_version: Mapped[str]=mapped_column(String(40),default='')
    target_version: Mapped[str]=mapped_column(String(40),default='')
    backup_run_id: Mapped[str|None]=mapped_column(ForeignKey('native_backup_runs_v034.id',ondelete='SET NULL'),nullable=True)
    rollback_available: Mapped[bool]=mapped_column(Boolean,default=False)
    log: Mapped[list]=mapped_column(JSON,default=list)
    requested_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    requested_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)


# V035 - Enterprise Lakehouse Catalog, Snapshots and Native Parquet
class LakehouseCatalogV035(Base):
    __tablename__='lakehouse_catalogs_v035'
    __table_args__=(UniqueConstraint('tenant_id','code',name='uq_lakehouse_catalog_v035'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    code: Mapped[str]=mapped_column(String(80),index=True)
    name: Mapped[str]=mapped_column(String(180))
    catalog_type: Mapped[str]=mapped_column(String(30),default='native',index=True)
    warehouse_uri: Mapped[str]=mapped_column(Text,default='storage/lakehouse')
    trino_endpoint: Mapped[str]=mapped_column(Text,default='')
    configuration: Mapped[dict]=mapped_column(JSON,default=dict)
    status: Mapped[str]=mapped_column(String(30),default='active',index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class LakehouseTableV035(Base):
    __tablename__='lakehouse_tables_v035'
    __table_args__=(UniqueConstraint('tenant_id','catalog_id','namespace','name',name='uq_lakehouse_table_v035'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    catalog_id: Mapped[str]=mapped_column(ForeignKey('lakehouse_catalogs_v035.id',ondelete='CASCADE'),index=True)
    dataset_id: Mapped[str|None]=mapped_column(ForeignKey('datasets.id',ondelete='SET NULL'),nullable=True,index=True)
    namespace: Mapped[str]=mapped_column(String(120),default='default',index=True)
    name: Mapped[str]=mapped_column(String(180),index=True)
    friendly_name: Mapped[str]=mapped_column(String(220),default='')
    zone: Mapped[str]=mapped_column(String(20),default='bronze',index=True)
    format: Mapped[str]=mapped_column(String(20),default='parquet')
    schema_json: Mapped[list]=mapped_column(JSON,default=list)
    partition_spec: Mapped[list]=mapped_column(JSON,default=list)
    properties: Mapped[dict]=mapped_column(JSON,default=dict)
    current_snapshot_id: Mapped[str|None]=mapped_column(String(36),nullable=True,index=True)
    schema_version: Mapped[int]=mapped_column(Integer,default=1)
    status: Mapped[str]=mapped_column(String(30),default='active',index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class LakehouseSnapshotV035(Base):
    __tablename__='lakehouse_snapshots_v035'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    table_id: Mapped[str]=mapped_column(ForeignKey('lakehouse_tables_v035.id',ondelete='CASCADE'),index=True)
    parent_snapshot_id: Mapped[str|None]=mapped_column(ForeignKey('lakehouse_snapshots_v035.id',ondelete='SET NULL'),nullable=True,index=True)
    operation: Mapped[str]=mapped_column(String(30),default='append',index=True)
    manifest_path: Mapped[str]=mapped_column(Text,default='')
    schema_json: Mapped[list]=mapped_column(JSON,default=list)
    partition_spec: Mapped[list]=mapped_column(JSON,default=list)
    summary: Mapped[dict]=mapped_column(JSON,default=dict)
    row_count: Mapped[int]=mapped_column(BigInteger,default=0)
    file_count: Mapped[int]=mapped_column(Integer,default=0)
    total_bytes: Mapped[int]=mapped_column(BigInteger,default=0)
    checksum_sha256: Mapped[str]=mapped_column(String(64),default='')
    committed_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    committed_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

class LakehouseDataFileV035(Base):
    __tablename__='lakehouse_data_files_v035'
    __table_args__=(UniqueConstraint('tenant_id','table_id','file_path',name='uq_lakehouse_file_v035'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    table_id: Mapped[str]=mapped_column(ForeignKey('lakehouse_tables_v035.id',ondelete='CASCADE'),index=True)
    snapshot_id: Mapped[str]=mapped_column(ForeignKey('lakehouse_snapshots_v035.id',ondelete='CASCADE'),index=True)
    file_path: Mapped[str]=mapped_column(Text)
    file_format: Mapped[str]=mapped_column(String(20),default='parquet')
    partition_values: Mapped[dict]=mapped_column(JSON,default=dict)
    row_count: Mapped[int]=mapped_column(BigInteger,default=0)
    size_bytes: Mapped[int]=mapped_column(BigInteger,default=0)
    checksum_sha256: Mapped[str]=mapped_column(String(64),default='')
    column_stats: Mapped[dict]=mapped_column(JSON,default=dict)
    status: Mapped[str]=mapped_column(String(20),default='active',index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class LakehouseMaintenanceRunV035(Base):
    __tablename__='lakehouse_maintenance_runs_v035'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    table_id: Mapped[str]=mapped_column(ForeignKey('lakehouse_tables_v035.id',ondelete='CASCADE'),index=True)
    maintenance_type: Mapped[str]=mapped_column(String(40),index=True)
    status: Mapped[str]=mapped_column(String(30),default='running',index=True)
    parameters: Mapped[dict]=mapped_column(JSON,default=dict)
    result: Mapped[dict]=mapped_column(JSON,default=dict)
    error_message: Mapped[str]=mapped_column(Text,default='')
    started_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    started_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    finished_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

# V036 - Advanced BI and Report Designer
class BIThemeV036(Base):
    __tablename__='bi_themes_v036'
    __table_args__=(UniqueConstraint('tenant_id','code',name='uq_bi_theme_v036'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    code: Mapped[str]=mapped_column(String(80),index=True)
    name: Mapped[str]=mapped_column(String(160))
    tokens: Mapped[dict]=mapped_column(JSON,default=dict)
    is_default: Mapped[bool]=mapped_column(Boolean,default=False,index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class BIDashboardV036(Base):
    __tablename__='bi_dashboards_v036'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(200))
    description: Mapped[str]=mapped_column(Text,default='')
    semantic_model_id: Mapped[str|None]=mapped_column(ForeignKey('semantic_models_v015.id',ondelete='SET NULL'),nullable=True,index=True)
    lakehouse_table_id: Mapped[str|None]=mapped_column(ForeignKey('lakehouse_tables_v035.id',ondelete='SET NULL'),nullable=True,index=True)
    theme_id: Mapped[str|None]=mapped_column(ForeignKey('bi_themes_v036.id',ondelete='SET NULL'),nullable=True,index=True)
    layout: Mapped[dict]=mapped_column(JSON,default=dict)
    filters: Mapped[list]=mapped_column(JSON,default=list)
    bookmarks: Mapped[list]=mapped_column(JSON,default=list)
    responsive: Mapped[bool]=mapped_column(Boolean,default=True)
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id',ondelete='SET NULL'),nullable=True,index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class BIWidgetV036(Base):
    __tablename__='bi_widgets_v036'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    dashboard_id: Mapped[str]=mapped_column(ForeignKey('bi_dashboards_v036.id',ondelete='CASCADE'),index=True)
    title: Mapped[str]=mapped_column(String(200))
    visual_type: Mapped[str]=mapped_column(String(50),index=True)
    query_definition: Mapped[dict]=mapped_column(JSON,default=dict)
    visual_config: Mapped[dict]=mapped_column(JSON,default=dict)
    position: Mapped[dict]=mapped_column(JSON,default=dict)
    interactions: Mapped[dict]=mapped_column(JSON,default=dict)
    drill_config: Mapped[dict]=mapped_column(JSON,default=dict)
    conditional_formatting: Mapped[list]=mapped_column(JSON,default=list)
    sort_order: Mapped[int]=mapped_column(Integer,default=0)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class ReportTemplateV036(Base):
    __tablename__='report_templates_v036'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(200))
    description: Mapped[str]=mapped_column(Text,default='')
    page_config: Mapped[dict]=mapped_column(JSON,default=dict)
    sections: Mapped[list]=mapped_column(JSON,default=list)
    parameters: Mapped[list]=mapped_column(JSON,default=list)
    data_definition: Mapped[dict]=mapped_column(JSON,default=dict)
    output_formats: Mapped[list]=mapped_column(JSON,default=lambda:['html','csv','xlsx'])
    approval_required: Mapped[bool]=mapped_column(Boolean,default=False)
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class ReportRenderV036(Base):
    __tablename__='report_renders_v036'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    template_id: Mapped[str]=mapped_column(ForeignKey('report_templates_v036.id',ondelete='CASCADE'),index=True)
    requested_by: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    output_format: Mapped[str]=mapped_column(String(20),default='html')
    parameters: Mapped[dict]=mapped_column(JSON,default=dict)
    status: Mapped[str]=mapped_column(String(30),default='queued',index=True)
    file_path: Mapped[str]=mapped_column(Text,default='')
    checksum_sha256: Mapped[str]=mapped_column(String(64),default='')
    size_bytes: Mapped[int]=mapped_column(BigInteger,default=0)
    row_count: Mapped[int]=mapped_column(BigInteger,default=0)
    error_message: Mapped[str]=mapped_column(Text,default='')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)
    completed_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class BIShareLinkV036(Base):
    __tablename__='bi_share_links_v036'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    dashboard_id: Mapped[str]=mapped_column(ForeignKey('bi_dashboards_v036.id',ondelete='CASCADE'),index=True)
    token_hash: Mapped[str]=mapped_column(String(64),unique=True,index=True)
    expires_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    allowed_domains: Mapped[list]=mapped_column(JSON,default=list)
    require_authentication: Mapped[bool]=mapped_column(Boolean,default=True)
    active: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

# V037 - API Gateway and Integration Studio
class APICatalogV037(Base):
    __tablename__='api_catalog_v037'
    __table_args__=(UniqueConstraint('tenant_id','code',name='uq_api_catalog_v037'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    code: Mapped[str]=mapped_column(String(100),index=True)
    name: Mapped[str]=mapped_column(String(200))
    description: Mapped[str]=mapped_column(Text,default='')
    api_type: Mapped[str]=mapped_column(String(30),default='rest',index=True)
    base_url: Mapped[str]=mapped_column(Text,default='')
    specification: Mapped[dict]=mapped_column(JSON,default=dict)
    version: Mapped[str]=mapped_column(String(40),default='1.0.0')
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    visibility: Mapped[str]=mapped_column(String(20),default='private',index=True)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class APICredentialV037(Base):
    __tablename__='api_credentials_v037'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    api_id: Mapped[str]=mapped_column(ForeignKey('api_catalog_v037.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(160))
    auth_type: Mapped[str]=mapped_column(String(40),default='api_key')
    public_config: Mapped[dict]=mapped_column(JSON,default=dict)
    encrypted_secret: Mapped[str]=mapped_column(Text,default='')
    status: Mapped[str]=mapped_column(String(20),default='active',index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class APIPolicyV037(Base):
    __tablename__='api_policies_v037'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    api_id: Mapped[str]=mapped_column(ForeignKey('api_catalog_v037.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(160))
    policy_type: Mapped[str]=mapped_column(String(40),index=True)
    configuration: Mapped[dict]=mapped_column(JSON,default=dict)
    priority: Mapped[int]=mapped_column(Integer,default=100)
    enabled: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class APISubscriptionV037(Base):
    __tablename__='api_subscriptions_v037'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    api_id: Mapped[str]=mapped_column(ForeignKey('api_catalog_v037.id',ondelete='CASCADE'),index=True)
    consumer_name: Mapped[str]=mapped_column(String(180))
    consumer_type: Mapped[str]=mapped_column(String(30),default='application')
    key_hash: Mapped[str]=mapped_column(String(64),unique=True,index=True)
    scopes: Mapped[list]=mapped_column(JSON,default=list)
    quota_per_minute: Mapped[int]=mapped_column(Integer,default=60)
    status: Mapped[str]=mapped_column(String(20),default='active',index=True)
    expires_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class WebhookEndpointV037(Base):
    __tablename__='webhook_endpoints_v037'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    name: Mapped[str]=mapped_column(String(180))
    target_url: Mapped[str]=mapped_column(Text)
    event_types: Mapped[list]=mapped_column(JSON,default=list)
    secret_hash: Mapped[str]=mapped_column(String(64),default='')
    retry_policy: Mapped[dict]=mapped_column(JSON,default=dict)
    status: Mapped[str]=mapped_column(String(20),default='active',index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class APICallAuditV037(Base):
    __tablename__='api_call_audits_v037'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    api_id: Mapped[str|None]=mapped_column(ForeignKey('api_catalog_v037.id',ondelete='SET NULL'),nullable=True,index=True)
    subscription_id: Mapped[str|None]=mapped_column(ForeignKey('api_subscriptions_v037.id',ondelete='SET NULL'),nullable=True,index=True)
    method: Mapped[str]=mapped_column(String(12),default='GET')
    path: Mapped[str]=mapped_column(Text,default='')
    status_code: Mapped[int]=mapped_column(Integer,default=0,index=True)
    duration_ms: Mapped[int]=mapped_column(Integer,default=0)
    request_bytes: Mapped[int]=mapped_column(BigInteger,default=0)
    response_bytes: Mapped[int]=mapped_column(BigInteger,default=0)
    error_message: Mapped[str]=mapped_column(Text,default='')
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,index=True)

# V038 - BPMN and Low-Code Studio
class LowCodeApplicationV038(Base):
    __tablename__='lowcode_applications_v038'
    __table_args__=(UniqueConstraint('tenant_id','code',name='uq_lowcode_app_v038'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    code: Mapped[str]=mapped_column(String(100),index=True)
    name: Mapped[str]=mapped_column(String(200))
    description: Mapped[str]=mapped_column(Text,default='')
    icon: Mapped[str]=mapped_column(String(80),default='workflow')
    theme: Mapped[dict]=mapped_column(JSON,default=dict)
    navigation: Mapped[list]=mapped_column(JSON,default=list)
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class LowCodeFormV038(Base):
    __tablename__='lowcode_forms_v038'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    application_id: Mapped[str|None]=mapped_column(ForeignKey('lowcode_applications_v038.id',ondelete='CASCADE'),nullable=True,index=True)
    code: Mapped[str]=mapped_column(String(100),index=True)
    name: Mapped[str]=mapped_column(String(200))
    schema_json: Mapped[list]=mapped_column(JSON,default=list)
    layout: Mapped[dict]=mapped_column(JSON,default=dict)
    validation_rules: Mapped[list]=mapped_column(JSON,default=list)
    access_policy: Mapped[dict]=mapped_column(JSON,default=dict)
    version: Mapped[int]=mapped_column(Integer,default=1)
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class BPMNProcessV038(Base):
    __tablename__='bpmn_processes_v038'
    __table_args__=(UniqueConstraint('tenant_id','code',name='uq_bpmn_process_v038'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    application_id: Mapped[str|None]=mapped_column(ForeignKey('lowcode_applications_v038.id',ondelete='SET NULL'),nullable=True,index=True)
    code: Mapped[str]=mapped_column(String(100),index=True)
    name: Mapped[str]=mapped_column(String(200))
    description: Mapped[str]=mapped_column(Text,default='')
    owner_id: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    department_id: Mapped[str|None]=mapped_column(ForeignKey('departments.id',ondelete='SET NULL'),nullable=True,index=True)
    current_version: Mapped[int]=mapped_column(Integer,default=0)
    published_version: Mapped[int|None]=mapped_column(Integer,nullable=True)
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    updated_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow,onupdate=utcnow)

class BPMNProcessVersionV038(Base):
    __tablename__='bpmn_process_versions_v038'
    __table_args__=(UniqueConstraint('process_id','version',name='uq_bpmn_version_v038'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    process_id: Mapped[str]=mapped_column(ForeignKey('bpmn_processes_v038.id',ondelete='CASCADE'),index=True)
    version: Mapped[int]=mapped_column(Integer)
    nodes: Mapped[list]=mapped_column(JSON,default=list)
    edges: Mapped[list]=mapped_column(JSON,default=list)
    variables: Mapped[dict]=mapped_column(JSON,default=dict)
    sla_policy: Mapped[dict]=mapped_column(JSON,default=dict)
    change_notes: Mapped[str]=mapped_column(Text,default='')
    validation_result: Mapped[dict]=mapped_column(JSON,default=dict)
    status: Mapped[str]=mapped_column(String(30),default='draft',index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    approved_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    published_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class ProcessInstanceV038(Base):
    __tablename__='process_instances_v038'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    process_id: Mapped[str]=mapped_column(ForeignKey('bpmn_processes_v038.id',ondelete='CASCADE'),index=True)
    process_version_id: Mapped[str]=mapped_column(ForeignKey('bpmn_process_versions_v038.id'),index=True)
    business_key: Mapped[str]=mapped_column(String(180),default='',index=True)
    status: Mapped[str]=mapped_column(String(30),default='running',index=True)
    current_nodes: Mapped[list]=mapped_column(JSON,default=list)
    variables: Mapped[dict]=mapped_column(JSON,default=dict)
    started_by: Mapped[str]=mapped_column(ForeignKey('users.id'),index=True)
    started_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
    completed_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)

class HumanTaskV038(Base):
    __tablename__='human_tasks_v038'
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    instance_id: Mapped[str]=mapped_column(ForeignKey('process_instances_v038.id',ondelete='CASCADE'),index=True)
    node_id: Mapped[str]=mapped_column(String(120),index=True)
    name: Mapped[str]=mapped_column(String(200))
    assignee_id: Mapped[str|None]=mapped_column(ForeignKey('users.id',ondelete='SET NULL'),nullable=True,index=True)
    candidate_roles: Mapped[list]=mapped_column(JSON,default=list)
    candidate_departments: Mapped[list]=mapped_column(JSON,default=list)
    form_id: Mapped[str|None]=mapped_column(ForeignKey('lowcode_forms_v038.id',ondelete='SET NULL'),nullable=True)
    status: Mapped[str]=mapped_column(String(30),default='open',index=True)
    priority: Mapped[str]=mapped_column(String(20),default='normal')
    due_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True,index=True)
    payload: Mapped[dict]=mapped_column(JSON,default=dict)
    completed_by: Mapped[str|None]=mapped_column(ForeignKey('users.id'),nullable=True)
    completed_at: Mapped[datetime|None]=mapped_column(DateTime(timezone=True),nullable=True)
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)

class BusinessRuleV038(Base):
    __tablename__='business_rules_v038'
    __table_args__=(UniqueConstraint('tenant_id','code',name='uq_business_rule_v038'),)
    id: Mapped[str]=mapped_column(String(36),primary_key=True,default=uid)
    tenant_id: Mapped[str]=mapped_column(ForeignKey('tenants_v020.id',ondelete='CASCADE'),index=True)
    code: Mapped[str]=mapped_column(String(100),index=True)
    name: Mapped[str]=mapped_column(String(200))
    description: Mapped[str]=mapped_column(Text,default='')
    conditions: Mapped[list]=mapped_column(JSON,default=list)
    result: Mapped[dict]=mapped_column(JSON,default=dict)
    priority: Mapped[int]=mapped_column(Integer,default=100)
    active: Mapped[bool]=mapped_column(Boolean,default=True,index=True)
    created_by: Mapped[str]=mapped_column(ForeignKey('users.id'))
    created_at: Mapped[datetime]=mapped_column(DateTime(timezone=True),default=utcnow)
