You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

237 lines
9.8 KiB

<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
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;
use App\Models\Tipo;
class usuariosController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index(Request $request)
{
$busqueda = $request->busqueda;
if ($busqueda) {
// Busca en la columna 'name' de la tabla 'users'
$usuarios = User::where('name', 'LIKE', "%{$busqueda}%")->where('eliminado', 0)->get();
if ($usuarios->isEmpty()) {
return redirect()->route('usuarios')
->with('error', 'No existe ningún usuario con el nombre "' . $busqueda . '". Por favor, inténtalo de nuevo.');
}
} else {
// Si no hay búsqueda, mostrar todos los usuarios
$usuarios = User::where('eliminado', 0)->get();
}
return view('usuarios', ['usuarios' => $usuarios]);
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
$tipos = Tipo::all();
$despartamentos = Despartamento::all();
$puestos = Puesto::all();
return view('usuariosCrearEditar', ['usuario' => null, 'puestos' => $puestos, 'despartamentos'=> $despartamentos, 'tipos' => $tipos]);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
// Validación de datos en español
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'apellido' => ['required', 'string', 'max:255'],
'tipos_id' => ['required', 'exists:tipos,id'],
'puesto_id' => ['required', 'exists:puestos,id'],
'departamento_id' => ['required', 'exists:despartamentos,id'],
'telefono' => ['required', 'string', 'max:255'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
], [
'name.required' => 'El campo nombre es obligatorio.',
'name.string' => 'El campo nombre debe ser una cadena de texto.',
'name.max' => 'El campo nombre no debe exceder 255 caracteres.',
'email.required' => 'El campo correo electrónico es obligatorio.',
'email.string' => 'El campo correo electrónico debe ser una cadena de texto.',
'email.email' => 'El campo correo electrónico debe ser una dirección de correo válida.',
'email.max' => 'El campo correo electrónico no debe exceder 255 caracteres.',
'email.unique' => 'El correo electrónico ya está registrado.',
'apellido.required' => 'El campo apellido es obligatorio.',
'apellido.string' => 'El campo apellido debe ser una cadena de texto.',
'apellido.max' => 'El campo apellido no debe exceder 255 caracteres.',
'tipos_id.required' => 'El campo tipo es obligatorio.',
'tipos_id.exists' => 'El tipo seleccionado no es válido.',
'puesto_id.required' => 'El campo puesto es obligatorio.',
'puesto_id.exists' => 'El puesto seleccionado no es válido.',
'departamento_id.required' => 'El campo departamento es obligatorio.',
'departamento_id.exists' => 'El departamento seleccionado no es válido.',
'telefono.required' => 'El campo teléfono es obligatorio.',
'telefono.string' => 'El campo teléfono debe ser una cadena de texto.',
'telefono.max' => 'El campo teléfono no debe exceder 255 caracteres.',
'password.required' => 'El campo contraseña es obligatorio.',
'password.string' => 'El campo contraseña debe ser una cadena de texto.',
'password.min' => 'La contraseña debe tener al menos 8 caracteres.',
'password.confirmed' => 'Las contraseñas no coinciden.',
]);
// Validación extra: si el usuario autenticado es de servicios generales, solo puede crear usuarios de tipo Usuario
if (auth()->user()->tipos_id == 4 && $request->tipos_id != 2) {
return redirect()->back()->withInput()->withErrors(['tipos_id' => 'Solo puedes crear usuarios de tipo Usuario.']);
}
// Si la validación pasa, crea el usuario
$usuario = new User();
$usuario->name = $request->name;
$usuario->email = $request->email;
$usuario->apellido = $request->apellido;
$usuario->tipos_id = $request->tipos_id;
$usuario->puesto_id = $request->puesto_id;
$usuario->departamento_id = $request->departamento_id;
$usuario->telefono = $request->telefono;
$usuario->password = bcrypt($request->password);
// Ya no asignamos rol, solo usamos tipos_id
$usuario->save();
return redirect()->route('usuarios')->with('success', 'Usuario creado exitosamente.');
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
// Implementar si es necesario
}
/**
* Show the form for editing the specified resource.
*/
public function edit($id)
{
$user = User::findOrFail($id);
$puestos = Puesto::all();
$despartamentos = Despartamento::all();
$tipos = Tipo::all();
return view('usuariosCrearEditar',['usuario' => $user, 'puestos' => $puestos,'despartamentos'=> $despartamentos, 'tipos' => $tipos]); // Asegúrate de que la clave sea 'usuario'
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, $id)
{
// Validación de datos (reglas y mensajes personalizados en español)
$request->validate([
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email,'.$id],
'apellido' => ['required', 'string', 'max:255'],
'tipos_id' => ['required', 'exists:tipos,id'],
'puesto_id' => ['required', 'exists:puestos,id'],
'departamento_id' => ['required', 'exists:despartamentos,id'],
'telefono' => ['required', 'string', 'max:255'],
'password' => ['nullable', 'string', 'min:8', 'confirmed'],
], [
'name.required' => 'El campo nombre es obligatorio.',
'name.string' => 'El campo nombre debe ser una cadena de texto.',
'name.max' => 'El campo nombre no debe exceder 255 caracteres.',
'email.required' => 'El campo correo electrónico es obligatorio.',
'email.string' => 'El campo correo electrónico debe ser una cadena de texto.',
'email.email' => 'El campo correo electrónico debe ser una dirección válida.',
'email.max' => 'El campo correo electrónico no debe exceder 255 caracteres.',
'email.unique' => 'El correo electrónico ya está registrado.',
'apellido.required' => 'El campo apellido es obligatorio.',
'apellido.string' => 'El campo apellido debe ser una cadena de texto.',
'apellido.max' => 'El campo apellido no debe exceder 255 caracteres.',
'tipos_id.required' => 'El campo tipo es obligatorio.',
'tipos_id.exists' => 'El tipo seleccionado no es válido.',
'puesto_id.required' => 'El campo puesto es obligatorio.',
'puesto_id.exists' => 'El puesto seleccionado no es válido.',
'departamento_id.required' => 'El campo departamento es obligatorio.',
'departamento_id.exists' => 'El departamento seleccionado no es válido.',
'telefono.required' => 'El campo teléfono es obligatorio.',
'telefono.string' => 'El campo teléfono debe ser una cadena de texto.',
'telefono.max' => 'El campo teléfono no debe exceder 255 caracteres.',
'password.required' => 'El campo contraseña es obligatorio.',
'password.string' => 'El campo contraseña debe ser una cadena de texto.',
'password.min' => 'La contraseña debe tener al menos 8 caracteres.',
'password.confirmed' => 'Las contraseñas no coinciden.',
]);
// Actualizar usuario
$usuario = User::findOrFail($id);
$usuario->name = $request->name;
$usuario->email = $request->email;
$usuario->apellido = $request->apellido;
$usuario->tipos_id = $request->tipos_id;
$usuario->puesto_id = $request->puesto_id;
$usuario->departamento_id = $request->departamento_id;
$usuario->telefono = $request->telefono;
if ($request->filled('password')) {
$usuario->password = bcrypt($request->password);
}
$usuario->save();
return redirect()->route('usuarios')->with('success', 'Usuario actualizado exitosamente.');
}
/**
* Remove the specified resource from storage.
*/
public function destroy($id)
{
// Buscar el usuario por ID
$usuario = User::findOrFail($id);
// Cambiar el estado de eliminado a 1
$usuario->eliminado = 1; // Asumiendo que 'eliminado' es el campo que indica el estado
$usuario->save(); // Guardar los cambios
// Redirigir a la lista de usuarios con un mensaje de éxito
return redirect()->route('usuarios')->with('success', 'Usuario eliminado exitosamente.');
}
public function exportExcel()
{
return Excel::download(new UsuariosExport, 'usuarios.xlsx');
}
public function exportPDF()
{
$usuarios = User::where('eliminado', 0)->get();
$pdf = PDF::loadView('exports.usuarios-pdf', ['usuarios' => $usuarios]);
return $pdf->download('usuarios.pdf');
}
}