Restore operator platform costs (Bubble, domains, Stripe) with monthly history from March 2025 and member payments from November 2025. Track €1,000 starting budget, cumulative burn, and remaining liquidity in the economics dashboard. Document LQ requirements in REQUIREMENTS.md.
108 lines
No EOL
2.2 KiB
Python
108 lines
No EOL
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from decimal import Decimal
|
|
from typing import Literal
|
|
|
|
CostCategory = Literal["fixed", "variable"]
|
|
MemberStatus = Literal["active", "churned", "paused"]
|
|
PricingModelStatus = Literal["active", "candidate", "retired"]
|
|
LiquidityStatus = Literal["burning", "neutral", "generating"]
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Product:
|
|
id: str
|
|
name: str
|
|
lifecycle_phase: str
|
|
currency: str
|
|
description: str
|
|
active_pricing_model_id: str
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class PricingModel:
|
|
id: str
|
|
name: str
|
|
model_type: str
|
|
lifecycle_phase: str
|
|
currency: str
|
|
access_fee_amount: Decimal
|
|
access_fee_cadence: str
|
|
status: PricingModelStatus
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class CostEntry:
|
|
id: str
|
|
name: str
|
|
category: CostCategory
|
|
amount: Decimal
|
|
currency: str
|
|
cadence: str
|
|
allocation: str
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class MonthlyPlatformCost:
|
|
period: str
|
|
platform_cost: Decimal
|
|
active_members: int
|
|
gross_revenue: Decimal
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Budget:
|
|
currency: str
|
|
initial_budget: Decimal
|
|
started: str
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class RevenueEntry:
|
|
id: str
|
|
period: str
|
|
gross_amount: Decimal
|
|
fees_amount: Decimal
|
|
refunds_amount: Decimal
|
|
net_amount: Decimal
|
|
currency: str
|
|
source: str
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class MembershipRecord:
|
|
id: str
|
|
status: MemberStatus
|
|
joined_at: str
|
|
plan_id: str
|
|
churned_at: str | None = None
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class EconomicsSnapshot:
|
|
period: str
|
|
currency: str
|
|
active_members: int
|
|
monthly_revenue: Decimal
|
|
monthly_platform_cost: Decimal
|
|
cost_per_member: Decimal
|
|
gross_margin: Decimal
|
|
gross_margin_pct: Decimal
|
|
pricing_model_count: int
|
|
revenue_source: str
|
|
period_net_liquidity: Decimal
|
|
liquidity_status: LiquidityStatus
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class LiquiditySummary:
|
|
currency: str
|
|
through_period: str
|
|
initial_budget: Decimal
|
|
cumulative_member_payments: Decimal
|
|
cumulative_platform_cost: Decimal
|
|
cumulative_net_liquidity: Decimal
|
|
remaining_budget: Decimal
|
|
liquidity_status: LiquidityStatus
|
|
months_tracked: int |