from __future__ import annotations from datetime import UTC, datetime from decimal import Decimal from typing import Any from sqlalchemy import DateTime, ForeignKey, Index, Numeric, String, Text from sqlalchemy.orm import Mapped, mapped_column, relationship from app.models.base import BaseModel, ID_TYPE, TimestampMixin class GiftRecord(BaseModel, TimestampMixin): __tablename__ = "gift_records" __table_args__ = ( Index("idx_gift_records_household_id", "household_id"), Index("idx_gift_records_record_time", "record_time"), Index("idx_gift_records_household_record_time", "household_id", "record_time"), Index("idx_gift_records_record_type", "record_type"), Index("idx_gift_records_deleted_at", "deleted_at"), ) id: Mapped[int] = mapped_column(ID_TYPE, primary_key=True) household_id: Mapped[int] = mapped_column( ID_TYPE, ForeignKey("households.id", ondelete="RESTRICT"), nullable=False, ) record_type: Mapped[str] = mapped_column( String(32), nullable=False, default="cash_gift", ) amount: Mapped[Decimal | None] = mapped_column(Numeric(12, 2), nullable=True) gift_name: Mapped[str | None] = mapped_column(String(128), nullable=True) estimated_value: Mapped[Decimal | None] = mapped_column(Numeric(12, 2), nullable=True) method_option_id: Mapped[int | None] = mapped_column( ID_TYPE, ForeignKey("option_items.id", ondelete="RESTRICT"), nullable=True, ) scene_option_id: Mapped[int | None] = mapped_column( ID_TYPE, ForeignKey("option_items.id", ondelete="RESTRICT"), nullable=True, ) record_time: Mapped[datetime] = mapped_column( DateTime, nullable=False, default=lambda: datetime.now(UTC).replace(tzinfo=None), ) created_by: Mapped[int | None] = mapped_column( ID_TYPE, ForeignKey("accounts.id", ondelete="SET NULL"), nullable=True, ) updated_by: Mapped[int | None] = mapped_column( ID_TYPE, ForeignKey("accounts.id", ondelete="SET NULL"), nullable=True, ) deleted_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True) note: Mapped[str | None] = mapped_column(Text, nullable=True) household: Mapped[Any] = relationship("Household", back_populates="gift_records") method_option: Mapped[Any] = relationship( "OptionItem", foreign_keys=[method_option_id], back_populates="gift_records_as_method", ) scene_option: Mapped[Any] = relationship( "OptionItem", foreign_keys=[scene_option_id], back_populates="gift_records_as_scene", ) created_by_account: Mapped[Any] = relationship( "Account", foreign_keys=[created_by], back_populates="created_gift_records", ) updated_by_account: Mapped[Any] = relationship( "Account", foreign_keys=[updated_by], back_populates="updated_gift_records", )