Browse Source

NUEVO

aqui hice el nuevo catalogo de departamaneto para que el usuario lo agregue manual y de ahi se refleje en la base de datos y la tabla de usuarios la jale y muestre la informacion ingresada mas aparte los letreros de mis catalogos y todo lo que hice le meti validaciones y tambien en español
main
sergiomarquez778 2 days ago
parent
commit
a9f94fc4f7
  1. 23
      app/Exports/despartamentosExport.php
  2. 127
      app/Http/Controllers/DespartamentoController.php
  3. 22
      app/Http/Controllers/MarcaController.php
  4. 21
      app/Http/Controllers/PrestamoController.php
  5. 50
      app/Http/Controllers/usuariosController.php
  6. 6
      app/Models/User.php
  7. 13
      app/Models/despartamento.php
  8. 23
      database/factories/DespartamentoFactory.php
  9. 32
      database/migrations/2013_04_01_183413_create_despartamentos_table.php
  10. 6
      database/migrations/2014_10_12_000000_create_users_table.php
  11. 28
      database/migrations/2025_04_01_191019_add_columneliminado_todespartamentos.php
  12. 142
      resources/views/despartamentos.blade.php
  13. 82
      resources/views/despartamentosCrearEditar.blade.php
  14. 36
      resources/views/exports/departamentos.blade.php
  15. 8
      resources/views/layouts/dashboard.blade.php
  16. 7
      resources/views/usuarios.blade.php
  17. 17
      resources/views/usuariosCrearEditar.blade.php
  18. 7
      routes/web.php

23
app/Exports/despartamentosExport.php

@ -0,0 +1,23 @@
<?php
namespace App\Exports;
use App\Models\Despartamento; // Asegúrate de que el modelo esté correctamente importado
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
class DespartamentosExport implements FromCollection, WithHeadings
{
public function collection()
{
return Despartamento::where('eliminado', 0)->get(); // Obtiene todos los departamentos activos
}
public function headings(): array
{
return [
'ID',
'Departamento'
];
}
}

127
app/Http/Controllers/DespartamentoController.php

@ -0,0 +1,127 @@
<?php
namespace App\Http\Controllers;
use App\Models\despartamento;
use Illuminate\Http\Request;
use App\Exports\DespartamentosExport;
use Maatwebsite\Excel\Facades\Excel;
use PDF;
class DespartamentoController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
$busqueda = $request->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');
}
}

22
app/Http/Controllers/MarcaController.php

