2026-08-24 12:32:08 +02:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
|
|
|
|
use App\DTO\ReportFilters;
|
|
|
|
|
use App\Models\Project;
|
|
|
|
|
use App\Services\ReportGenerator;
|
|
|
|
|
use Illuminate\Http\Request;
|
|
|
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
|
use Maatwebsite\Excel\Facades\Excel;
|
|
|
|
|
use App\Exports\ProjectReportExport;
|
|
|
|
|
|
|
|
|
|
class ReportController extends Controller
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* Show report builder for a project
|
|
|
|
|
*/
|
|
|
|
|
public function show(Project $project)
|
|
|
|
|
{
|
|
|
|
|
$this->authorizeProjectAccess($project);
|
|
|
|
|
|
2026-08-24 13:22:31 +02:00
|
|
|
return \Livewire\Livewire::mount(\App\Livewire\Reports\ReportBuilder::class, [
|
2026-08-24 12:32:08 +02:00
|
|
|
'project' => $project,
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Generate report (HTML preview or download)
|
|
|
|
|
*/
|
|
|
|
|
public function generate(Request $request, Project $project)
|
|
|
|
|
{
|
|
|
|
|
$this->authorizeProjectAccess($project);
|
|
|
|
|
|
|
|
|
|
$filters = ReportFilters::fromRequest($request->all());
|
|
|
|
|
$generator = new ReportGenerator($project, $filters);
|
|
|
|
|
$data = $generator->generate();
|
|
|
|
|
|
|
|
|
|
$format = $filters->format;
|
|
|
|
|
|
|
|
|
|
if ($format === 'excel') {
|
|
|
|
|
return $this->downloadExcel($project, $filters, $data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// HTML format (default) - render printable view
|
|
|
|
|
return view('reports.complete', $data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Preview partial (AJAX)
|
|
|
|
|
*/
|
|
|
|
|
public function preview(Request $request, Project $project)
|
|
|
|
|
{
|
|
|
|
|
$this->authorizeProjectAccess($project);
|
|
|
|
|
|
|
|
|
|
$filters = ReportFilters::fromRequest($request->all());
|
|
|
|
|
$generator = new ReportGenerator($project, $filters);
|
|
|
|
|
$data = $generator->generate();
|
|
|
|
|
|
|
|
|
|
return view('reports.partials._preview', $data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Download Excel export
|
|
|
|
|
*/
|
|
|
|
|
protected function downloadExcel(Project $project, ReportFilters $filters, array $data)
|
|
|
|
|
{
|
|
|
|
|
$export = new ProjectReportExport($project, $filters, $data);
|
|
|
|
|
$filename = 'informe_' . $project->name . '_' . now()->format('Ymd_His') . '.xlsx';
|
|
|
|
|
|
|
|
|
|
return Excel::download($export, $filename);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Authorize access to project
|
|
|
|
|
*/
|
|
|
|
|
protected function authorizeProjectAccess(Project $project): void
|
|
|
|
|
{
|
|
|
|
|
$user = Auth::user();
|
|
|
|
|
|
|
|
|
|
if ($user->can('manage all')) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!$project->users()->where('user_id', $user->id)->exists()) {
|
|
|
|
|
abort(403, 'No tienes acceso a este proyecto.');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|