from datetime import datetime, timezone from typing import Optional from sqlalchemy import DateTime, ForeignKey, Integer, String, Text, UniqueConstraint from sqlalchemy.orm import Mapped, mapped_column from app.db import Base class GeneratedContractVersion(Base): __tablename__ = "generated_contract_versions" __table_args__ = ( UniqueConstraint("tenant_id", "contract_id", "version_number", name="uq_generated_contract_versions_tenant_contract_number"), ) id: Mapped[str] = mapped_column(String(64), primary_key=True) tenant_id: Mapped[str] = mapped_column(String(64), nullable=False, index=True) contract_id: Mapped[str] = mapped_column(String(64), ForeignKey("generated_contracts.id"), nullable=False, index=True) review_id: Mapped[Optional[str]] = mapped_column(String(64), ForeignKey("review_tasks.id"), nullable=True, index=True) review_risk_action_id: Mapped[Optional[str]] = mapped_column( String(64), ForeignKey("review_risk_actions.id"), nullable=True, index=True, ) version_number: Mapped[int] = mapped_column(Integer, nullable=False, default=1, index=True) version_label: Mapped[str] = mapped_column(String(32), nullable=False) source_version_id: Mapped[Optional[str]] = mapped_column(String(64), nullable=True, index=True) change_type: Mapped[str] = mapped_column(String(64), nullable=False, default="review_suggestion") change_summary: Mapped[Optional[str]] = mapped_column(String(500), nullable=True) original_text: Mapped[Optional[str]] = mapped_column(Text, nullable=True) replacement_text: Mapped[Optional[str]] = mapped_column(Text, nullable=True) content: Mapped[str] = mapped_column(Text, nullable=False) locate_status: Mapped[str] = mapped_column(String(32), nullable=False, default="applied", index=True) created_by: Mapped[Optional[str]] = mapped_column(String(64), nullable=True, index=True) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc))