diff --git a/README.md b/README.md index 8c673ea..7fbe601 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ConstruProgress +# Avante Sistema de gestión de proyectos de construcción con mapas interactivos, control de progreso, inspecciones y soporte offline. diff --git a/app/Livewire/Reports/ReportsDashboard.php b/app/Livewire/Reports/ReportsDashboard.php new file mode 100644 index 0000000..03b3417 --- /dev/null +++ b/app/Livewire/Reports/ReportsDashboard.php @@ -0,0 +1,102 @@ +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'); + } +} diff --git a/public/manifest.json b/public/manifest.json index 6429d0a..c3d3a3b 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -1,6 +1,6 @@ { - "name": "ConstruProgress", - "short_name": "ConstruProg", + "name": "Avante", + "short_name": "Avante", "description": "App para gestión de proyectos de construcción", "start_url": "/", "display": "standalone", diff --git a/resources/views/livewire/reports/reports-dashboard.blade.php b/resources/views/livewire/reports/reports-dashboard.blade.php new file mode 100644 index 0000000..33553c4 --- /dev/null +++ b/resources/views/livewire/reports/reports-dashboard.blade.php @@ -0,0 +1,294 @@ +
Cargando datos...
+