using System; using System.Collections.Generic; namespace ODCWeb.Models.ViewModels { public class BudgetMonitorViewModel { public ODCProject Project { get; set; } public BudgetSummaryViewModel ProjectSummary { get; set; } public List ActionGroups { get; set; } } public class BudgetSummaryViewModel { // Calculated Budget (Original) public double TotalLaborCost { get; set; } public double TotalMaterialCost { get; set; } public double TotalCalculatedBudget { get; set; } // Modified Budget (Projected) public double TotalProjectedLaborCost { get; set; } public double TotalProjectedMaterialCost { get; set; } public double TotalProjectedBudget { get; set; } // Actual Budget public double TotalActualLaborCost { get; set; } public double TotalActualMaterialCost { get; set; } public double TotalBudgetLeft { get; set; } public double TotalProfitLoss { get; set; } // Variances public double CalculatedVsProjected { get; set; } public double ProjectedVsActual { get; set; } // Completion public int TotalTasks { get; set; } public int CompletedTasks { get; set; } public int InProgressTasks { get; set; } public int NotStartedTasks { get; set; } public double AverageCompletion { get; set; } // Calculated Properties public double OverallBudgetPerformance => TotalProjectedBudget > 0 ? ((TotalBudgetLeft / TotalProjectedBudget) * 100) : 0; public string BudgetHealthStatus { get { if (TotalProfitLoss > 0) return "Profitable"; if (TotalProfitLoss == 0) return "On Budget"; if (TotalBudgetLeft > TotalProjectedBudget * 0.1) return "Under Budget"; if (TotalBudgetLeft > 0) return "At Risk"; return "Over Budget"; } } } public class BudgetActionGroupViewModel { public FloorAction Action { get; set; } public Floor Floor { get; set; } public List Tasks { get; set; } public double TotalLaborCost => Tasks.Sum(t => t.Labor_Cost ?? 0); public double TotalMaterialCost => Tasks.Sum(t => t.Material_Cost ?? 0); public double TotalCalculatedBudget => Tasks.Sum(t => t.Mat_Lab ?? 0); public double TotalProjectedBudget => Tasks.Sum(t => t.M_Budget ?? 0); public double TotalActualCost => Tasks.Sum(t => (t.A_Labor_Cost ?? 0) + (t.A_Mat_Cost ?? 0)); public double TotalBudgetLeft => Tasks.Sum(t => t.A_Budget_Left ?? 0); public double TotalProfitLoss => Tasks.Sum(t => t.T_Profit_Loss ?? 0); public double AverageCompletion => Tasks.Any() ? Tasks.Average(t => t.Completion ?? 0) : 0; } }