feat: credit-based billing system
- 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
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
from sqlalchemy import Column, String, Float, Boolean, DateTime, ForeignKey, Integer, Date
|
||||
from sqlalchemy.dialects.postgresql import UUID
|
||||
from datetime import datetime
|
||||
from app.database import Base
|
||||
import uuid
|
||||
|
||||
|
||||
class UserCredit(Base):
|
||||
__tablename__ = "user_credits"
|
||||
|
||||
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False, unique=True, index=True)
|
||||
balance = Column(Float, default=0)
|
||||
total_purchased = Column(Float, default=0)
|
||||
total_used = Column(Float, default=0)
|
||||
|
||||
subscription_plan_id = Column(UUID(as_uuid=True), ForeignKey("subscription_plans.id"), nullable=True)
|
||||
subscription_expires_at = Column(DateTime, nullable=True)
|
||||
subscription_auto_renew = Column(Boolean, default=False)
|
||||
|
||||
free_trial_used = Column(Boolean, default=False)
|
||||
daily_translate_chars = Column(Integer, default=0)
|
||||
daily_translate_date = Column(Date, nullable=True)
|
||||
|
||||
created_at = Column(DateTime, default=datetime.utcnow)
|
||||
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
Reference in New Issue
Block a user