Files

70 lines
2.0 KiB
Python

"""Tariff models for VoIdea."""
from datetime import datetime
from decimal import Decimal
from typing import Any, Optional
from sqlalchemy import Boolean, ForeignKey, Numeric, String, Text
from sqlalchemy.dialects.postgresql import JSONB, UUID
from sqlalchemy.orm import Mapped, mapped_column
from app.core.base import SQLBase, TimestampMixin, UUIDMixin
class TariffPlan(SQLBase, UUIDMixin, TimestampMixin):
__tablename__ = "tariff_plans"
name: Mapped[str] = mapped_column(
String(100), nullable=False
)
code: Mapped[str] = mapped_column(
String(50), unique=True, nullable=False, index=True
)
description: Mapped[Optional[str]] = mapped_column(
Text, nullable=True
)
price_monthly: Mapped[Decimal] = mapped_column(
Numeric(10, 2), default=0, nullable=False
)
price_yearly: Mapped[Optional[Decimal]] = mapped_column(
Numeric(10, 2), nullable=True
)
features: Mapped[Optional[dict[str, Any]]] = mapped_column(
JSONB, nullable=True, default=None
)
is_active: Mapped[bool] = mapped_column(
Boolean, default=True, nullable=False
)
sort_order: Mapped[int] = mapped_column(
default=0, nullable=False
)
class UserSubscription(SQLBase, UUIDMixin, TimestampMixin):
__tablename__ = "user_subscriptions"
user_id: Mapped[UUID] = mapped_column(
UUID(as_uuid=True),
ForeignKey("users.id", ondelete="CASCADE"),
unique=True,
nullable=False,
index=True,
)
plan_id: Mapped[UUID] = mapped_column(
UUID(as_uuid=True),
ForeignKey("tariff_plans.id", ondelete="RESTRICT"),
nullable=False,
)
status: Mapped[str] = mapped_column(
String(20), default="active", nullable=False, index=True
)
current_period_start: Mapped[Optional[datetime]] = mapped_column(
nullable=True
)
current_period_end: Mapped[Optional[datetime]] = mapped_column(
nullable=True
)
canceled_at: Mapped[Optional[datetime]] = mapped_column(
nullable=True
)