Browse Source

fulll

ya quedo todo bien habia muchas correciones pero ya quedaron ahora necesito  solo la paginaciones de las tablas
main
sergiomarquez778 7 days ago
parent
commit
c9e44266f8
  1. 23
      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. 27
      resources/views/marcas.blade.php
  7. 36
      resources/views/prestamos.blade.php
  8. 8
      resources/views/usuarios.blade.php
  9. 17
      resources/views/usuariosCrearEditar.blade.php
  10. 4
      routes/web.php

23
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.
*/ */
public function edit($id) // ... existing code ...
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',

27
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

36
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 -->
@ -37,12 +36,12 @@
title="Exportar a PDF"> title="Exportar a PDF">
<i class="fas fa-file-pdf text-xl"></i> <i class="fas fa-file-pdf text-xl"></i>
</a> </a>
<!-- Agregar nuevo préstamo --> <!-- Agregar nuevo préstamo -->
<a href="{{ route('prestamos.create') }}" <a href="{{ route('prestamos.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"
title="Agregar nuevo préstamo"> title="Agregar nuevo préstamo">
<i class="fas fa-plus text-xl"></i> <i class="fas fa-plus text-xl"></i>
</a> </a>
</div> </div>
</div> </div>
</div> </div>
@ -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 }}

17
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>
@ -150,4 +155,4 @@
</div> </div>
</div> </div>
</div> </div>
@endsection @endsection

4
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');
@ -86,4 +86,4 @@ use App\Http\Controllers\PrestamoController;
Route::get('/home', [HomeController::class, 'index'])->name('home'); Route::get('/home', [HomeController::class, 'index'])->name('home');
////corerecion rubi ////corerecion rubi
}); });

Loading…
Cancel
Save