Tul xxx Tul
User / IP
:
216.73.216.217
Host / Server
:
45.84.207.204 / aircan.me
System
:
Linux lt-bnk-web1726.main-hosting.eu 5.14.0-611.36.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Mar 3 11:23:52 EST 2026 x86_64
Command
|
Upload
|
Create
Mass Deface
|
Jumping
|
Symlink
|
Reverse Shell
Ping
|
Port Scan
|
DNS Lookup
|
Whois
|
Header
|
cURL
:
/
home
/
u931257429
/
domains
/
aircan.me
/
public_html
/
piscina
/
app
/
controllers
/
Viewing: EmpleadosController.php
<?php namespace App\Controllers; use App\Core\Config; use App\Core\Controller; use App\Models\Empleado; use App\Models\Usuario; class EmpleadosController extends Controller { public function __construct() { $this->requireAuth(); $this->requirePermission('todo'); } public function sincronizarUsuariosRoles(): void { if ($_SERVER['REQUEST_METHOD'] !== 'POST') { header('Location: ' . Config::basePath() . 'empleados/roles'); exit; } $total = Empleado::sincronizarUsuariosRoles(); $this->setFlash('success', 'Sincronización completada: ' . $total . ' usuario(s) actualizados.'); header('Location: ' . Config::basePath() . 'empleados/roles'); exit; } public function index(): void { $empleados = Empleado::todos(); $resumen = Empleado::resumen(); $mensaje = $this->consumeFlash(); $this->view('empleados/index', [ 'title' => 'Gestión de empleados', 'empleados' => $empleados, 'resumen' => $resumen, 'mensaje' => $mensaje, ]); } public function crear(): void { $roles = Empleado::roles(); $mensaje = $this->consumeFlash(); $this->view('empleados/form', [ 'title' => 'Registrar empleado', 'accion' => 'crear', 'roles' => $roles, 'empleado' => null, 'mensaje' => $mensaje, ]); } public function guardar(): void { $data = $this->sanitizarEmpleado($_POST); $errores = $this->validarEmpleado($data); if ($errores) { $this->setFlash('danger', implode(' ', $errores)); header('Location: ' . Config::basePath() . 'empleados/crear'); exit; } $rolInfo = Empleado::rolPorId((int) $data['rol_id']); $rolAlias = $rolInfo['alias'] ?? 'empleado'; // Validar y crear usuario del sistema si se proporcionó nombre de usuario if ($data['usuario'] !== '') { if (Usuario::existeUsuario($data['usuario'])) { $this->setFlash('danger', 'El nombre de usuario ya está en uso.'); header('Location: ' . Config::basePath() . 'empleados/crear'); exit; } $usuarioId = Usuario::crear([ 'nombre' => $data['nombre'], 'usuario' => $data['usuario'], 'password' => $data['password'], 'rol' => $rolAlias, 'activo' => 1, ]); $data['usuario_id'] = $usuarioId; } else { $data['usuario_id'] = $data['usuario_id'] ?? null; } // Guardar contraseña en empleados $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT); Empleado::crear($data); $this->setFlash('success', 'Empleado registrado correctamente.'); header('Location: ' . Config::basePath() . 'empleados'); exit; } public function editar(int $id): void { $empleado = Empleado::find($id); if (!$empleado) { $this->setFlash('warning', 'Empleado no encontrado.'); header('Location: ' . Config::basePath() . 'empleados'); exit; } $roles = Empleado::roles(); $mensaje = $this->consumeFlash(); $this->view('empleados/form', [ 'title' => 'Editar empleado', 'accion' => 'editar', 'roles' => $roles, 'empleado' => $empleado, 'mensaje' => $mensaje, ]); } public function actualizar(int $id): void { $empleado = Empleado::find($id); if (!$empleado) { $this->setFlash('warning', 'Empleado no encontrado.'); header('Location: ' . Config::basePath() . 'empleados'); exit; } $data = $this->sanitizarEmpleado($_POST, true); $errores = $this->validarEmpleado($data, true); if ($errores) { $this->setFlash('danger', implode(' ', $errores)); header('Location: ' . Config::basePath() . 'empleados/editar/' . $id); exit; } // Resolver alias del rol seleccionado para sincronizar con usuarios.rol $rolInfo = Empleado::rolPorId((int) $data['rol_id']); $rolAlias = $rolInfo['alias'] ?? 'empleado'; // Manejo de cuenta de usuario $usuarioIdActual = $empleado['usuario_id'] ?? null; if ($data['usuario'] !== '') { if ($usuarioIdActual) { // Validar unicidad excluyendo el propio if (Usuario::existeUsuario($data['usuario'], (int) $usuarioIdActual)) { $this->setFlash('danger', 'El nombre de usuario ya está en uso.'); header('Location: ' . Config::basePath() . 'empleados/editar/' . $id); exit; } // Actualizar usuario existente $payload = [ 'usuario' => $data['usuario'], 'nombre' => $data['nombre'], 'rol' => $rolAlias, ]; if ($data['password'] !== null && $data['password'] !== '') { $payload['password'] = $data['password']; } Usuario::actualizar((int) $usuarioIdActual, $payload); $data['usuario_id'] = (int) $usuarioIdActual; } else { // Crear nuevo usuario: requiere contraseña if ($data['password'] === null || $data['password'] === '') { $this->setFlash('danger', 'Debes indicar una contraseña para crear la cuenta de acceso.'); header('Location: ' . Config::basePath() . 'empleados/editar/' . $id); exit; } if (Usuario::existeUsuario($data['usuario'])) { $this->setFlash('danger', 'El nombre de usuario ya está en uso.'); header('Location: ' . Config::basePath() . 'empleados/editar/' . $id); exit; } $nuevoUsuarioId = Usuario::crear([ 'nombre' => $data['nombre'], 'usuario' => $data['usuario'], 'password' => $data['password'], 'rol' => $rolAlias, 'activo' => 1, ]); $data['usuario_id'] = (int) $nuevoUsuarioId; } } else { $data['usuario_id'] = $usuarioIdActual; if ($usuarioIdActual) { Usuario::actualizar((int) $usuarioIdActual, ['rol' => $rolAlias]); } } // Hash de contraseña para tabla empleados if ($data['password'] !== null) { $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT); } else { unset($data['password']); } Empleado::actualizar($id, $data); $this->setFlash('success', 'Empleado actualizado correctamente.'); header('Location: ' . Config::basePath() . 'empleados'); exit; } public function eliminar(int $id): void { if (Empleado::eliminar($id)) { $this->setFlash('success', 'Empleado eliminado correctamente.'); } else { $this->setFlash('warning', 'No se pudo eliminar el registro.'); } header('Location: ' . Config::basePath() . 'empleados'); exit; } public function asistencia(): void { $empleados = Empleado::activos(); $enTurno = Empleado::empleadosEnTurno(); $registros = Empleado::asistenciasRecientes(); $mensaje = $this->consumeFlash(); $this->view('empleados/asistencia', [ 'title' => 'Control de asistencia', 'empleados' => $empleados, 'enTurno' => $enTurno, 'registros' => $registros, 'mensaje' => $mensaje, ]); } public function marcarEntrada(int $id): void { $registro = Empleado::registrarEntrada($id); if ($registro) { $hora = $registro['entrada'] ?? date('H:i'); $this->setFlash('success', 'Entrada registrada a las ' . $hora . ' hs.'); } else { $this->setFlash('warning', 'No se pudo registrar la entrada.'); } header('Location: ' . Config::basePath() . 'empleados/asistencia'); exit; } public function eliminarAsistencia(int $id): void { $exito = Empleado::eliminarAsistenciaPorId($id); if ($exito) { $this->setFlash('success', 'Registro de asistencia eliminado.'); } else { $this->setFlash('warning', 'No se encontró el registro especificado.'); } header('Location: ' . Config::basePath() . 'empleados/asistencia'); exit; } public function eliminarAsistenciaDia(int $id): void { $exito = Empleado::eliminarAsistenciaDia($id); if ($exito) { $this->setFlash('success', 'Asistencia del día eliminada correctamente.'); } else { $this->setFlash('warning', 'No se encontró asistencia registrada para hoy.'); } header('Location: ' . Config::basePath() . 'empleados/asistencia'); exit; } public function marcarSalida(int $id): void { $registro = Empleado::registrarSalida($id); if ($registro) { $hora = $registro['salida'] ?? date('H:i'); $this->setFlash('success', 'Salida registrada a las ' . $hora . ' hs.'); } else { $this->setFlash('warning', 'No se encontró entrada previa para cerrar.'); } header('Location: ' . Config::basePath() . 'empleados/asistencia'); exit; } public function tareas(): void { $empleados = Empleado::activos(); $tareas = Empleado::tareas(); $mensaje = $this->consumeFlash(); $this->view('empleados/tareas', [ 'title' => 'Tareas del día', 'empleados' => $empleados, 'tareas' => $tareas, 'mensaje' => $mensaje, ]); } public function guardarTarea(): void { $empleadoId = (int) ($_POST['empleado_id'] ?? 0); $tarea = trim($_POST['tarea'] ?? ''); $fecha = $_POST['fecha'] ?? date('Y-m-d'); $estado = $_POST['estado'] ?? 'Pendiente'; $errores = []; if ($empleadoId <= 0) { $errores[] = 'Selecciona un empleado válido.'; } if ($tarea === '') { $errores[] = 'Describe la tarea a asignar.'; } if ($errores) { $this->setFlash('danger', implode(' ', $errores)); header('Location: ' . Config::basePath() . 'empleados/tareas'); exit; } Empleado::guardarTarea([ 'empleado_id' => $empleadoId, 'tarea' => $tarea, 'fecha' => $fecha, 'estado' => $estado, ]); $this->setFlash('success', 'Tarea asignada correctamente.'); header('Location: ' . Config::basePath() . 'empleados/tareas'); exit; } public function actualizarEstadoTarea(int $id): void { $estado = $_POST['estado'] ?? 'Pendiente'; if (Empleado::actualizarTarea($id, ['estado' => $estado])) { $this->setFlash('success', 'Estado de tarea actualizado.'); } else { $this->setFlash('warning', 'No se pudo actualizar la tarea.'); } header('Location: ' . Config::basePath() . 'empleados/tareas'); exit; } public function eliminarTarea(int $id): void { if (Empleado::eliminarTarea($id)) { $this->setFlash('success', 'Tarea eliminada.'); } else { $this->setFlash('warning', 'No se pudo eliminar la tarea.'); } header('Location: ' . Config::basePath() . 'empleados/tareas'); exit; } public function roles(): void { Empleado::renombrarRolPorAlias('empleado', 'Empleado'); $roles = Empleado::roles(); $usuarioActual = $_SESSION['user']['rol'] ?? 'admin'; $permisosActuales = Empleado::permisosPorRol($usuarioActual); $rolSesion = Empleado::rolPorAlias($usuarioActual); $usuarioActualNombre = $rolSesion['nombre'] ?? $usuarioActual; $mensaje = $this->consumeFlash(); $this->view('empleados/roles', [ 'title' => 'Roles y permisos', 'roles' => $roles, 'usuarioActual' => $usuarioActual, 'usuarioActualNombre' => $usuarioActualNombre, 'permisosActuales' => $permisosActuales, 'permisosDisponibles' => Empleado::permisosDisponibles(), 'mensaje' => $mensaje, ]); } public function guardarPermisosRol(): void { if ($_SERVER['REQUEST_METHOD'] !== 'POST') { header('Location: ' . Config::basePath() . 'empleados/roles'); exit; } $permisosPorRol = $_POST['permisos'] ?? []; $actualizados = 0; foreach ($permisosPorRol as $rolId => $perms) { $rolIdInt = (int) $rolId; if ($rolIdInt <= 0) { continue; } $permsList = is_array($perms) ? array_values(array_map('strval', $perms)) : []; if (Empleado::actualizarPermisosRol($rolIdInt, $permsList)) { $actualizados++; } } $this->setFlash('success', 'Permisos actualizados para ' . $actualizados . ' rol(es).'); header('Location: ' . Config::basePath() . 'empleados/roles'); exit; } private function sanitizarEmpleado(array $data, bool $esActualizacion = false): array { $password = trim($data['password'] ?? ''); if ($esActualizacion && $password === '') { $password = null; } return [ 'nombre' => trim($data['nombre'] ?? ''), 'telefono' => trim($data['telefono'] ?? ''), 'correo' => trim($data['correo'] ?? ''), 'rol_id' => isset($data['rol_id']) ? (int) $data['rol_id'] : 0, 'rol' => $data['rol'] ?? '', 'estado' => $data['estado'] ?? 'Activo', 'password' => $esActualizacion ? $password : trim($data['password'] ?? ''), 'usuario' => trim($data['usuario'] ?? ''), 'usuario_id' => isset($data['usuario_id']) ? (int) $data['usuario_id'] : null, ]; } private function validarEmpleado(array $data, bool $esActualizacion = false): array { $errores = []; if ($data['nombre'] === '') { $errores[] = 'El nombre es obligatorio.'; } if ($data['telefono'] === '') { $errores[] = 'El teléfono es obligatorio.'; } if ($data['correo'] === '') { $errores[] = 'El correo es obligatorio.'; } if ($data['rol_id'] <= 0) { $errores[] = 'Selecciona un rol válido.'; } if (!in_array($data['estado'], ['Activo', 'Inactivo'], true)) { $errores[] = 'Selecciona un estado válido.'; } if ($esActualizacion) { if ($data['password'] !== null && strlen($data['password']) < 6) { $errores[] = 'La contraseña debe tener al menos 6 caracteres.'; } } else { if ($data['password'] === '') { $errores[] = 'Define una contraseña temporal para el empleado.'; } elseif (strlen($data['password']) < 6) { $errores[] = 'La contraseña debe tener al menos 6 caracteres.'; } } return $errores; } private function setFlash(string $tipo, string $mensaje): void { if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); } $_SESSION['flash']['empleados'] = ['tipo' => $tipo, 'mensaje' => $mensaje]; } private function consumeFlash(): ?array { if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); } if (!empty($_SESSION['flash']['empleados'])) { $flash = $_SESSION['flash']['empleados']; unset($_SESSION['flash']['empleados']); return $flash; } return null; } private function requireAuth(): void { if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); } if (!isset($_SESSION['user'])) { header('Location: ' . Config::basePath() . 'login'); exit; } } }
Coded With 💗 by
0x6ick