From 7d35710331c55251387da67f2f133c945f1ed721 Mon Sep 17 00:00:00 2001 From: TheSilva7 Date: Fri, 9 May 2025 11:15:15 -0600 Subject: [PATCH] Vista de Profesor restringi el acceso de las funciones de administrador para aceptar prestamos y que solo se pueda hacer un nuevo prestamo y ya --- .../SolicitudVehiculoController.php | 49 ++++++++++++ app/Http/Kernel.php | 3 + app/Http/Middleware/CheckAdminRole.php | 19 +++++ app/Http/Middleware/CheckProfesorRole.php | 19 +++++ app/Models/SolicitudVehiculo.php | 26 +++++++ app/Models/User.php | 1 + .../2014_10_12_000000_create_users_table.php | 5 +- ...00000_create_solicitud_vehiculos_table.php | 28 +++++++ ...8_175205_add_estado_to_prestamos_table.php | 28 ------- database/seeders/DatabaseSeeder.php | 4 + database/seeders/ProfesorSeeder.php | 22 ++++++ .../profesor/solicitudes/create.blade.php | 78 +++++++++++++++++++ .../profesor/solicitudes/index.blade.php | 51 ++++++++++++ routes/web.php | 34 +++++--- 14 files changed, 326 insertions(+), 41 deletions(-) create mode 100644 app/Http/Controllers/SolicitudVehiculoController.php create mode 100644 app/Http/Middleware/CheckAdminRole.php create mode 100644 app/Http/Middleware/CheckProfesorRole.php create mode 100644 app/Models/SolicitudVehiculo.php create mode 100644 database/migrations/2024_03_27_000000_create_solicitud_vehiculos_table.php delete mode 100644 database/migrations/2025_05_08_175205_add_estado_to_prestamos_table.php create mode 100644 database/seeders/ProfesorSeeder.php create mode 100644 resources/views/profesor/solicitudes/create.blade.php create mode 100644 resources/views/profesor/solicitudes/index.blade.php diff --git a/app/Http/Controllers/SolicitudVehiculoController.php b/app/Http/Controllers/SolicitudVehiculoController.php new file mode 100644 index 0000000..0e0111b --- /dev/null +++ b/app/Http/Controllers/SolicitudVehiculoController.php @@ -0,0 +1,49 @@ +middleware(['auth', 'profesor']); + } + + public function index() + { + $solicitudes = SolicitudVehiculo::where('user_id', auth()->id())->get(); + return view('profesor.solicitudes.index', compact('solicitudes')); + } + + public function create() + { + return view('profesor.solicitudes.create'); + } + + public function store(Request $request) + { + $request->validate([ + 'fecha_solicitud' => 'required|date', + 'hora_salida' => 'required', + 'hora_regreso' => 'required', + 'destino' => 'required|string', + 'motivo' => 'required|string', + ]); + + $solicitud = new SolicitudVehiculo(); + $solicitud->user_id = auth()->id(); + $solicitud->fecha_solicitud = $request->fecha_solicitud; + $solicitud->hora_salida = $request->hora_salida; + $solicitud->hora_regreso = $request->hora_regreso; + $solicitud->destino = $request->destino; + $solicitud->motivo = $request->motivo; + $solicitud->estado = 'pendiente'; + $solicitud->save(); + + return redirect()->route('profesor.solicitudes.index') + ->with('success', 'Solicitud creada exitosamente'); + } +} \ No newline at end of file diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index c34cdcf..993626b 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -60,8 +60,11 @@ class Kernel extends HttpKernel 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, + 'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class, 'signed' => \App\Http\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + 'profesor' => \App\Http\Middleware\CheckProfesorRole::class, + 'admin' => \App\Http\Middleware\CheckAdminRole::class, ]; } diff --git a/app/Http/Middleware/CheckAdminRole.php b/app/Http/Middleware/CheckAdminRole.php new file mode 100644 index 0000000..a5911b8 --- /dev/null +++ b/app/Http/Middleware/CheckAdminRole.php @@ -0,0 +1,19 @@ +check() || auth()->user()->rol !== 'admin') { + return redirect('/')->with('error', 'No tienes permisos de administrador para acceder a esta sección.'); + } + + return $next($request); + } +} \ No newline at end of file diff --git a/app/Http/Middleware/CheckProfesorRole.php b/app/Http/Middleware/CheckProfesorRole.php new file mode 100644 index 0000000..27bb597 --- /dev/null +++ b/app/Http/Middleware/CheckProfesorRole.php @@ -0,0 +1,19 @@ +check() || auth()->user()->rol !== 'profesor') { + return redirect('/')->with('error', 'No tienes permiso para acceder a esta sección.'); + } + + return $next($request); + } +} \ No newline at end of file diff --git a/app/Models/SolicitudVehiculo.php b/app/Models/SolicitudVehiculo.php new file mode 100644 index 0000000..8192bfd --- /dev/null +++ b/app/Models/SolicitudVehiculo.php @@ -0,0 +1,26 @@ +belongsTo(User::class); + } +} \ No newline at end of file diff --git a/app/Models/User.php b/app/Models/User.php index 57af47e..de57470 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -27,6 +27,7 @@ class User extends Authenticatable 'departamento_id', 'telefono', 'password', + 'rol', ]; diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php index 8d71422..ec9f421 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -3,6 +3,7 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; +use Illuminate\Support\Facades\DB; return new class extends Migration { @@ -23,6 +24,7 @@ return new class extends Migration $table->string('telefono')->nullable(); $table->string('password'); + $table->string('rol')->default('profesor'); $table->rememberToken(); $table->timestamps(); $table->foreign('puesto_id')->references('id')->on('puestos'); @@ -33,7 +35,8 @@ return new class extends Migration DB::table('users')->insert([ 'name'=> 'Administrador', 'email'=> 'admin@admin.com', - 'password'=> bcrypt('12345678') + 'password'=> bcrypt('12345678'), + 'rol' => 'admin' ]); } diff --git a/database/migrations/2024_03_27_000000_create_solicitud_vehiculos_table.php b/database/migrations/2024_03_27_000000_create_solicitud_vehiculos_table.php new file mode 100644 index 0000000..dd48ec7 --- /dev/null +++ b/database/migrations/2024_03_27_000000_create_solicitud_vehiculos_table.php @@ -0,0 +1,28 @@ +id(); + $table->foreignId('user_id')->constrained()->onDelete('cascade'); + $table->date('fecha_solicitud'); + $table->time('hora_salida'); + $table->time('hora_regreso'); + $table->string('destino'); + $table->text('motivo'); + $table->enum('estado', ['pendiente', 'aprobada', 'rechazada'])->default('pendiente'); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('solicitud_vehiculos'); + } +}; \ No newline at end of file diff --git a/database/migrations/2025_05_08_175205_add_estado_to_prestamos_table.php b/database/migrations/2025_05_08_175205_add_estado_to_prestamos_table.php deleted file mode 100644 index c47e8b3..0000000 --- a/database/migrations/2025_05_08_175205_add_estado_to_prestamos_table.php +++ /dev/null @@ -1,28 +0,0 @@ -enum('estado', ['pendiente', 'aceptado', 'rechazado'])->default('pendiente')->after('chofer'); - }); - } - - /** - * Reverse the migrations. - */ - public function down(): void - { - Schema::table('prestamos', function (Blueprint $table) { - $table->dropColumn('estado'); - }); - } -}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index a9f4519..764c0ff 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -18,5 +18,9 @@ class DatabaseSeeder extends Seeder // 'name' => 'Test User', // 'email' => 'test@example.com', // ]); + + $this->call([ + ProfesorSeeder::class, + ]); } } diff --git a/database/seeders/ProfesorSeeder.php b/database/seeders/ProfesorSeeder.php new file mode 100644 index 0000000..e178ed1 --- /dev/null +++ b/database/seeders/ProfesorSeeder.php @@ -0,0 +1,22 @@ + 'Profesor', + 'email' => 'profesor@profesor.com', + 'password' => Hash::make('12345678'), + 'rol' => 'profesor', + 'apellido' => 'Ejemplo', + 'telefono' => '1234567890', + ]); + } +} \ No newline at end of file diff --git a/resources/views/profesor/solicitudes/create.blade.php b/resources/views/profesor/solicitudes/create.blade.php new file mode 100644 index 0000000..f3f10e7 --- /dev/null +++ b/resources/views/profesor/solicitudes/create.blade.php @@ -0,0 +1,78 @@ +@extends('layouts.dashboard') + +@section('content') +
+
+
+
+

