Files
construprogress/routes/web.php
T

137 lines
6.4 KiB
PHP

<?php
use App\Http\Controllers\ProfileController;
use App\Livewire\Reports\ReportsDashboard;
use App\Http\Controllers\ProjectController;
use App\Http\Controllers\OfflineSyncController;
use App\Livewire\ProjectMap;
use App\Livewire\ProjectList;
use App\Livewire\PhaseProgress;
use App\Http\Controllers\Auth\AuthenticatedSessionController;
use App\Http\Controllers\Auth\ConfirmablePasswordController;
use App\Http\Controllers\Auth\EmailVerificationNotificationController;
use App\Http\Controllers\Auth\EmailVerificationPromptController;
use App\Http\Controllers\Auth\NewPasswordController;
use App\Http\Controllers\Auth\PasswordController;
use App\Http\Controllers\Auth\PasswordResetLinkController;
use App\Http\Controllers\Auth\RegisteredUserController;
use App\Http\Controllers\Auth\VerifyEmailController;
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
*/
// Redirección raíz a dashboard (solo para usuarios autenticados)
Route::get('/', function () {
return redirect()->route('dashboard');
})->middleware(['auth']);
// Grupo de rutas protegidas por autenticación
Route::middleware(['auth'])->group(function () {
// Dashboard principal (vista con estadísticas y lista de proyectos)
Route::get('/dashboard', function () {
$user = \Illuminate\Support\Facades\Auth::user();
$projects = \App\Models\Project::accessibleBy($user)
->withCount('phases')
->with('phases')
->latest()
->take(5)
->get();
$allProjects = \App\Models\Project::accessibleBy($user);
$activeProjects = (clone $allProjects)->where('status', 'in_progress');
$totalPhases = \App\Models\Phase::whereIn('project_id', (clone $allProjects)->pluck('id'))->count();
$totalFeatures = \App\Models\Feature::whereIn('layer_id', function($q) use ($allProjects) {
$q->select('id')->from('layers')->whereIn('project_id', (clone $allProjects)->pluck('id'));
})->count();
$globalProgress = \App\Models\Phase::whereIn('project_id', (clone $allProjects)->pluck('id'))->avg('progress_percent') ?? 0;
$inspections = \App\Models\Inspection::whereIn('project_id', (clone $allProjects)->pluck('id'))
->with(['template', 'feature'])
->latest()
->take(5)
->get();
return view('dashboard', [
'stats' => [
'active_projects' => $activeProjects->count(),
'total_projects' => $allProjects->count(),
'total_phases' => $totalPhases,
'total_features' => $totalFeatures,
'global_progress' => round($globalProgress),
],
'recentProjects' => $projects,
'recentInspections' => $inspections,
]);
})->name('dashboard');
Route::get('/reports/dashboard', ReportsDashboard::class)->name('reports.dashboard');
Route::prefix('reports')->name('reports.')->group(function () {
Route::get('export/projects', [App\Http\Controllers\Reports\ExportController::class, 'exportProjects'])->name('export.projects');
Route::get('export/phases', [App\Http\Controllers\Reports\ExportController::class, 'exportPhases'])->name('export.phases');
Route::get('export/inspections', [App\Http\Controllers\Reports\ExportController::class, 'exportInspections'])->name('export.inspections');
});
// ------------------------------------------------------------
// Gestión de proyectos (CRUD completo)
// ------------------------------------------------------------
Route::resource('projects', ProjectController::class);
// Ruta personalizada para ver el mapa de un proyecto específico
Route::get('/projects/{project}/map', [ProjectController::class, 'map'])->name('projects.map');
// Ruta para que el componente Livewire muestre/gestione el progreso de una fase
Route::get('/phases/{phase}/progress', PhaseProgress::class)->name('phases.progress');
Route::get('/projects-list', ProjectList::class)->name('projects.list');
// Ruta para templates
Route::get('/projects/{project}/templates', function ($project) {
return view('projects.templates', ['project' => \App\Models\Project::findOrFail($project)]);
})->name('projects.templates')->middleware('can:edit projects');
// Rutas para el LayerManager:
Route::get('/projects/{project}/phases/{phase}/layers/manage', \App\Livewire\LayerManager::class)->name('layers.manage');
// Cliente: portal cliente
Route::middleware(['auth', 'role:client'])->prefix('client')->name('client.')->group(function () {
Route::get('/', function () {
return view('client.dashboard');
})->name('dashboard');
});
// Admin: gestión de usuarios y roles
Route::middleware(['can:manage all'])->prefix('admin')->name('admin.')->group(function () {
Route::get('/users', function () {
return view('admin.users');
})->name('users');
});
// Gestor de medios
Route::get('/projects/{project}/media', function (\App\Models\Project $project) {
return view('projects.media', compact('project'));
})->name('projects.media');
// ------------------------------------------------------------
// Sincronización offline (para trabajadores en campo)
// ------------------------------------------------------------
Route::post('/offline/pending', [OfflineSyncController::class, 'storePending'])->name('offline.store');
Route::post('/offline/sync', [OfflineSyncController::class, 'sync'])->name('offline.sync');
// ------------------------------------------------------------
// Perfil de usuario (proporcionado por Laravel Breeze)
// ------------------------------------------------------------
Route::get('/profile', [ProfileController::class, 'edit'])->name('profile');
//Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
Route::post('/logout', [AuthenticatedSessionController::class, 'destroy'])
->name('logout');
});
// Incluir rutas de autenticación (login, registro, recuperación de contraseña, logout)
require __DIR__ . '/auth.php';