c44958ac16
Restores all 27 files changed by the security commit (f8a1310) and later work back to their7d854ffstate (2026-06-16 18:05), as requested. The security rewrite regressed map functionality (tabs, inspection editor, collapsing layers panel) without adding protections the7d854ffversion did not already have (XSS escaping + IDOR checks were already present). Done as a forward commit (no history rewrite / force-push) sof8a1310,a24c8a2and the merge remain in history and are fully recoverable. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
103 lines
3.4 KiB
PHP
103 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Reports;
|
|
|
|
use Livewire\Component;
|
|
use App\Models\Project;
|
|
use App\Models\Phase;
|
|
use App\Models\Inspection;
|
|
use Carbon\Carbon;
|
|
|
|
class ReportsDashboard extends Component
|
|
{
|
|
public $dateRange = 'month'; // week, month, quarter, year
|
|
public $chartData = [];
|
|
|
|
public function mount()
|
|
{
|
|
$this->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');
|
|
}
|
|
}
|