Browse Source

fulll

ya quedo todo bien habia muchas correciones pero ya quedaron ahora necesito  solo la paginaciones de las tablas
main
sergiomarquez778 10 months ago
parent
commit
c9e44266f8
  1. 21
      app/Http/Controllers/usuariosController.php
  2. 8
      app/Models/User.php
  3. 11
      app/Models/puesto.php
  4. 32
      database/migrations/2013_03_27_235747_create_puestos_table.php
  5. 4
      database/migrations/2014_10_12_000000_create_users_table.php
  6. 25
      resources/views/marcas.blade.php
  7. 26
      resources/views/prestamos.blade.php
  8. 8
      resources/views/usuarios.blade.php
  9. 15
      resources/views/usuariosCrearEditar.blade.php
  10. 2
      routes/web.php

21
app/Http/Controllers/usuariosController.php

@ -7,6 +7,7 @@ use Illuminate\Http\Request;
use App\Exports\UsuariosExport; 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;
class usuariosController extends Controller class usuariosController extends Controller
{ {
@ -38,7 +39,8 @@ class usuariosController extends Controller
*/ */
public function create() public function create()
{ {
return view('usuariosCrearEditar'); // Vista para crear usuario $puestos = Puesto::all();
return view('usuariosCrearEditar', ['usuario' => null, 'puestos' => $puestos]);
} }
@ -52,18 +54,18 @@ class usuariosController extends Controller
'name' => 'required|string|max:255', 'name' => 'required|string|max:255',
'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' => 'required|string|max:255', 'puesto_id' => 'required|exists:puestos,id',
'carrera' => 'required|string|max:255', 'carrera' => 'required|string|max:255',
'telefono' => 'required|string|max:255', 'telefono' => 'required|string|max:255',
'password' => 'required|string|min:8|confirmed', 'password' => 'required|string|min:8|confirmed',
]); ]);
// Crear nuevo usuario // Si la validación pasa, crea el usuario
$usuario = new User(); $usuario = new User();
$usuario->name = $request->name; $usuario->name = $request->name;
$usuario->email = $request->email; $usuario->email = $request->email;
$usuario->apellido = $request->apellido; $usuario->apellido = $request->apellido;
$usuario->puesto = $request->puesto; $usuario->puesto_id = $request->puesto_id;
$usuario->carrera = $request->carrera; $usuario->carrera = $request->carrera;
$usuario->telefono = $request->telefono; $usuario->telefono = $request->telefono;
$usuario->password = bcrypt($request->password); $usuario->password = bcrypt($request->password);
@ -83,11 +85,14 @@ 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)
{ {
$usuario = User::findOrFail($id); $user = User::findOrFail($id);
return view('usuariosCrearEditar', compact('usuario')); // Vista para editar usuario $puestos = Puesto::all();
return view('usuariosCrearEditar',['usuario' => $user, 'puestos' => $puestos]); // Asegúrate de que la clave sea 'usuario'
} }
// ... existing code ...
/** /**
@ -100,7 +105,7 @@ class usuariosController extends Controller
'name' => 'required|string|max:255', 'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255', 'email' => 'required|string|email|max:255',
'apellido' => 'required|string|max:255', 'apellido' => 'required|string|max:255',
'puesto' => 'required|string|max:255', //'puesto_id' => 'required|exists:puesto_id',
'carrera' => 'required|string|max:255', 'carrera' => 'required|string|max:255',
'telefono' => 'required|string|max:255', 'telefono' => 'required|string|max:255',
'password' => 'nullable|string|min:8|confirmed', 'password' => 'nullable|string|min:8|confirmed',
@ -111,7 +116,7 @@ class usuariosController extends Controller
$usuario->name = $request->name; $usuario->name = $request->name;
$usuario->email = $request->email; $usuario->email = $request->email;
$usuario->apellido = $request->apellido; $usuario->apellido = $request->apellido;
$usuario->puesto = $request->puesto; $usuario->puesto_id = $request->puesto_id;
$usuario->carrera = $request->carrera; $usuario->carrera = $request->carrera;
$usuario->telefono = $request->telefono; $usuario->telefono = $request->telefono;

8
app/Models/User.php

@ -7,6 +7,7 @@ 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;
use Laravel\Sanctum\HasApiTokens; use Laravel\Sanctum\HasApiTokens;
use Illuminate\Database\Eloquent\Relations\HasOne;
class User extends Authenticatable class User extends Authenticatable
{ {
@ -21,12 +22,13 @@ class User extends Authenticatable
'name', 'name',
'email', 'email',
'apellido', 'apellido',
'puesto', 'puesto_id',
'carrera', 'carrera',
'telefono', 'telefono',
'password', 'password',
]; ];
/** /**
* The attributes that should be hidden for serialization. * The attributes that should be hidden for serialization.
* *
@ -45,4 +47,8 @@ class User extends Authenticatable
protected $casts = [ protected $casts = [
'email_verified_at' => 'datetime', 'email_verified_at' => 'datetime',
]; ];
public function puesto():HasOne{
return $this->hasOne(Puesto::class, 'id','puesto_id');
}
} }

11
app/Models/puesto.php

@ -0,0 +1,11 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class puesto extends Model
{
use HasFactory;
}

32
database/migrations/2013_03_27_235747_create_puestos_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('puestos', function (Blueprint $table) {
$table->id();
$table->string('nombre');
$table->timestamps();
});
DB::table('puestos')->insert(['nombre'=> 'Administrativo']);
DB::table('puestos')->insert(['nombre'=> 'docente']);
DB::table('puestos')->insert(['nombre'=> 'coordinador']);
DB::table('puestos')->insert(['nombre'=> 'personal general']);
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('puestos');
}
};

4
database/migrations/2014_10_12_000000_create_users_table.php

@ -17,12 +17,14 @@ return new class extends Migration
$table->string('email')->unique(); $table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable(); $table->timestamp('email_verified_at')->nullable();
$table->string('apellido')->nullable(); $table->string('apellido')->nullable();
$table->string('puesto')->nullable(); $table->unsignedBigInteger('puesto_id')->nullable();
$table->string('carrera')->nullable(); $table->string('carrera')->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');
}); });
DB::table('users')->insert([ DB::table('users')->insert([
'name'=> 'Administrador', 'name'=> 'Administrador',

25
resources/views/marcas.blade.php

@ -75,16 +75,16 @@
<table class="min-w-full divide-y divide-gray-200"> <table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50"> <thead class="bg-gray-50">
<tr> <tr>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">ID</th> <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">Marca</th> <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Marca</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>
</tr> </tr>
</thead> </thead>
<tbody class="bg-white divide-y divide-gray-200"> <tbody class="bg-white divide-y divide-gray-200">
@foreach($marcas as $marca) @foreach($marcas as $index => $marca)
<tr class="hover:bg-gray-50"> <tr class="hover:bg-gray-50">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">{{ $marca->id }}</td> <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"> <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<i class="fas fa-car text-blue-500 mr-2"></i> <i class="fas fa-car text-blue-500 mr-2"></i>
{{ $marca->marca }} {{ $marca->marca }}
@ -121,7 +121,7 @@
<form action="{{ route('marca.destroy', $marca->id) }}" method="POST" class="d-inline"> <form action="{{ route('marca.destroy', $marca->id) }}" method="POST" class="d-inline">
@csrf @csrf
@method('DELETE') @method('DELETE')
<a href="#" onclick="event.preventDefault(); this.closest('form').submit();" <a href="#" onclick="event.preventDefault(); confirmarEliminacion(this);"
class="text-red-600 hover:text-red-700 transition-colors duration-200" class="text-red-600 hover:text-red-700 transition-colors duration-200"
title="Eliminar marca"> title="Eliminar marca">
<i class="fas fa-trash"></i> <i class="fas fa-trash"></i>
@ -149,5 +149,22 @@
}, 500); }, 500);
} }
}, 3000); }, 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> </script>
@endsection @endsection

26
resources/views/prestamos.blade.php

@ -21,7 +21,6 @@
<h2 class="text-2xl font-bold">Gestión de Préstamos</h2> <h2 class="text-2xl font-bold">Gestión de Préstamos</h2>
<div class="flex items-center space-x-6"> <div class="flex items-center space-x-6">
<!-- Íconos de exportación --> <!-- Íconos de exportación -->
<div class="flex space-x-4"> <div class="flex space-x-4">
<!-- Exportar a Excel --> <!-- Exportar a Excel -->
@ -76,7 +75,7 @@
<table class="min-w-full divide-y divide-gray-200"> <table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50"> <thead class="bg-gray-50">
<tr> <tr>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">ID</th> <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">Nombre Solicitante</th> <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Nombre Solicitante</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Destino</th> <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Destino</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Fecha y Hora Salida</th> <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Fecha y Hora Salida</th>
@ -90,10 +89,10 @@
</tr> </tr>
</thead> </thead>
<tbody class="bg-white divide-y divide-gray-200"> <tbody class="bg-white divide-y divide-gray-200">
@foreach($prestamos as $prestamo) @foreach($prestamos as $index => $prestamo)
<tr class="hover:bg-gray-50"> <tr class="hover:bg-gray-50">
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500"> <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<span class="font-medium">#{{ $prestamo->id }}</span> <span class="font-medium">{{ $index + 1 }}</span>
</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">
<div class="flex items-center"> <div class="flex items-center">
@ -159,7 +158,7 @@
<form action="{{ route('prestamos.destroy', $prestamo->id) }}" method="POST" class="d-inline"> <form action="{{ route('prestamos.destroy', $prestamo->id) }}" method="POST" class="d-inline">
@csrf @csrf
@method('DELETE') @method('DELETE')
<a href="#" onclick="event.preventDefault(); this.closest('form').submit();" <a href="#" onclick="event.preventDefault(); confirmarEliminacion(this);"
class="text-red-600 hover:text-red-700 transition-colors duration-200" class="text-red-600 hover:text-red-700 transition-colors duration-200"
title="Eliminar préstamo"> title="Eliminar préstamo">
<i class="fas fa-trash-alt"></i> <i class="fas fa-trash-alt"></i>
@ -186,5 +185,22 @@
}, 500); }, 500);
} }
}, 3000); }, 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> </script>
@endsection @endsection

8
resources/views/usuarios.blade.php

@ -36,6 +36,8 @@
<i class="fas fa-file-pdf text-xl"></i> <i class="fas fa-file-pdf text-xl"></i>
</a> </a>
<!-- Agregar nuevo usuario --> <!-- Agregar nuevo usuario -->
<a href="{{ route('usuarios.create') }}" <a href="{{ route('usuarios.create') }}"
class="text-blue-500 hover:text-blue-600 transition-colors duration-200" class="text-blue-500 hover:text-blue-600 transition-colors duration-200"
@ -43,6 +45,7 @@
<i class="fas fa-plus text-xl"></i> <i class="fas fa-plus text-xl"></i>
</a> </a>
</div> </div>
</div> </div>
</div> </div>
@ -107,7 +110,10 @@
<i class="fas fa-user-tag text-green-500"></i> {{ $usuario->apellido }} <i class="fas fa-user-tag text-green-500"></i> {{ $usuario->apellido }}
</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-briefcase text-yellow-500"></i> {{ $usuario->puesto }} <div class="flex items-center">
<i class="fas fa-briefcase text-gray-400 mr-2"></i>
{{ $usuario->puesto->nombre ?? 'Sin puesto 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-graduation-cap text-purple-500"></i> {{ $usuario->carrera }} <i class="fas fa-graduation-cap text-purple-500"></i> {{ $usuario->carrera }}

15
resources/views/usuariosCrearEditar.blade.php

@ -72,15 +72,20 @@
</div> </div>
<div> <div>
<label for="puesto" class="block text-sm font-medium text-gray-700 mb-2">Puesto</label> <label for="puestos_id" class="block text-sm font-medium text-gray-700 mb-2">Puesto</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-briefcase text-gray-400"></i> <i class="fas fa-briefcase text-gray-400"></i>
</div> </div>
<input type="text" name="puesto" id="puesto" <select name="puesto_id" id="puesto_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 puesto</option>
placeholder="Ingresa el puesto" @foreach($puestos as $puesto)
required value="{{ isset($usuario) ? $usuario->puesto : old('puesto') }}"> <option value="{{ $puesto->id }}"
{{ (isset($usuario) && $usuario->puesto_id == $puesto->id) ? 'selected' : '' }}>
{{ $puesto->nombre }}
</option>
@endforeach
</select>
</div> </div>
</div> </div>

2
routes/web.php

@ -78,7 +78,7 @@ use App\Http\Controllers\PrestamoController;
Route::post('/usuarios/store', [usuariosController::class,'store'])->name('usuarios.store'); Route::post('/usuarios/store', [usuariosController::class,'store'])->name('usuarios.store');
Route::get('/usuarios/edit/{id}', [usuariosController::class, 'edit'])->name('usuarios.edit'); Route::get('/usuarios/edit/{id}', [usuariosController::class, 'edit'])->name('usuarios.edit');
Route::put('/usuarios/update', [usuariosController::class,'update'])->name('usuarios.update'); Route::put('/usuarios/{id}', [usuariosController::class, 'update'])->name('usuarios.update');
Route::delete('/usuarios/destroy/{id}', [usuariosController::class, 'destroy'])->name('usuarios.destroy'); Route::delete('/usuarios/destroy/{id}', [usuariosController::class, 'destroy'])->name('usuarios.destroy');
Route::get('usuarios/excel', [usuariosController::class, 'exportExcel'])->name('usuarios.excel'); Route::get('usuarios/excel', [usuariosController::class, 'exportExcel'])->name('usuarios.excel');
Route::get('usuarios/pdf', [usuariosController::class, 'exportPDF'])->name('usuarios.pdf'); Route::get('usuarios/pdf', [usuariosController::class, 'exportPDF'])->name('usuarios.pdf');

Loading…
Cancel
Save