@ -49,6 +49,11 @@ class MarcaController extends Controller
// Validación de datos // Validación de datos
$request->validate([ $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.',
]); ]);
// Crea una nueva marca // Crea una nueva marca
@ -64,9 +69,7 @@ class MarcaController extends Controller
* Show the form for editing the specified resource. * Show the form for editing the specified resource.
*/ */
public function edit($id) public function edit($id)
{ {
$marca = Marca::findOrFail($id); // Busca la marca por ID $marca = Marca::findOrFail($id); // Busca la marca por ID
return view('marcasCrearEditar', ['marca' => $marca]); // Pasa la marca a la vista 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) public function update(Request $request, $id)
{ {
$request->validate([ $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::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->eliminado = 0; // Cambia el estado a activo si se está editando
$marca->save(); // Guarda los cambios $marca->save(); // Guarda los cambios

21
app/Http/Controllers/PrestamoController.php

@ -48,6 +48,7 @@ class PrestamoController extends Controller
*/ */
public function store(Request $request) public function store(Request $request)
{ {
/*
// Validación de datos // Validación de datos
$request->validate([ $request->validate([
'nombre_solicitante' => 'required|string|max:255', 'nombre_solicitante' => 'required|string|max:255',
@ -57,8 +58,16 @@ class PrestamoController extends Controller
'motivo' => 'required|string|max:255', 'motivo' => 'required|string|max:255',
'domicilio' => 'required|string|max:255', 'domicilio' => 'required|string|max:255',
'numero_personas' => 'required|integer', '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 // Crea un nuevo préstamo
$prestamo = new Prestamo(); $prestamo = new Prestamo();
$prestamo->nombre_solicitante = $request->nombre_solicitante; $prestamo->nombre_solicitante = $request->nombre_solicitante;
@ -90,6 +99,7 @@ class PrestamoController extends Controller
public function update(Request $request, $id) public function update(Request $request, $id)
{ {
// Validación de datos // Validación de datos
/*
$request->validate([ $request->validate([
'nombre_solicitante' => 'required|string|max:255', 'nombre_solicitante' => 'required|string|max:255',
'destino' => 'required|string|max:255', 'destino' => 'required|string|max:255',
@ -98,7 +108,16 @@ class PrestamoController extends Controller
'motivo' => 'required|string|max:255', 'motivo' => 'required|string|max:255',
'domicilio' => 'required|string|max:255', 'domicilio' => 'required|string|max:255',
'numero_personas' => 'required|integer', '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 = Prestamo::findOrFail($id); // Encuentra el préstamo por ID
$prestamo->nombre_solicitante = $request->nombre_solicitante; // Actualiza el nombre del solicitante $prestamo->nombre_solicitante = $request->nombre_solicitante; // Actualiza el nombre del solicitante

50
app/Http/Controllers/usuariosController.php

@ -8,6 +8,7 @@ use App\Exports\UsuariosExport;
use Maatwebsite\Excel\Facades\Excel; use Maatwebsite\Excel\Facades\Excel;
use PDF; // Asegúrate de incluir la clase PDF use PDF; // Asegúrate de incluir la clase PDF
use App\Models\Puesto; use App\Models\Puesto;
use App\Models\Despartamento;
class usuariosController extends Controller class usuariosController extends Controller
{ {
@ -39,11 +40,11 @@ class usuariosController extends Controller
*/ */
public function create() public function create()
{ {
$despartamentos = Despartamento::all();
$puestos = Puesto::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. * Store a newly created resource in storage.
*/ */
@ -55,9 +56,19 @@ class usuariosController extends Controller
'email' => 'required|string|email|max:255|unique:users', 'email' => 'required|string|email|max:255|unique:users',
'apellido' => 'required|string|max:255', 'apellido' => 'required|string|max:255',
'puesto_id' => 'required|exists:puestos,id', 'puesto_id' => 'required|exists:puestos,id',
'carrera' => 'required|string|max:255', 'departamento_id' => 'required|exists:despartamentos,id',
'telefono' => 'required|string|max:255', 'telefono' => 'required|string|max:255',
'password' => 'required|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.',
]); ]);
// Si la validación pasa, crea el usuario // Si la validación pasa, crea el usuario
@ -66,7 +77,7 @@ class usuariosController extends Controller
$usuario->email = $request->email; $usuario->email = $request->email;
$usuario->apellido = $request->apellido; $usuario->apellido = $request->apellido;
$usuario->puesto_id = $request->puesto_id; $usuario->puesto_id = $request->puesto_id;
$usuario->carrera = $request->carrera; $usuario->departamento_id = $request->departamento_id;
$usuario->telefono = $request->telefono; $usuario->telefono = $request->telefono;
$usuario->password = bcrypt($request->password); $usuario->password = bcrypt($request->password);
$usuario->save(); $usuario->save();
@ -85,15 +96,13 @@ class usuariosController extends Controller
/** /**
* Show the form for editing the specified resource. * Show the form for editing the specified resource.
*/ */
// ... existing code ... public function edit($id)
public function edit($id)
{ {
$user = User::findOrFail($id); $user = User::findOrFail($id);
$puestos = Puesto::all(); $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. * Update the specified resource in storage.
@ -103,12 +112,22 @@ class usuariosController extends Controller
// Validación de datos // Validación de datos
$request->validate([ $request->validate([
'name' => 'required|string|max:255', 'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255', 'email' => 'required|string|email|max:255|unique:users',
'apellido' => 'required|string|max:255', 'apellido' => 'required|string|max:255',
//'puesto_id' => 'required|exists:puesto_id', 'puesto_id' => 'required|exists:puestos,id',
'carrera' => 'required|string|max:255', 'departamento_id' => 'required|exists:despartamentos,id',
'telefono' => 'required|string|max:255', '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 // Actualizar usuario
@ -117,7 +136,7 @@ class usuariosController extends Controller
$usuario->email = $request->email; $usuario->email = $request->email;
$usuario->apellido = $request->apellido; $usuario->apellido = $request->apellido;
$usuario->puesto_id = $request->puesto_id; $usuario->puesto_id = $request->puesto_id;
$usuario->carrera = $request->carrera; $usuario->departamento_id = $request->departamento_id;
$usuario->telefono = $request->telefono; $usuario->telefono = $request->telefono;
if ($request->filled('password')) { if ($request->filled('password')) {
@ -132,8 +151,7 @@ class usuariosController extends Controller
/** /**
* Remove the specified resource from storage. * Remove the specified resource from storage.
*/ */
public function destroy($id)
public function destroy($id)
{ {
// Buscar el usuario por ID // Buscar el usuario por ID
$usuario = User::findOrFail($id); $usuario = User::findOrFail($id);

6
app/Models/User.php

@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail; // use Illuminate\Contracts\Auth\MustVerifyEmail;
use App\Http\Controllers\DespartamentoController;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
@ -23,7 +24,7 @@ class User extends Authenticatable
'email', 'email',
'apellido', 'apellido',
'puesto_id', 'puesto_id',
'carrera', 'departamento_id',
'telefono', 'telefono',
'password', 'password',
]; ];
@ -51,4 +52,7 @@ class User extends Authenticatable
public function puesto():HasOne{ public function puesto():HasOne{
return $this->hasOne(Puesto::class, 'id','puesto_id'); return $this->hasOne(Puesto::class, 'id','puesto_id');
} }
public function despartamento():HasOne{
return $this->hasOne(Despartamento::class, 'id','departamento_id');
}
} }

13
app/Models/despartamento.php

@ -0,0 +1,13 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class despartamento extends Model
{
use HasFactory;
protected $table = 'despartamentos';
protected $fillable = ['departamento'];
}

23
database/factories/DespartamentoFactory.php

@ -0,0 +1,23 @@
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\despartamento>
*/
class DespartamentoFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
//
];
}
}

32
database/migrations/2013_04_01_183413_create_despartamentos_table.php

@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('despartamentos', function (Blueprint $table) {
$table->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');
}
};

6
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->timestamp('email_verified_at')->nullable();
$table->string('apellido')->nullable(); $table->string('apellido')->nullable();
$table->unsignedBigInteger('puesto_id')->nullable(); $table->unsignedBigInteger('puesto_id')->nullable();
$table->string('carrera')->nullable();
$table->unsignedBigInteger('departamento_id')->nullable();
$table->string('telefono')->nullable(); $table->string('telefono')->nullable();
$table->string('password'); $table->string('password');
$table->rememberToken(); $table->rememberToken();
$table->timestamps(); $table->timestamps();
$table->foreign('puesto_id')->references('id')->on('puestos'); $table->foreign('puesto_id')->references('id')->on('puestos');
$table->foreign('departamento_id')->references('id')->on('despartamentos');
}); });
DB::table('users')->insert([ DB::table('users')->insert([
'name'=> 'Administrador', 'name'=> 'Administrador',

28
database/migrations/2025_04_01_191019_add_columneliminado_todespartamentos.php

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('despartamentos', function (Blueprint $table) {
$table->boolean('eliminado')->default(false);
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('despartamentos', function (Blueprint $table) {
$table->dropColumn('eliminado');
});
}
};

142
resources/views/despartamentos.blade.php

@ -0,0 +1,142 @@
@extends('layouts.dashboard')
@section('content')
<div class="container mx-auto px-4 py-6">
<!-- Mensajes de éxito y error -->
@if(session('success'))
<div id="success-message" class="bg-green-100 border border-green-400 text-green-700 px-4 py-3 rounded relative mb-4" role="alert">
<span class="block sm:inline">{{ session('success') }}</span>
</div>
@endif
@if(session('error'))
<div class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded relative mb-4" role="alert">
<span class="block sm:inline">{{ session('error') }}</span>
</div>
@endif
<div class="bg-white rounded-lg shadow-lg">
<!-- Encabezado con título y botones de acción -->
<div class="p-4 border-b border-gray-200 flex justify-between items-center">
<h2 class="text-2xl font-bold">Gestión de Departamentos</h2>
<div class="flex items-center space-x-6">
<!-- Íconos de agregar -->
<div class="flex space-x-4">
<a href="{{ route('despartamentos.excel') }}"
class="text-green-600 hover:text-green-700 transition-colors duration-200"
title="Exportar a Excel">
<i class="fas fa-file-excel text-xl"></i>
</a>
<a href="{{ route('despartamentos.pdf') }}"
class="text-red-600 hover:text-red-700 transition-colors duration-200"
title="Exportar a PDF">
<i class="fas fa-file-pdf text-xl"></i>
</a>
<!-- Agregar nuevo departamento -->
<a href="{{ route('despartamentos.create') }}"
class="text-blue-500 hover:text-blue-600 transition-colors duration-200"
title="Agregar nuevo departamento">
<i class="fas fa-plus text-xl"></i>
</a>
</div>
</div>
</div>
<!-- Barra de búsqueda -->
<div class="p-4 border-b border-gray-200 bg-gray-50">
<form action="{{ route('despartamentos.index') }}" method="GET" class="flex gap-2">
<div class="relative w-full sm:w-64">
<input type="text"
name="busqueda"
placeholder="Buscar departamento..."
value="{{ request('busqueda') }}"
class="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
<div class="absolute left-3 top-2.5 text-gray-400">
<i class="fas fa-search"></i>
</div>
</div>
<button type="submit" class="px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600">
Buscar
</button>
@if(request('busqueda'))
<a href="{{ route('despartamentos.index') }}" class="px-4 py-2 bg-gray-500 text-white rounded-lg hover:bg-gray-600">
Limpiar
</a>
@endif
</form>
</div>
<!-- Tabla de departamentos -->
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Número</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Departamento</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Acciones</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
@foreach($despartamentos as $index => $despartamento)
<tr class="hover:bg-gray-50">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ $index + 1 }}</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<i class="fas fa-building text-blue-500 mr-2"></i>
{{ $despartamento->departamento }}
</td>
<td class="flex space-x-2 px-6 py-4 whitespace-nowrap text-sm">
<a href="{{ route('despartamentos.edit', $despartamento->id) }}"
class="text-yellow-600 hover:text-yellow-700 transition-colors duration-200"
title="Editar departamento">
<i class="fas fa-edit"></i>
</a>
<form action="{{ route('despartamentos.destroy', $despartamento->id) }}" method="POST" class="d-inline">
@csrf
@method('DELETE')
<a href="#" onclick="event.preventDefault(); confirmarEliminacion(this);"
class="text-red-600 hover:text-red-700 transition-colors duration-200"
title="Eliminar departamento">
<i class="fas fa-trash"></i>
</a>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
<script>
// Desaparecer el mensaje después de 3 segundos
setTimeout(function() {
var message = document.getElementById('success-message');
if (message) {
message.style.transition = 'opacity 0.5s ease';
message.style.opacity = '0';
setTimeout(function() {
message.remove();
}, 500);
}
}, 3000);
function confirmarEliminacion(button) {
Swal.fire({
title: '¿Estás seguro?',
text: "Esta acción no se puede deshacer",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#3085d6',
cancelButtonColor: '#d33',
confirmButtonText: 'Sí, eliminar',
cancelButtonText: 'Cancelar'
}).then((result) => {
if (result.isConfirmed) {
button.closest('form').submit();
}
});
}
</script>
@endsection

82
resources/views/despartamentosCrearEditar.blade.php

@ -0,0 +1,82 @@
@extends('layouts.dashboard')
@section('content')
<div class="container mx-auto px-4 py-6">
<div class="max-w-lg mx-auto">
<div class="bg-white rounded-lg shadow-lg overflow-hidden">
<div class="p-6">
<!-- Encabezado del formulario -->
<div class="flex items-center justify-between mb-6">
<h2 class="text-2xl font-bold text-gray-800">
{{ isset($despartamento) ? 'Editar Departamento' : 'Nuevo Departamento' }}
</h2>
<div class="h-10 w-10 bg-blue-100 rounded-full flex items-center justify-center">
<i class="fas fa-building text-blue-600"></i>
</div>
</div>
<!-- Mensajes de error -->
@if($errors->any())
<div class="mb-6 bg-red-50 border-l-4 border-red-500 p-4 rounded-r-lg">
<div class="flex items-center">
<i class="fas fa-exclamation-circle text-red-500 mr-3"></i>
<div class="text-red-700">
<ul>
@foreach($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
</div>
</div>
@endif
<!-- Formulario -->
<form id="despartamentoForm"
action="{{ isset($despartamento) ? route('despartamentos.update', $despartamento->id) : route('despartamentos.store') }}"
method="POST">
@csrf
@if(isset($despartamento))
@method('PUT')
@endif
<div class="space-y-6">
<!-- Campo Nombre -->
<div>
<label for="departamento" class="block text-sm font-medium text-gray-700 mb-2">
Nombre del Departamento
</label>
<div class="relative rounded-md shadow-sm">
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<i class="fas fa-tag text-gray-400"></i>
</div>
<input type="text"
name="departamento"
id="departamento"
class="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500"
required
placeholder="Ingresa el nombre del departamento"
value="{{ isset($despartamento) ? $despartamento->departamento : old('departamento') }}">
</div>
@error('departamento')
<p class="mt-1 text-sm text-red-600">{{ $message }}</p>
@enderror
</div>
<!-- Botones de acción -->
<div class="flex justify-end space-x-2 pt-4 border-t border-gray-200">
<a href="{{ route('despartamentos.index') }}"
class="px-4 py-2 border border-gray-300 rounded-md text-sm font-medium text-gray-700 hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500">
Cancelar
</a>
<button type="submit"
class="px-4 py-2 border border-transparent rounded-md shadow-sm text-sm font-medium text-white bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500">
{{ isset($despartamento) ? 'Actualizar' : 'Guardar' }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection

36
resources/views/exports/departamentos.blade.php

@ -0,0 +1,36 @@
<!DOCTYPE html>
<html>
<head>
<title>Departamentos</title>
<style>
table {
width: 100%;
border-collapse: collapse;
}
th, td {
border: 1px solid black;
padding: 8px;
text-align: left;
}
</style>
</head>
<body>
<h1>Lista de Departamentos</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>Departamento</th>
</tr>
</thead>
<tbody>
@foreach($departamentos as $departamento)
<tr>
<td>{{ $departamento->id }}</td>
<td>{{ $departamento->departamento }}</td>
</tr>
@endforeach
</tbody>
</table>
</body>
</html>

8
resources/views/layouts/dashboard.blade.php

@ -143,6 +143,14 @@
</a> </a>
</li> </li>
<!-- departamento -->
<li>
<a href="{{ route('despartamentos.index') }}" class="nav-item-hover flex items-center space-x-3 px-4 py-3 rounded-lg hover:bg-white/10 backdrop-blur-sm {{ request()->is('departamentos*') ? 'bg-white/20' : '' }}">
<i class="fas fa-building text-white/80"></i>
<span class="font-light">Departamentos</span>
</a>
</li>
<!-- Tipos --> <!-- Tipos -->
<li> <li>
<a href="{{ route('vehiculos.index') }}" class="nav-item-hover flex items-center space-x-3 px-4 py-3 rounded-lg hover:bg-white/10 backdrop-blur-sm {{ request()->is('vehiculos*') ? 'bg-white/20' : '' }}"> <a href="{{ route('vehiculos.index') }}" class="nav-item-hover flex items-center space-x-3 px-4 py-3 rounded-lg hover:bg-white/10 backdrop-blur-sm {{ request()->is('vehiculos*') ? 'bg-white/20' : '' }}">

7
resources/views/usuarios.blade.php

@ -84,7 +84,7 @@
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Email </th> <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Email </th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Apellido </th> <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Apellido </th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Puesto </th> <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Puesto </th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Carrera </th> <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Departamento </th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Teléfono </th> <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Teléfono </th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Estado </th> <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Estado </th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Acciones </th> <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Acciones </th>
@ -116,7 +116,10 @@
</div> </div>
</td> </td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900"> <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<i class="fas fa-graduation-cap text-purple-500"></i> {{ $usuario->carrera }} <div class="flex items-center">
<i class="fas fa-building text-gray-400 mr-2"></i>
{{ $usuario->despartamento->departamento ?? 'Sin departamento asignado' }}
</div>
</td> </td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900"> <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<i class="fas fa-phone text-red-500"></i> {{ $usuario->telefono }} <i class="fas fa-phone text-red-500"></i> {{ $usuario->telefono }}

17
resources/views/usuariosCrearEditar.blade.php

@ -90,15 +90,20 @@
</div> </div>
<div> <div>
<label for="carrera" class="block text-sm font-medium text-gray-700 mb-2">Carrera</label> <label for="departamento_id" class="block text-sm font-medium text-gray-700 mb-2">Departamento</label>
<div class="relative"> <div class="relative">
<div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> <div class="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<i class="fas fa-graduation-cap text-gray-400"></i> <i class="fas fa-building text-gray-400"></i>
</div> </div>
<input type="text" name="carrera" id="carrera" <select name="departamento_id" id="departamento_id" class="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md" required>
class="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md" <option value="">Selecciona un departamento</option>
placeholder="Ingresa la carrera" @foreach($despartamentos as $departamento)
required value="{{ isset($usuario) ? $usuario->carrera : old('carrera') }}"> <option value="{{ $departamento->id }}"
{{ (isset($usuario) && $usuario->departamento_id == $departamento->id) ? 'selected' : '' }}>
{{ $departamento->departamento }}
</option>
@endforeach
</select>
</div> </div>
</div> </div>

7
routes/web.php

@ -9,6 +9,8 @@ use App\Http\Controllers\TiposVeiculosController;
use App\Http\Controllers\TiposLicenciasController; use App\Http\Controllers\TiposLicenciasController;
use App\Http\Controllers\CapacidadController; use App\Http\Controllers\CapacidadController;
use App\Http\Controllers\PrestamoController; 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('marca', MarcaController::class);
Route::resource('docentes', DocentesController::class); Route::resource('docentes', DocentesController::class);
Route::resource('despartamentos', DespartamentoController::class);
// Rutas específicas de vehículos // Rutas específicas de vehículos
Route::get('vehiculos/excel', [TiposVeiculosController::class, 'exportExcel'])->name('vehiculos.excel'); 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/excel', [MarcaController::class, 'exportExcel'])->name('marcas.excel');
Route::get('/marcas/pdf', [MarcaController::class, 'exportPDF'])->name('marcas.pdf'); 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) // Primero las rutas de exportación (más específicas)
Route::get('/prestamos/excel', [PrestamoController::class, 'exportExcel'])->name('prestamos.excel'); Route::get('/prestamos/excel', [PrestamoController::class, 'exportExcel'])->name('prestamos.excel');
Route::get('/prestamos/pdf', [PrestamoController::class, 'exportPDF'])->name('prestamos.pdf'); Route::get('/prestamos/pdf', [PrestamoController::class, 'exportPDF'])->name('prestamos.pdf');

Loading…
Cancel
Save