2a107a42f3
- New DB models: credit_packages, subscription_plans, user_credits, credit_consumptions, credit_purchases - CreditService: balance, deduct, add_credits, grant_free_trial, history - User API: /api/v1/credits/* (balance/history/packages/purchase/subscribe) - Admin API: /api/v1/admin/credit-* (CRUD packages/plans, user credits, consumptions) - PaymentService.create_credit_order + handle_callback for credit purchases - Credit deduction on: discovery, translate, marketing, ai_chat, followup - Free trial 30 credits on registration - Documentation: docs/CREDIT_SYSTEM.md
38 lines
1.4 KiB
Python
38 lines
1.4 KiB
Python
from sqlalchemy import Column, String, Integer, Float, Boolean, DateTime
|
|
from sqlalchemy.dialects.postgresql import UUID
|
|
from datetime import datetime
|
|
from app.database import Base
|
|
import uuid
|
|
|
|
|
|
class CreditPackage(Base):
|
|
__tablename__ = "credit_packages"
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
name = Column(String(100), nullable=False)
|
|
name_en = Column(String(100), nullable=False)
|
|
credits = Column(Integer, nullable=False)
|
|
price = Column(Float, nullable=False)
|
|
price_usd = Column(Float)
|
|
original_price = Column(Float)
|
|
is_active = Column(Boolean, default=True)
|
|
sort_order = Column(Integer, default=0)
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
|
|
|
|
|
class SubscriptionPlan(Base):
|
|
__tablename__ = "subscription_plans"
|
|
|
|
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
|
name = Column(String(100), nullable=False)
|
|
name_en = Column(String(100), nullable=False)
|
|
credits_per_month = Column(Integer, nullable=False)
|
|
price = Column(Float, nullable=False)
|
|
price_usd = Column(Float)
|
|
duration_days = Column(Integer, default=30)
|
|
is_active = Column(Boolean, default=True)
|
|
sort_order = Column(Integer, default=0)
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|