from sqlalchemy.orm import DeclarativeMeta from app.modules.business import models from app.modules.business.constants import BusinessDomain DOMAIN_MODELS: dict[BusinessDomain, type[DeclarativeMeta]] = { BusinessDomain.PROJECTS: models.Project, BusinessDomain.TASKS: models.WorkTask, BusinessDomain.PROCUREMENTS: models.Procurement, BusinessDomain.EXPENSES: models.Expense, BusinessDomain.FUND_ACCOUNTS: models.FundAccount, BusinessDomain.POLICIES: models.Policy, BusinessDomain.STANDARDS: models.Standard, BusinessDomain.PERFORMANCE_METRICS: models.PerformanceMetric, BusinessDomain.SUPPLIERS: models.Supplier, BusinessDomain.ATTENDANCE_RECORDS: models.AttendanceRecord, BusinessDomain.WORK_REPORTS: models.WorkReport, BusinessDomain.RISK_EVENTS: models.RiskEvent, BusinessDomain.LEGACY_SYNC_RUNS: models.LegacySyncRun, } HIGH_RISK_DOMAINS = frozenset( { BusinessDomain.FUND_ACCOUNTS, BusinessDomain.PERFORMANCE_METRICS, } ) LOW_RISK_DOMAINS = frozenset(set(DOMAIN_MODELS) - HIGH_RISK_DOMAINS) def normalize_domain(domain: str | BusinessDomain) -> BusinessDomain: try: return BusinessDomain(domain) except ValueError as exc: supported = ", ".join(sorted(item.value for item in DOMAIN_MODELS)) raise KeyError(f"Unsupported domain '{domain}'. Supported: {supported}") from exc def supported_domain_values() -> list[str]: return sorted(item.value for item in DOMAIN_MODELS) def is_high_risk_domain(domain: str | BusinessDomain) -> bool: return normalize_domain(domain) in HIGH_RISK_DOMAINS def get_domain_model(domain: str | BusinessDomain) -> type[DeclarativeMeta]: return DOMAIN_MODELS[normalize_domain(domain)]