getMessage(); } $pageTitle = "Recursos Humanos - Evaluaciones"; $pageDescription = "Registro de evaluaciones internas y seguimiento del desempeño del personal."; $areasValidas = ['Ventas', 'Almacén', 'Marketing', 'Administración', 'Finanzas', 'Gerencia']; $resultadosValidos = ['Aprobado', 'En Capacitación', 'Requiere Seguimiento']; $notice = null; $noticeType = 'success'; if (!empty($schemaInitError)) { $notice = 'Error al preparar las tablas de Recursos Humanos.'; $noticeType = 'danger'; error_log('HR schema init error (evaluaciones): ' . $schemaInitError); } if (isset($_GET['success']) && $_GET['success'] === '1') { $notice = 'Evaluación guardada correctamente.'; $noticeType = 'success'; } // Lista de colaboradores para los selects $colaboradores = []; try { $stmt = $pdo->query('SELECT id, nombre_completo, area FROM hr_colaboradores ORDER BY nombre_completo ASC'); $colaboradores = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (Throwable $e) { $colaboradores = []; } if ($_SERVER['REQUEST_METHOD'] === 'POST') { $action = $_POST['action'] ?? ''; if ($action === 'add_evaluacion') { try { $colaborador_id = (int)($_POST['colaborador_id'] ?? 0); $fecha = $_POST['fecha'] ?? date('Y-m-d'); $tipo_evaluacion = trim((string)($_POST['tipo_evaluacion'] ?? '')); $puntaje = (int)($_POST['puntaje'] ?? 0); $resultado = (string)($_POST['resultado'] ?? ''); $observaciones = trim((string)($_POST['observaciones'] ?? '')); if ($colaborador_id <= 0) { throw new RuntimeException('Selecciona un colaborador.'); } if ($tipo_evaluacion === '') { throw new RuntimeException('Tipo de evaluación es obligatorio.'); } if (!in_array($resultado, $resultadosValidos, true)) { throw new RuntimeException('Resultado inválido.'); } // Traer área del colaborador para guardarla en el registro $stmtArea = $pdo->prepare('SELECT area FROM hr_colaboradores WHERE id = ? LIMIT 1'); $stmtArea->execute([$colaborador_id]); $areaRow = $stmtArea->fetch(PDO::FETCH_ASSOC); if (!$areaRow || empty($areaRow['area'])) { throw new RuntimeException('No se encontró el área del colaborador.'); } $area = (string)$areaRow['area']; if (!in_array($area, $areasValidas, true)) { // Seguridad extra throw new RuntimeException('Área inválida en el colaborador.'); } $stmt = $pdo->prepare('INSERT INTO hr_evaluaciones (colaborador_id, area, fecha, tipo_evaluacion, puntaje, resultado, observaciones) VALUES (?, ?, ?, ?, ?, ?, ?)'); $stmt->execute([ $colaborador_id, $area, $fecha, $tipo_evaluacion, $puntaje, $resultado, $observaciones, ]); header('Location: hr_evaluaciones.php?success=1'); exit; } catch (Throwable $e) { $notice = 'No se pudo guardar la evaluación: ' . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8'); $noticeType = 'danger'; } } } // --- Filtros de listado --- $f_colaborador = (int)($_GET['colaborador_id'] ?? 0); $f_resultado = (string)($_GET['resultado'] ?? 'Todos'); $f_fecha_desde = trim((string)($_GET['fecha_desde'] ?? '')); $f_fecha_hasta = trim((string)($_GET['fecha_hasta'] ?? '')); if ($f_resultado !== 'Todos' && !in_array($f_resultado, $resultadosValidos, true)) { $f_resultado = 'Todos'; } $where = []; $params = []; if ($f_colaborador > 0) { $where[] = 'e.colaborador_id = ?'; $params[] = $f_colaborador; } if ($f_resultado !== 'Todos') { $where[] = 'e.resultado = ?'; $params[] = $f_resultado; } if ($f_fecha_desde !== '') { $where[] = 'e.fecha >= ?'; $params[] = $f_fecha_desde; } if ($f_fecha_hasta !== '') { $where[] = 'e.fecha <= ?'; $params[] = $f_fecha_hasta; } $sql = 'SELECT e.id, e.fecha, e.tipo_evaluacion, e.puntaje, e.resultado, e.area, e.observaciones, c.nombre_completo, c.dni FROM hr_evaluaciones e LEFT JOIN hr_colaboradores c ON c.id = e.colaborador_id'; if (!empty($where)) { $sql .= ' WHERE ' . implode(' AND ', $where); } $sql .= ' ORDER BY e.fecha DESC, e.id DESC'; $evaluaciones = []; try { $stmt = $pdo->prepare($sql); $stmt->execute($params); $evaluaciones = $stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { error_log('HR Evaluaciones DB error: ' . $e->getMessage()); $notice = 'No se pudo cargar el listado de evaluaciones.'; $noticeType = 'danger'; } $fechaHoy = date('Y-m-d'); include 'layout_header.php'; ?>
| ID | Colaborador | Área | Fecha | Tipo | Puntaje | Resultado | Observaciones |
|---|---|---|---|---|---|---|---|
| No hay evaluaciones para los filtros seleccionados. | |||||||
| = (int)$e['id']; ?> |
= htmlspecialchars($e['nombre_completo'] ?? '', ENT_QUOTES, 'UTF-8'); ?>
DNI: = htmlspecialchars($e['dni'], ENT_QUOTES, 'UTF-8'); ?>
|
= htmlspecialchars($e['area'] ?? '', ENT_QUOTES, 'UTF-8'); ?> | = htmlspecialchars($e['fecha'] ?? '', ENT_QUOTES, 'UTF-8'); ?> | = htmlspecialchars($e['tipo_evaluacion'] ?? '', ENT_QUOTES, 'UTF-8'); ?> | = (int)($e['puntaje'] ?? 0); ?> | = htmlspecialchars($e['resultado'] ?? '', ENT_QUOTES, 'UTF-8'); ?> |
= htmlspecialchars($e['observaciones'] ?? '', ENT_QUOTES, 'UTF-8'); ?>
|