Files
construprogress/routes/web.php
T
javier 7e997bc6aa feat(home): dashboard ligero renombrado a "Home"
- Sustituye el panel saturado de estadísticas por una vista "Home" centrada en lo
  del usuario: mis proyectos (compacto), mis tareas pendientes, incidencias asignadas
  y notificaciones recientes. Sin inundar de detalle (mejor con muchos proyectos).
- Etiqueta "Dashboard" -> "Home" en el menú y la cabecera.
- Elimina el orderByRaw FIELD() (solo MySQL) del antiguo dashboard.
- ExampleTest: ahora valida la conducta real (la raíz redirige a login).

Suite: 71 passing (0 fallos; resueltas las 2 pre-existentes de SQLite).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 17:24:30 +02:00

148 lines
8.8 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\Projects\ProjectMap;
use App\Livewire\Projects\ProjectList;
use App\Livewire\Phases\PhaseProgress;
use App\Livewire\Phases\PhaseGantt;
use App\Http\Controllers\ProjectReportController;
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 () {
// Home: vista ligera (proyectos, tareas e incidencias del usuario + notificaciones)
Route::get('/dashboard', function () {
$user = \Illuminate\Support\Facades\Auth::user();
$projects = \App\Models\Project::accessibleBy($user)
->with(['phases' => fn ($q) => $q->select('id', 'project_id', 'progress_percent')])
->orderBy('name')->take(8)->get();
$projectsCount = \App\Models\Project::accessibleBy($user)->count();
$myTasks = \App\Models\IssueTask::where('assigned_to', $user->id)
->where('is_done', false)
->with('issue.project')
->orderByRaw('due_date IS NULL, due_date ASC')
->take(8)->get();
$myTasksCount = \App\Models\IssueTask::where('assigned_to', $user->id)->where('is_done', false)->count();
$myIssues = \App\Models\Issue::where('assigned_to', $user->id)
->whereIn('status', ['open', 'in_review'])
->with('project')
->latest()->take(6)->get();
$myIssuesCount = \App\Models\Issue::where('assigned_to', $user->id)->whereIn('status', ['open', 'in_review'])->count();
$notifications = $user->notifications()->latest()->take(6)->get();
$unreadCount = $user->unreadNotifications()->count();
return view('dashboard', compact(
'user', 'projects', 'projectsCount', 'myTasks', 'myTasksCount',
'myIssues', 'myIssuesCount', 'notifications', 'unreadCount'
));
})->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
// ------------------------------------------------------------
// Create/Edit handled by unified Livewire component
Route::get('/projects/create', \App\Livewire\Projects\ProjectForm::class)->name('projects.create');
Route::get('/projects/{project}/edit', \App\Livewire\Projects\ProjectForm::class)->name('projects.edit');
Route::resource('projects', ProjectController::class)->except(['create', 'edit']);
// 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\Layers\LayerManager::class)->name('layers.manage');
// Cronograma Gantt y reporte del proyecto
Route::get('/projects/{project}/gantt', PhaseGantt::class)->name('projects.gantt');
Route::get('/projects/{project}/report', [ProjectReportController::class, 'show'])->name('projects.report');
// Issues del proyecto
Route::get('/projects/{project}/issues', \App\Livewire\Issues\IssueManager::class)->name('projects.issues');
Route::get('/projects/{project}/issues/create', \App\Livewire\Issues\IssueForm::class)->name('projects.issues.create');
Route::get('/projects/{project}/issues/checklists', \App\Livewire\Issues\IssueChecklistManager::class)->name('projects.issues.checklists');
Route::get('/projects/{project}/issues/{issue}', \App\Livewire\Issues\IssueDetail::class)->name('projects.issues.show');
Route::get('/projects/{project}/issues/{issue}/edit', \App\Livewire\Issues\IssueForm::class)->name('projects.issues.edit');
// Dashboard por proyecto
Route::get('/projects/{project}/dashboard', \App\Livewire\Projects\ProjectDashboard::class)->name('projects.dashboard');
// 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 (cada ruta protegida por su permiso)
Route::prefix('admin')->name('admin.')->group(function () {
Route::get('/users', function () { return view('admin.users'); })->middleware('can:view users')->name('users');
Route::get('/users/create', \App\Livewire\Users\UserForm::class)->middleware('can:create users')->name('users.create');
Route::get('/users/{user}', \App\Livewire\Users\UserView::class)->middleware('can:view users')->name('users.show');
Route::get('/users/{user}/edit', \App\Livewire\Users\UserForm::class)->middleware('can:edit users')->name('users.edit');
Route::get('/roles', function () { return view('admin.roles'); })->middleware('can:manage roles')->name('roles');
Route::get('/roles/create', \App\Livewire\Admin\RoleForm::class)->middleware('can:manage roles')->name('roles.create');
Route::get('/roles/{role}/edit', \App\Livewire\Admin\RoleForm::class)->middleware('can:manage roles')->name('roles.edit');
Route::get('/roles/{role}', \App\Livewire\Admin\RoleView::class)->middleware('can:manage roles')->name('roles.show');
Route::get('/permissions', \App\Livewire\Admin\RolePermissionManager::class)->middleware('can:manage roles')->name('permissions');
});
// Gestor de medios
Route::get('/projects/{project}/media', function (\App\Models\Project $project) {
return view('projects.media', compact('project'));
})->name('projects.media');
Route::get('/companies', \App\Livewire\Companies\CompanyManagement::class)->name('companies.manage');
Route::get('/companies/create', \App\Livewire\Companies\CompanyForm::class)->name('companies.create');
Route::get('/companies/{company}', \App\Livewire\Companies\CompanyView::class)->name('companies.show');
Route::get('/companies/{company}/edit', \App\Livewire\Companies\CompanyForm::class)->name('companies.edit');
// ------------------------------------------------------------
// 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');
// Logout se gestiona vía la acción Volt en el componente de navegación
// (App\Livewire\Actions\Logout), por lo que no hace falta una ruta /logout.
});
// Incluir rutas de autenticación (login, registro, recuperación de contraseña, logout)
require __DIR__ . '/auth.php';