# app/modules/billing/routes/pages/platform.py """ Billing Platform Page Routes (HTML rendering). Platform (unauthenticated) pages for pricing and signup: - Pricing page - Signup wizard - Signup success """ from fastapi import APIRouter, Depends, Request from fastapi.responses import HTMLResponse from sqlalchemy.orm import Session from app.core.database import get_db from app.modules.core.utils.page_context import get_platform_context from app.templates_config import templates router = APIRouter() def _get_tiers_data(db: Session) -> list[dict]: """Build tier data for display in templates from database.""" from app.modules.billing.models import SubscriptionTier, TierCode tiers_db = ( db.query(SubscriptionTier) .filter( SubscriptionTier.is_active == True, SubscriptionTier.is_public == True, ) .order_by(SubscriptionTier.display_order) .all() ) tiers = [] for tier in tiers_db: feature_codes = sorted(tier.get_feature_codes()) tiers.append({ "code": tier.code, "name": tier.name, "price_monthly": tier.price_monthly_cents / 100, "price_annual": (tier.price_annual_cents / 100) if tier.price_annual_cents else None, "feature_codes": feature_codes, "products_limit": tier.get_limit_for_feature("products_limit"), "orders_per_month": tier.get_limit_for_feature("orders_per_month"), "team_members": tier.get_limit_for_feature("team_members"), "is_popular": tier.code == TierCode.PROFESSIONAL.value, "is_enterprise": tier.code == TierCode.ENTERPRISE.value, }) return tiers # ============================================================================ # PRICING PAGE # ============================================================================ @router.get("/pricing", response_class=HTMLResponse, name="platform_pricing") async def pricing_page( request: Request, db: Session = Depends(get_db), ): """ Standalone pricing page with detailed tier comparison. """ context = get_platform_context(request, db) context["tiers"] = _get_tiers_data(db) context["page_title"] = "Pricing" return templates.TemplateResponse( "billing/platform/pricing.html", context, ) # ============================================================================ # SIGNUP WIZARD # ============================================================================ @router.get("/signup", response_class=HTMLResponse, name="platform_signup") async def signup_page( request: Request, tier: str | None = None, annual: bool = False, db: Session = Depends(get_db), ): """ Multi-step signup wizard. Query params: - tier: Pre-selected tier code - annual: Pre-select annual billing """ context = get_platform_context(request, db) context["page_title"] = "Start Your Free Trial" context["selected_tier"] = tier context["is_annual"] = annual context["tiers"] = _get_tiers_data(db) return templates.TemplateResponse( "billing/platform/signup.html", context, ) @router.get( "/signup/success", response_class=HTMLResponse, name="platform_signup_success" ) async def signup_success_page( request: Request, store_code: str | None = None, db: Session = Depends(get_db), ): """ Signup success page. Shown after successful account creation. """ context = get_platform_context(request, db) context["page_title"] = "Welcome to Orion!" context["store_code"] = store_code return templates.TemplateResponse( "billing/platform/signup-success.html", context, )