|
|
| import logging |
| from typing import Any, Dict |
| from finance.forensics_service import FinancialForensicsService |
| from operations.business_health_service import BusinessHealthService |
| from protection.customer_protection_service import CustomerProtectionService |
| from sqlalchemy.orm import Session |
|
|
| logger = logging.getLogger(__name__) |
|
|
| class SystemIntelligenceService: |
| def __init__(self, db: Session): |
| self.db = db |
| self.health_service = BusinessHealthService(db) |
| self.forensics_service = FinancialForensicsService(db) |
| self.protection_service = CustomerProtectionService(db) |
|
|
| def get_aggregated_context(self, workspace_id: str = "default") -> str: |
| """ |
| Aggregates critical business intelligence into a natural language summary |
| for the Main Chat agent. |
| """ |
| context_parts = [] |
| |
| |
| try: |
| health = self.health_service.get_business_health_score(workspace_id) |
| score = health.get("score", 0) |
| status = health.get("status", "Unknown") |
| context_parts.append(f"Business Health is {status} (Score: {score}/100).") |
| except Exception as e: |
| logger.error(f"Error fetching health context: {e}") |
|
|
| |
| try: |
| priorities = self.health_service.get_daily_priorities(workspace_id) |
| if priorities: |
| top_3 = ", ".join([p["title"] for p in priorities[:3]]) |
| context_parts.append(f"Top priorities today: {top_3}.") |
| except Exception as e: |
| logger.error(f"Error fetching priority context: {e}") |
|
|
| |
| try: |
| drift = self.forensics_service.analyze_vendor_price_drift(workspace_id) |
| if drift: |
| vendors = ", ".join([d["vendor_name"] for d in drift]) |
| context_parts.append(f"ALERT: Price drift detected for {vendors}.") |
| except Exception as e: |
| logger.error(f"Error fetching forensics context: {e}") |
|
|
| |
| try: |
| churn = self.protection_service.predict_churn_risk(workspace_id) |
| if churn: |
| risky_clients = ", ".join([c["client_name"] for c in churn]) |
| context_parts.append(f"WARNING: Churn risk detected for {risky_clients}.") |
| except Exception as e: |
| logger.error(f"Error fetching churn context: {e}") |
|
|
| return " ".join(context_parts) |
|
|