Add subcription feature

This commit is contained in:
Urtzi Alfaro
2026-01-13 22:22:38 +01:00
parent b931a5c45e
commit 6ddf608d37
61 changed files with 7915 additions and 1238 deletions

View File

@@ -10,6 +10,7 @@ Multi-tenant management and subscription handling
from shared.config.base import BaseServiceSettings
import os
from typing import Dict, Tuple, ClassVar
class TenantSettings(BaseServiceSettings):
"""Tenant service specific settings"""
@@ -66,6 +67,17 @@ class TenantSettings(BaseServiceSettings):
BILLING_CURRENCY: str = os.getenv("BILLING_CURRENCY", "EUR")
BILLING_CYCLE_DAYS: int = int(os.getenv("BILLING_CYCLE_DAYS", "30"))
# Stripe Proration Configuration
DEFAULT_PRORATION_BEHAVIOR: str = os.getenv("DEFAULT_PRORATION_BEHAVIOR", "create_prorations")
UPGRADE_PRORATION_BEHAVIOR: str = os.getenv("UPGRADE_PRORATION_BEHAVIOR", "create_prorations")
DOWNGRADE_PRORATION_BEHAVIOR: str = os.getenv("DOWNGRADE_PRORATION_BEHAVIOR", "none")
BILLING_CYCLE_CHANGE_PRORATION: str = os.getenv("BILLING_CYCLE_CHANGE_PRORATION", "create_prorations")
# Stripe Subscription Update Settings
STRIPE_BILLING_CYCLE_ANCHOR: str = os.getenv("STRIPE_BILLING_CYCLE_ANCHOR", "unchanged")
STRIPE_PAYMENT_BEHAVIOR: str = os.getenv("STRIPE_PAYMENT_BEHAVIOR", "error_if_incomplete")
ALLOW_IMMEDIATE_SUBSCRIPTION_CHANGES: bool = os.getenv("ALLOW_IMMEDIATE_SUBSCRIPTION_CHANGES", "true").lower() == "true"
# Resource Limits
MAX_API_CALLS_PER_MINUTE: int = int(os.getenv("MAX_API_CALLS_PER_MINUTE", "100"))
MAX_STORAGE_MB: int = int(os.getenv("MAX_STORAGE_MB", "1024"))
@@ -89,6 +101,24 @@ class TenantSettings(BaseServiceSettings):
STRIPE_PUBLISHABLE_KEY: str = os.getenv("STRIPE_PUBLISHABLE_KEY", "")
STRIPE_SECRET_KEY: str = os.getenv("STRIPE_SECRET_KEY", "")
STRIPE_WEBHOOK_SECRET: str = os.getenv("STRIPE_WEBHOOK_SECRET", "")
# Stripe Price IDs for subscription plans
STARTER_MONTHLY_PRICE_ID: str = os.getenv("STARTER_MONTHLY_PRICE_ID", "price_1Sp0p3IzCdnBmAVT2Gs7z5np")
STARTER_YEARLY_PRICE_ID: str = os.getenv("STARTER_YEARLY_PRICE_ID", "price_1Sp0twIzCdnBmAVTD1lNLedx")
PROFESSIONAL_MONTHLY_PRICE_ID: str = os.getenv("PROFESSIONAL_MONTHLY_PRICE_ID", "price_1Sp0w7IzCdnBmAVTp0Jxhh1u")
PROFESSIONAL_YEARLY_PRICE_ID: str = os.getenv("PROFESSIONAL_YEARLY_PRICE_ID", "price_1Sp0yAIzCdnBmAVTLoGl4QCb")
ENTERPRISE_MONTHLY_PRICE_ID: str = os.getenv("ENTERPRISE_MONTHLY_PRICE_ID", "price_1Sp0zAIzCdnBmAVTXpApF7YO")
ENTERPRISE_YEARLY_PRICE_ID: str = os.getenv("ENTERPRISE_YEARLY_PRICE_ID", "price_1Sp15mIzCdnBmAVTuxffMpV5")
# Price ID mapping for easy lookup
STRIPE_PRICE_ID_MAPPING: ClassVar[Dict[Tuple[str, str], str]] = {
('starter', 'monthly'): STARTER_MONTHLY_PRICE_ID,
('starter', 'yearly'): STARTER_YEARLY_PRICE_ID,
('professional', 'monthly'): PROFESSIONAL_MONTHLY_PRICE_ID,
('professional', 'yearly'): PROFESSIONAL_YEARLY_PRICE_ID,
('enterprise', 'monthly'): ENTERPRISE_MONTHLY_PRICE_ID,
('enterprise', 'yearly'): ENTERPRISE_YEARLY_PRICE_ID,
}
# ============================================================
# SCHEDULER CONFIGURATION