Nueva Solicitud de Vehículo

+ + @if($errors->any()) +
+
+
+
    + @foreach($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+
+
+ @endif + +
+ @csrf +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + Cancelar + + +
+
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/profesor/solicitudes/index.blade.php b/resources/views/profesor/solicitudes/index.blade.php new file mode 100644 index 0000000..deb28ce --- /dev/null +++ b/resources/views/profesor/solicitudes/index.blade.php @@ -0,0 +1,51 @@ +@extends('layouts.dashboard') + +@section('content') +
+
+

Mis Solicitudes de Vehículo

+ + Nueva Solicitud + +
+ + @if(session('success')) + + @endif + +
+ + + + + + + + + + + + @foreach($solicitudes as $solicitud) + + + + + + + + @endforeach + +
FechaHora SalidaHora RegresoDestinoEstado
{{ $solicitud->fecha_solicitud }}{{ $solicitud->hora_salida }}{{ $solicitud->hora_regreso }}{{ $solicitud->destino }} + + {{ ucfirst($solicitud->estado) }} + +
+
+
+@endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index dbffc48..e7b1b7b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -10,6 +10,7 @@ use App\Http\Controllers\TiposLicenciasController; use App\Http\Controllers\CapacidadController; use App\Http\Controllers\PrestamoController; use App\Http\Controllers\DespartamentoController; +use App\Http\Controllers\SolicitudVehiculoController; /* @@ -55,18 +56,20 @@ use App\Http\Controllers\DespartamentoController; Route::get('/despartamento/export/excel', [DespartamentoController::class, 'exportExcel'])->name('despartamentos.excel'); Route::get('/despartamento/export/pdf', [DespartamentoController::class, 'exportPDF'])->name('despartamentos.pdf'); - // Primero las rutas de exportación (más específicas) - Route::get('/prestamos/excel', [PrestamoController::class, 'exportExcel'])->name('prestamos.excel'); - Route::get('/prestamos/pdf', [PrestamoController::class, 'exportPDF'])->name('prestamos.pdf'); - Route::get('/prestamos/export/{format}', [PrestamoController::class, 'export'])->name('prestamos.export'); - Route::get('/prestamos/aceptados', [PrestamoController::class, 'aceptados'])->name('prestamos.aceptados'); - Route::post('/prestamos/{id}/aceptar', [PrestamoController::class, 'aceptar'])->name('prestamos.aceptar'); - Route::post('/prestamos/{id}/rechazar', [PrestamoController::class, 'rechazar'])->name('prestamos.rechazar'); - Route::get('/prestamos/historial', [PrestamoController::class, 'historial'])->name('prestamos.historial'); - Route::get('/prestamos/pendientes', [PrestamoController::class, 'pendientes'])->name('prestamos.pendientes'); - Route::get('/prestamos/rechazados', [PrestamoController::class, 'rechazados'])->name('prestamos.rechazados'); - - // Después la ruta de recurso (más general) + // Rutas de préstamos protegidas para administradores + Route::middleware(['auth', 'admin'])->group(function () { + Route::get('/prestamos/aceptados', [PrestamoController::class, 'aceptados'])->name('prestamos.aceptados'); + Route::post('/prestamos/{id}/aceptar', [PrestamoController::class, 'aceptar'])->name('prestamos.aceptar'); + Route::post('/prestamos/{id}/rechazar', [PrestamoController::class, 'rechazar'])->name('prestamos.rechazar'); + Route::get('/prestamos/historial', [PrestamoController::class, 'historial'])->name('prestamos.historial'); + Route::get('/prestamos/pendientes', [PrestamoController::class, 'pendientes'])->name('prestamos.pendientes'); + Route::get('/prestamos/rechazados', [PrestamoController::class, 'rechazados'])->name('prestamos.rechazados'); + Route::get('/prestamos/excel', [PrestamoController::class, 'exportExcel'])->name('prestamos.excel'); + Route::get('/prestamos/pdf', [PrestamoController::class, 'exportPDF'])->name('prestamos.pdf'); + Route::get('/prestamos/export/{format}', [PrestamoController::class, 'export'])->name('prestamos.export'); + }); + + // Ruta general de préstamos (accesible para todos los usuarios autenticados) Route::resource('prestamos', PrestamoController::class); Route::get('/docentes/export/{format}', [DocentesController::class, 'export'])->name('docentes.export'); @@ -94,3 +97,10 @@ use App\Http\Controllers\DespartamentoController; ////corerecion rubi }); + +// Rutas para profesores +Route::middleware(['auth', 'profesor'])->prefix('profesor')->name('profesor.')->group(function () { + Route::get('/solicitudes', [SolicitudVehiculoController::class, 'index'])->name('solicitudes.index'); + Route::get('/solicitudes/create', [SolicitudVehiculoController::class, 'create'])->name('solicitudes.create'); + Route::post('/solicitudes', [SolicitudVehiculoController::class, 'store'])->name('solicitudes.store'); +});