# app/modules/billing/definition.py """ Billing module definition. Defines the billing module including its features, menu items, and route configurations. """ from app.modules.base import ModuleDefinition from models.database.admin_menu_config import FrontendType def _get_admin_router(): """Lazy import of admin router to avoid circular imports.""" from app.modules.billing.routes.admin import admin_router return admin_router def _get_vendor_router(): """Lazy import of vendor router to avoid circular imports.""" from app.modules.billing.routes.vendor import vendor_router return vendor_router # Billing module definition billing_module = ModuleDefinition( code="billing", name="Billing & Subscriptions", description=( "Subscription tier management, vendor billing, payment processing, " "and invoice history. Integrates with Stripe for payment collection." ), features=[ "subscription_management", # Manage subscription tiers "billing_history", # View invoices and payment history "stripe_integration", # Stripe payment processing "invoice_generation", # Generate and download invoices "subscription_analytics", # Subscription stats and metrics "trial_management", # Manage vendor trial periods "limit_overrides", # Override tier limits per vendor ], menu_items={ FrontendType.ADMIN: [ "subscription-tiers", # Manage tier definitions "subscriptions", # View/manage vendor subscriptions "billing-history", # View all invoices ], FrontendType.VENDOR: [ "billing", # Vendor billing dashboard "invoices", # Vendor invoice history ], }, is_core=False, # Billing can be disabled (e.g., internal platforms) ) def get_billing_module_with_routers() -> ModuleDefinition: """ Get billing module with routers attached. This function attaches the routers lazily to avoid circular imports during module initialization. """ billing_module.admin_router = _get_admin_router() billing_module.vendor_router = _get_vendor_router() return billing_module __all__ = ["billing_module", "get_billing_module_with_routers"]