diff --git a/app/Exports/despartamentosExport.php b/app/Exports/despartamentosExport.php new file mode 100644 index 0000000..110672a --- /dev/null +++ b/app/Exports/despartamentosExport.php @@ -0,0 +1,23 @@ +get(); // Obtiene todos los departamentos activos + } + + public function headings(): array + { + return [ + 'ID', + 'Departamento' + ]; + } +} \ No newline at end of file diff --git a/app/Http/Controllers/DespartamentoController.php b/app/Http/Controllers/DespartamentoController.php new file mode 100644 index 0000000..e06ec19 --- /dev/null +++ b/app/Http/Controllers/DespartamentoController.php @@ -0,0 +1,127 @@ +busqueda; + + if ($busqueda) { + // Busca en la columna 'nombre' de la tabla 'despartamentos' + $despartamentos = despartamento::where('nombre', 'LIKE', "%{$busqueda}%")->where('eliminado', 0)->get(); + + if ($despartamentos->isEmpty()) { + return redirect()->route('despartamento.index') + ->with('error', 'No existe ningún departamento con el nombre "' . $busqueda . '". Por favor, inténtalo de nuevo.'); + } + } else { + // Si no hay búsqueda, mostrar todos los departamentos + $despartamentos = despartamento::where('eliminado', 0)->get(); + } + + return view('despartamentos', ['despartamentos' => $despartamentos]); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + return view('despartamentosCrearEditar', ['despartamento' => null]); // No se necesita pasar departamentos + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + // Valida la entrada + $request->validate([ + 'departamento' => 'required|string|max:255|unique:despartamentos,departamento', // Asegúrate de que 'departamento' sea único + ], [ + 'departamento.required' => 'El campo departamento es obligatorio.', + 'departamento.string' => 'El campo departamento debe ser una cadena de texto.', + 'departamento.max' => 'El campo departamento no puede tener más de 255 caracteres.', + 'departamento.unique' => 'Ya existe un departamento con ese nombre.', + ]); + + // Crea un nuevo departamento + $despartamento = new despartamento(); + $despartamento->departamento = $request->departamento; // Asigna el nombre ingresado por el usuario + $despartamento->eliminado = 0; // Departamento como activo por defecto + $despartamento->save(); + + return redirect()->route('despartamentos.index')->with('success', 'Departamento creado exitosamente.'); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit($id) + { + $despartamento = despartamento::findOrFail($id); // Busca el departamento por ID + return view('despartamentosCrearEditar', ['despartamento' => $despartamento]); // Pasa el departamento a la vista + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, $id) + { + $request->validate([ + 'departamento' => 'required|string|max:255|unique:despartamentos,departamento', // Asegúrate de que 'departamento' sea único + ], [ + 'departamento.required' => 'El campo departamento es obligatorio.', + 'departamento.string' => 'El campo departamento debe ser una cadena de texto.', + 'departamento.max' => 'El campo departamento no puede tener más de 255 caracteres.', + 'departamento.unique' => 'Ya existe un departamento con ese nombre, por favor elige otro.', + ]); + + $despartamento = despartamento::findOrFail($id); // Encuentra el departamento por ID + + // Verifica si el nombre del departamento ha cambiado + if ($despartamento->departamento !== $request->departamento) { + $despartamento->departamento = $request->departamento; // Actualiza el nombre del departamento + } + + $despartamento->eliminado = 0; // Cambia el estado a activo si se está editando + $despartamento->save(); // Guarda los cambios + + return redirect()->route('despartamentos.index')->with('success', 'Departamento actualizado correctamente.'); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy($id) + { + $despartamento = despartamento::findOrFail($id); // Encuentra el departamento por ID + $despartamento->eliminado = 1; // Cambia el estado a inactivo + $despartamento->save(); // Guarda los cambios + + return redirect()->route('despartamentos.index')->with('success', 'Departamento inactivado correctamente.'); + } + + public function exportExcel() + { + return Excel::download(new DespartamentosExport, 'despartamentos.xlsx'); + } + + public function exportPDF() + { + $departamentos = despartamento::where('eliminado', 0)->get(); + $pdf = PDF::loadView('exports.departamentos', ['departamentos' => $departamentos]); + return $pdf->download('departamentos.pdf'); + } +} diff --git a/app/Http/Controllers/MarcaController.php b/app/Http/Controllers/MarcaController.php index 1ec46de..1eccea4 100644 --- a/app/Http/Controllers/MarcaController.php +++ b/app/Http/Controllers/MarcaController.php @@ -49,6 +49,11 @@ class MarcaController extends Controller // Validación de datos $request->validate([ 'marca' => 'required|string|max:255|unique:marcas,marca', // Asegúrate de que 'marca' sea único + ], [ + 'marca.required' => 'El campo marca es obligatorio.', + 'marca.string' => 'El campo marca debe ser una cadena de texto.', + 'marca.max' => 'El campo marca no puede tener más de 255 caracteres.', + 'marca.unique' => 'La marca ya existe en la base de datos.', ]); // Crea una nueva marca @@ -64,9 +69,7 @@ class MarcaController extends Controller * Show the form for editing the specified resource. */ public function edit($id) - { - $marca = Marca::findOrFail($id); // Busca la marca por ID return view('marcasCrearEditar', ['marca' => $marca]); // Pasa la marca a la vista } @@ -77,10 +80,21 @@ class MarcaController extends Controller public function update(Request $request, $id) { $request->validate([ - 'marca' => 'required|string|max:255|unique:marcas,marca', // Asegúrate de que 'marca' sea único + 'marca' => 'required|string|max:255|unique:marcas,marca', // Asegúrate de que 'marca' sea único + ], [ + 'marca.required' => 'El campo marca es obligatorio.', + 'marca.string' => 'El campo marca debe ser una cadena de texto.', + 'marca.max' => 'El campo marca no puede tener más de 255 caracteres.', + 'marca.unique' => 'La marca ya existe en la base de datos.', ]); + $marca = Marca::findOrFail($id); // Encuentra la marca por ID - $marca->marca = $request->marca; // Actualiza el nombre de la marca + + // Verifica si el nombre de la marca ha cambiado + if ($marca->marca !== $request->marca) { + $marca->marca = $request->marca; // Actualiza el nombre de la marca + } + $marca->eliminado = 0; // Cambia el estado a activo si se está editando $marca->save(); // Guarda los cambios diff --git a/app/Http/Controllers/PrestamoController.php b/app/Http/Controllers/PrestamoController.php index 75f13b7..e67c655 100644 --- a/app/Http/Controllers/PrestamoController.php +++ b/app/Http/Controllers/PrestamoController.php @@ -48,6 +48,7 @@ class PrestamoController extends Controller */ public function store(Request $request) { + /* // Validación de datos $request->validate([ 'nombre_solicitante' => 'required|string|max:255', @@ -57,8 +58,16 @@ class PrestamoController extends Controller 'motivo' => 'required|string|max:255', 'domicilio' => 'required|string|max:255', 'numero_personas' => 'required|integer', + ], [ + 'nombre_solicitante.required' => 'El campo nombre solicitante es obligatorio.', + 'destino.required' => 'El campo destino es obligatorio.', + 'fecha_hora_salida.required' => 'El campo fecha y hora de salida es obligatorio.', + 'fecha_hora_llegada.required' => 'El campo fecha y hora de llegada es obligatorio.', + 'motivo.required' => 'El campo motivo es obligatorio.', + 'domicilio.required' => 'El campo domicilio es obligatorio.', + 'numero_personas.required' => 'El campo número de personas es obligatorio.', ]); - + */ // Crea un nuevo préstamo $prestamo = new Prestamo(); $prestamo->nombre_solicitante = $request->nombre_solicitante; @@ -90,6 +99,7 @@ class PrestamoController extends Controller public function update(Request $request, $id) { // Validación de datos + /* $request->validate([ 'nombre_solicitante' => 'required|string|max:255', 'destino' => 'required|string|max:255', @@ -98,7 +108,16 @@ class PrestamoController extends Controller 'motivo' => 'required|string|max:255', 'domicilio' => 'required|string|max:255', 'numero_personas' => 'required|integer', + ], [ + 'nombre_solicitante.required' => 'El campo nombre solicitante es obligatorio.', + 'destino.required' => 'El campo destino es obligatorio.', + 'fecha_hora_salida.required' => 'El campo fecha y hora de salida es obligatorio.', + 'fecha_hora_llegada.required' => 'El campo fecha y hora de llegada es obligatorio.', + 'motivo.required' => 'El campo motivo es obligatorio.', + 'domicilio.required' => 'El campo domicilio es obligatorio.', + 'numero_personas.required' => 'El campo número de personas es obligatorio.', ]); + */ $prestamo = Prestamo::findOrFail($id); // Encuentra el préstamo por ID $prestamo->nombre_solicitante = $request->nombre_solicitante; // Actualiza el nombre del solicitante diff --git a/app/Http/Controllers/usuariosController.php b/app/Http/Controllers/usuariosController.php index 0a332bf..c521450 100644 --- a/app/Http/Controllers/usuariosController.php +++ b/app/Http/Controllers/usuariosController.php @@ -8,6 +8,7 @@ use App\Exports\UsuariosExport; use Maatwebsite\Excel\Facades\Excel; use PDF; // Asegúrate de incluir la clase PDF use App\Models\Puesto; +use App\Models\Despartamento; class usuariosController extends Controller { @@ -39,11 +40,11 @@ class usuariosController extends Controller */ public function create() { + $despartamentos = Despartamento::all(); $puestos = Puesto::all(); - return view('usuariosCrearEditar', ['usuario' => null, 'puestos' => $puestos]); + return view('usuariosCrearEditar', ['usuario' => null, 'puestos' => $puestos, 'despartamentos'=> $despartamentos]); } - /** * Store a newly created resource in storage. */ @@ -55,9 +56,19 @@ class usuariosController extends Controller 'email' => 'required|string|email|max:255|unique:users', 'apellido' => 'required|string|max:255', 'puesto_id' => 'required|exists:puestos,id', - 'carrera' => 'required|string|max:255', + 'departamento_id' => 'required|exists:despartamentos,id', 'telefono' => 'required|string|max:255', 'password' => 'required|string|min:8|confirmed', + ], [ + 'name.required' => 'El campo nombre es obligatorio.', + 'email.required' => 'El campo email es obligatorio.', + 'email.unique' => 'El email ya está registrado.', + 'apellido.required' => 'El campo apellido es obligatorio.', + 'puesto_id.required' => 'El campo puesto es obligatorio.', + 'departamento_id.required' => 'El campo departamento es obligatorio.', + 'telefono.required' => 'El campo teléfono es obligatorio.', + 'password.required' => 'El campo contraseña es obligatorio.', + 'password.confirmed' => 'Las contraseñas no coinciden.', ]); // Si la validación pasa, crea el usuario @@ -66,7 +77,7 @@ class usuariosController extends Controller $usuario->email = $request->email; $usuario->apellido = $request->apellido; $usuario->puesto_id = $request->puesto_id; - $usuario->carrera = $request->carrera; + $usuario->departamento_id = $request->departamento_id; $usuario->telefono = $request->telefono; $usuario->password = bcrypt($request->password); $usuario->save(); @@ -85,15 +96,13 @@ class usuariosController extends Controller /** * Show the form for editing the specified resource. */ - // ... existing code ... - public function edit($id) + public function edit($id) { $user = User::findOrFail($id); $puestos = Puesto::all(); - return view('usuariosCrearEditar',['usuario' => $user, 'puestos' => $puestos]); // Asegúrate de que la clave sea 'usuario' + $despartamentos = Despartamento::all(); + return view('usuariosCrearEditar',['usuario' => $user, 'puestos' => $puestos,'despartamentos'=> $despartamentos]); // Asegúrate de que la clave sea 'usuario' } -// ... existing code ... - /** * Update the specified resource in storage. @@ -103,12 +112,22 @@ class usuariosController extends Controller // Validación de datos $request->validate([ 'name' => 'required|string|max:255', - 'email' => 'required|string|email|max:255', + 'email' => 'required|string|email|max:255|unique:users', 'apellido' => 'required|string|max:255', - //'puesto_id' => 'required|exists:puesto_id', - 'carrera' => 'required|string|max:255', + 'puesto_id' => 'required|exists:puestos,id', + 'departamento_id' => 'required|exists:despartamentos,id', 'telefono' => 'required|string|max:255', - 'password' => 'nullable|string|min:8|confirmed', + 'password' => 'required|string|min:8|confirmed', + ], [ + 'name.required' => 'El campo nombre es obligatorio.', + 'email.required' => 'El campo email es obligatorio.', + 'email.unique' => 'El email ya está registrado.', + 'apellido.required' => 'El campo apellido es obligatorio.', + 'puesto_id.required' => 'El campo puesto es obligatorio.', + 'departamento_id.required' => 'El campo departamento es obligatorio.', + 'telefono.required' => 'El campo teléfono es obligatorio.', + 'password.required' => 'El campo contraseña es obligatorio.', + 'password.confirmed' => 'Las contraseñas no coinciden.', ]); // Actualizar usuario @@ -117,7 +136,7 @@ class usuariosController extends Controller $usuario->email = $request->email; $usuario->apellido = $request->apellido; $usuario->puesto_id = $request->puesto_id; - $usuario->carrera = $request->carrera; + $usuario->departamento_id = $request->departamento_id; $usuario->telefono = $request->telefono; if ($request->filled('password')) { @@ -132,8 +151,7 @@ class usuariosController extends Controller /** * Remove the specified resource from storage. */ - - public function destroy($id) + public function destroy($id) { // Buscar el usuario por ID $usuario = User::findOrFail($id); diff --git a/app/Models/User.php b/app/Models/User.php index fced612..57af47e 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -3,6 +3,7 @@ namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; +use App\Http\Controllers\DespartamentoController; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; @@ -23,7 +24,7 @@ class User extends Authenticatable 'email', 'apellido', 'puesto_id', - 'carrera', + 'departamento_id', 'telefono', 'password', ]; @@ -51,4 +52,7 @@ class User extends Authenticatable public function puesto():HasOne{ return $this->hasOne(Puesto::class, 'id','puesto_id'); } + public function despartamento():HasOne{ + return $this->hasOne(Despartamento::class, 'id','departamento_id'); + } } diff --git a/app/Models/despartamento.php b/app/Models/despartamento.php new file mode 100644 index 0000000..d7ba430 --- /dev/null +++ b/app/Models/despartamento.php @@ -0,0 +1,13 @@ + + */ +class DespartamentoFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + // + ]; + } +} diff --git a/database/migrations/2013_04_01_183413_create_despartamentos_table.php b/database/migrations/2013_04_01_183413_create_despartamentos_table.php new file mode 100644 index 0000000..679415e --- /dev/null +++ b/database/migrations/2013_04_01_183413_create_despartamentos_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('departamento'); + $table->timestamps(); + }); + DB::table('despartamentos')->insert(['departamento'=> 'fw3f']); + DB::table('despartamentos')->insert(['departamento'=> 'wfaf']); + DB::table('despartamentos')->insert(['departamento'=> 'asef']); + DB::table('despartamentos')->insert(['departamento'=> 'FE fe']); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('despartamentos'); + } +}; 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 89dba93..8d71422 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -18,13 +18,17 @@ return new class extends Migration $table->timestamp('email_verified_at')->nullable(); $table->string('apellido')->nullable(); $table->unsignedBigInteger('puesto_id')->nullable(); - $table->string('carrera')->nullable(); + + $table->unsignedBigInteger('departamento_id')->nullable(); + $table->string('telefono')->nullable(); $table->string('password'); $table->rememberToken(); $table->timestamps(); $table->foreign('puesto_id')->references('id')->on('puestos'); + $table->foreign('departamento_id')->references('id')->on('despartamentos'); + }); DB::table('users')->insert([ 'name'=> 'Administrador', diff --git a/database/migrations/2025_04_01_191019_add_columneliminado_todespartamentos.php b/database/migrations/2025_04_01_191019_add_columneliminado_todespartamentos.php new file mode 100644 index 0000000..91b0bbe --- /dev/null +++ b/database/migrations/2025_04_01_191019_add_columneliminado_todespartamentos.php @@ -0,0 +1,28 @@ +boolean('eliminado')->default(false); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('despartamentos', function (Blueprint $table) { + $table->dropColumn('eliminado'); + }); + } +}; diff --git a/resources/views/despartamentos.blade.php b/resources/views/despartamentos.blade.php new file mode 100644 index 0000000..db25bc3 --- /dev/null +++ b/resources/views/despartamentos.blade.php @@ -0,0 +1,142 @@ +@extends('layouts.dashboard') + +@section('content') +
+ + @if(session('success')) + + @endif + + @if(session('error')) + + @endif + +
+ +
+

