# app/modules/billing/services/billing_features.py """ Billing feature provider for the billing feature system. Declares billing-related billable features (invoicing, accounting export, basic shop, custom domain, white label) for feature gating. """ from __future__ import annotations import logging from typing import TYPE_CHECKING from app.modules.contracts.features import ( FeatureDeclaration, FeatureScope, FeatureType, FeatureUsage, ) if TYPE_CHECKING: from sqlalchemy.orm import Session logger = logging.getLogger(__name__) class BillingFeatureProvider: """Feature provider for the billing module. Declares: - invoice_lu: binary merchant-level feature for Luxembourg invoicing - invoice_eu_vat: binary merchant-level feature for EU VAT invoicing - invoice_bulk: binary merchant-level feature for bulk invoice generation - accounting_export: binary merchant-level feature for accounting data export - basic_shop: binary merchant-level feature for basic shop functionality - custom_domain: binary merchant-level feature for custom domain support - white_label: binary merchant-level feature for white-label branding """ @property def feature_category(self) -> str: return "billing" def get_feature_declarations(self) -> list[FeatureDeclaration]: return [ FeatureDeclaration( code="invoice_lu", name_key="billing.features.invoice_lu.name", description_key="billing.features.invoice_lu.description", category="billing", feature_type=FeatureType.BINARY, scope=FeatureScope.MERCHANT, ui_icon="file-text", display_order=10, ), FeatureDeclaration( code="invoice_eu_vat", name_key="billing.features.invoice_eu_vat.name", description_key="billing.features.invoice_eu_vat.description", category="billing", feature_type=FeatureType.BINARY, scope=FeatureScope.MERCHANT, ui_icon="globe", display_order=20, ), FeatureDeclaration( code="invoice_bulk", name_key="billing.features.invoice_bulk.name", description_key="billing.features.invoice_bulk.description", category="billing", feature_type=FeatureType.BINARY, scope=FeatureScope.MERCHANT, ui_icon="layers", display_order=30, ), FeatureDeclaration( code="accounting_export", name_key="billing.features.accounting_export.name", description_key="billing.features.accounting_export.description", category="billing", feature_type=FeatureType.BINARY, scope=FeatureScope.MERCHANT, ui_icon="download", display_order=40, ), FeatureDeclaration( code="basic_shop", name_key="billing.features.basic_shop.name", description_key="billing.features.basic_shop.description", category="billing", feature_type=FeatureType.BINARY, scope=FeatureScope.MERCHANT, ui_icon="shopping-bag", display_order=50, ), FeatureDeclaration( code="custom_domain", name_key="billing.features.custom_domain.name", description_key="billing.features.custom_domain.description", category="billing", feature_type=FeatureType.BINARY, scope=FeatureScope.MERCHANT, ui_icon="globe", display_order=60, ), FeatureDeclaration( code="white_label", name_key="billing.features.white_label.name", description_key="billing.features.white_label.description", category="billing", feature_type=FeatureType.BINARY, scope=FeatureScope.MERCHANT, ui_icon="award", display_order=70, ), ] def get_store_usage( self, db: Session, store_id: int, ) -> list[FeatureUsage]: return [] def get_merchant_usage( self, db: Session, merchant_id: int, platform_id: int, ) -> list[FeatureUsage]: return [] # Singleton instance for module registration billing_feature_provider = BillingFeatureProvider() __all__ = [ "BillingFeatureProvider", "billing_feature_provider", ]