loadChartData(); } public function loadChartData() { // Project progress over time (last 6 months) $projects = Project::with(['phases' => function($query) { $query->select('project_id', 'progress_percent', 'updated_at'); }])->get(); // Simulate monthly progress data (since we don't have historical stored) // In a real app, we'd have a progress_history table or similar $months = []; $current = Carbon::now(); for ($i = 5; $i >= 0; $i--) { $month = $current->copy()->subMonths($i); $months[] = $month->format('M Y'); } $projectProgress = []; foreach ($projects as $project) { $progressData = []; foreach ($months as $month) { // For demo, we'll use current progress with some variation $avgProgress = $project->phases->avg('progress_percent') ?? 0; // Add some random variation for demo purposes $variation = rand(-10, 10); $progress = max(0, min(100, $avgProgress + $variation)); $progressData[] = round($progress); } $projectProgress[] = [ 'name' => $project->name, 'data' => $progressData ]; } // Inspections by type (last 6 months) $inspections = Inspection::with(['template', 'feature']) ->whereDate('created_at', '>=', Carbon::now()->subMonths(6)) ->get(); $inspectionTypes = $inspections->groupBy(function($inspection) { return $inspection->template ? $inspection->template->name : 'Sin plantilla'; })->map(function($group) { return $group->count(); }); // Projects by status $projectsByStatus = Project::selectRaw('status, count(*) as count') ->groupBy('status') ->pluck('count', 'status') ->toArray(); // Average phase progress by project $projectPhaseProgress = Project::with(['phases']) ->get() ->map(function($project) { return [ 'name' => $project->name, 'progress' => $project->phases->avg('progress_percent') ?? 0 ]; }); $this->chartData = [ 'months' => $months, 'projectProgress' => $projectProgress, 'inspectionTypes' => [ 'labels' => $inspectionTypes->keys()->toArray(), 'data' => $inspectionTypes->values()->toArray() ], 'projectsByStatus' => [ 'labels' => array_map(function($status) { return ucfirst(str_replace('_', ' ', $status)); }, array_keys($projectsByStatus)), 'data' => array_values($projectsByStatus) ], 'projectPhaseProgress' => $projectPhaseProgress ]; } public function render() { return view('livewire.reports.reports-dashboard'); } }