Gestión de Departamentos

+
+ +
+ + + + + + + + + + + +
+
+
+ + +
+
+
+ +
+ +
+
+ + @if(request('busqueda')) + + Limpiar + + @endif +
+
+ + +
+ + + + + + + + + + @foreach($despartamentos as $index => $despartamento) + + + + + + @endforeach + +
NúmeroDepartamentoAcciones
{{ $index + 1 }} + + {{ $despartamento->departamento }} + + + + +
+ @csrf + @method('DELETE') + + + +
+
+
+
+
+ + +@endsection diff --git a/resources/views/despartamentosCrearEditar.blade.php b/resources/views/despartamentosCrearEditar.blade.php new file mode 100644 index 0000000..94fd678 --- /dev/null +++ b/resources/views/despartamentosCrearEditar.blade.php @@ -0,0 +1,82 @@ +@extends('layouts.dashboard') + +@section('content') +
+
+
+
+ +
+

+ {{ isset($despartamento) ? 'Editar Departamento' : 'Nuevo Departamento' }} +

+
+ +
+
+ + + @if($errors->any()) +
+
+ +
+
    + @foreach($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+
+
+ @endif + +
+ @csrf + @if(isset($despartamento)) + @method('PUT') + @endif + +
+ +
+ +
+
+ +
+ +
+ @error('departamento') +

{{ $message }}

+ @enderror +
+ + +
+ + Cancelar + + +
+
+
+
+
+
+
+@endsection diff --git a/resources/views/exports/departamentos.blade.php b/resources/views/exports/departamentos.blade.php new file mode 100644 index 0000000..0205219 --- /dev/null +++ b/resources/views/exports/departamentos.blade.php @@ -0,0 +1,36 @@ + + + + Departamentos + + + +

Lista de Departamentos

+ + + + + + + + + @foreach($departamentos as $departamento) + + + + + @endforeach + +
IDDepartamento
{{ $departamento->id }}{{ $departamento->departamento }}
+ + diff --git a/resources/views/layouts/dashboard.blade.php b/resources/views/layouts/dashboard.blade.php index fee27d3..c9c4ead 100644 --- a/resources/views/layouts/dashboard.blade.php +++ b/resources/views/layouts/dashboard.blade.php @@ -143,6 +143,14 @@ + +
  • + + + Departamentos + +
  • +
  • diff --git a/resources/views/usuarios.blade.php b/resources/views/usuarios.blade.php index 4f44c54..bf4dcdd 100644 --- a/resources/views/usuarios.blade.php +++ b/resources/views/usuarios.blade.php @@ -84,7 +84,7 @@ Email Apellido Puesto - Carrera + Departamento Teléfono Estado Acciones @@ -116,7 +116,10 @@ - {{ $usuario->carrera }} +
    + + {{ $usuario->despartamento->departamento ?? 'Sin departamento asignado' }} +
    {{ $usuario->telefono }} diff --git a/resources/views/usuariosCrearEditar.blade.php b/resources/views/usuariosCrearEditar.blade.php index e01ada2..31ebece 100644 --- a/resources/views/usuariosCrearEditar.blade.php +++ b/resources/views/usuariosCrearEditar.blade.php @@ -90,15 +90,20 @@
    - +
    - +
    - +
    diff --git a/routes/web.php b/routes/web.php index 2819d88..0629aa1 100644 --- a/routes/web.php +++ b/routes/web.php @@ -9,6 +9,8 @@ use App\Http\Controllers\TiposVeiculosController; use App\Http\Controllers\TiposLicenciasController; use App\Http\Controllers\CapacidadController; use App\Http\Controllers\PrestamoController; +use App\Http\Controllers\DespartamentoController; + /* |-------------------------------------------------------------------------- @@ -29,6 +31,8 @@ use App\Http\Controllers\PrestamoController; Route::resource('marca', MarcaController::class); Route::resource('docentes', DocentesController::class); + Route::resource('despartamentos', DespartamentoController::class); + // Rutas específicas de vehículos Route::get('vehiculos/excel', [TiposVeiculosController::class, 'exportExcel'])->name('vehiculos.excel'); @@ -48,6 +52,9 @@ use App\Http\Controllers\PrestamoController; Route::get('/marcas/excel', [MarcaController::class, 'exportExcel'])->name('marcas.excel'); Route::get('/marcas/pdf', [MarcaController::class, 'exportPDF'])->name('marcas.pdf'); + 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');