"""SQLAlchemy models for order persistence.""" from datetime import datetime from typing import Any from uuid import UUID, uuid4 from sqlalchemy import BigInteger, DateTime, Integer, String, UniqueConstraint, Uuid, func from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column from sqlalchemy.types import JSON def _json_payload_type() -> JSON: return JSON().with_variant(JSONB, "postgresql") class Base(DeclarativeBase): pass class Order(Base): __tablename__ = "orders" __table_args__ = ( UniqueConstraint("order_uuid", name="uq_orders_order_uuid"), ) id: Mapped[UUID] = mapped_column( Uuid(as_uuid=True), primary_key=True, default=uuid4, ) order_uuid: Mapped[str] = mapped_column(String(128), nullable=False) payment_url: Mapped[str] = mapped_column(String(2048), nullable=False) price: Mapped[int] = mapped_column(Integer, nullable=False) tariff_code: Mapped[int] = mapped_column(Integer, nullable=False) account_email: Mapped[str] = mapped_column(String(320), nullable=False) payload: Mapped[dict[str, Any]] = mapped_column( _json_payload_type(), nullable=False, ) payment_status: Mapped[str | None] = mapped_column(String(64), nullable=True) tbank_payment_id: Mapped[int | None] = mapped_column(BigInteger, nullable=True) cdek_order_uuid: Mapped[str | None] = mapped_column(String(128), nullable=True) cdek_order_status: Mapped[str | None] = mapped_column(String(64), nullable=True) cdek_waybill_uuid: Mapped[str | None] = mapped_column(String(128), nullable=True) cdek_waybill_url: Mapped[str | None] = mapped_column(String(2048), nullable=True) cdek_polled_at: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True, ) waybill_email_sent_at: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True, ) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), nullable=False, ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False, )