Spaces:
Sleeping
Sleeping
| import json | |
| import logging | |
| from typing import Any, Dict | |
| from intelligence.models import BusinessScenario, ResourceRole | |
| from sqlalchemy.orm import Session | |
| logger = logging.getLogger(__name__) | |
| class ScenarioEngine: | |
| def __init__(self, db: Session): | |
| self.db = db | |
| def simulate_hiring_scenario(self, workspace_id: str, hiring_plan: Dict[str, int]) -> BusinessScenario: | |
| """ | |
| Simulate impact of hiring X people in Role Y. | |
| Input: {"Senior Engineer": 2} | |
| """ | |
| # 1. Calculate Cost Impact | |
| monthly_cost_increase = 0.0 | |
| capacity_increase_hours = 0.0 | |
| for role_name, count in hiring_plan.items(): | |
| role = self.db.query(ResourceRole).filter( | |
| ResourceRole.workspace_id == workspace_id, | |
| ResourceRole.name == role_name | |
| ).first() | |
| if role: | |
| # Assume 160 hrs/mo | |
| cost = role.hourly_cost * 160 * count | |
| monthly_cost_increase += cost | |
| capacity_increase_hours += (160 * count) | |
| else: | |
| logger.warning(f"Role {role_name} not found, skipping cost calc.") | |
| impact = { | |
| "monthly_cash_burn_increase": monthly_cost_increase, | |
| "monthly_capacity_increase_hours": capacity_increase_hours, | |
| "can_support_additional_revenue": capacity_increase_hours * 200 # Assume $200 billable rate | |
| } | |
| # Save Scenario | |
| scenario = BusinessScenario( | |
| workspace_id=workspace_id, | |
| name=f"Hiring Simulation: {json.dumps(hiring_plan)}", | |
| parameters_json=hiring_plan, | |
| impact_json=impact | |
| ) | |
| self.db.add(scenario) | |
| self.db.commit() | |
| return scenario | |