Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
File Manager
/
AVIDOTAPP
/
models
:
EmpleadoModel.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php class EmpleadoModel { private $conexion; // BD principal (avidotapp) private $conexionExterna; // BD externa (almuerzo) public function __construct() { $database = new Database(); $this->conexion = $database->connect(); $this->conexionExterna = $database->connectExternal(); } // ─── Datos para selects ──────────────────────────────────────── /** * ✅ MODIFICADO: Centros de costo desde BD EXTERNA (almuerzo.ccosto) */ public function getCentrosCosto() { // Intentar BD externa primero if ($this->conexionExterna) { $result = mysqli_query($this->conexionExterna, "SELECT Id_ccosto, D_ccosto FROM ccosto ORDER BY D_ccosto" ); if ($result) { $rows = []; while ($r = mysqli_fetch_assoc($result)) $rows[] = $r; if (!empty($rows)) return $rows; // Si tiene datos, úsalos } } // Fallback a BD principal si falla la externa $result = mysqli_query($this->conexion, "SELECT CCOSTO, DESCRIPCION FROM ccosto ORDER BY DESCRIPCION" ); $rows = []; while ($r = mysqli_fetch_assoc($result)) $rows[] = $r; return $rows; } public function getAreas() { $result = mysqli_query($this->conexion, "SELECT * FROM area ORDER BY area"); $rows = []; while ($r = mysqli_fetch_assoc($result)) $rows[] = $r; return $rows; } public function getCargos() { $result = mysqli_query($this->conexion, "SELECT * FROM cargo ORDER BY CARGO"); $rows = []; while ($r = mysqli_fetch_assoc($result)) $rows[] = $r; return $rows; } public function getInventarioDisponible() { $result = mysqli_query($this->conexion, "SELECT CODIGO, DESCRIPCION, CANTIDAD FROM inventario WHERE CANTIDAD > 0 ORDER BY DESCRIPCION"); $rows = []; while ($r = mysqli_fetch_assoc($result)) $rows[] = $r; return $rows; } // ─── NUEVO: Buscar empleado en BD EXTERNA (almuerzo.empleados) ─ /** * ✅ NUEVO: Busca en BD externa primero (más actualizada) * Devuelve: cedula, nombre (concatenado), ccosto, cargo * Si no encuentra, busca en BD principal como fallback */ public function buscarEmpleadoEnBDExterna($cedula) { if (!$this->conexionExterna) return null; $cedula_esc = mysqli_real_escape_string($this->conexionExterna, trim($cedula)); $result = mysqli_query($this->conexionExterna, "SELECT cedula, CONCAT(TRIM(nombre), ' ', TRIM(apellido)) AS nombre, ccosto, cargo FROM empleados WHERE cedula = '$cedula_esc' LIMIT 1" ); if ($result && mysqli_num_rows($result) > 0) { return mysqli_fetch_assoc($result); } return null; } // ─── NUEVO: Buscar SOLO en BD interna (sin BD externa) ───────── /** * ✅ Busca ÚNICAMENTE en BD principal (avidotapp.empleado) * Usado para verificar si un empleado YA FUE REGISTRADO en el sistema interno * NO consulta BD externa (almuerzo) */ public function buscarEmpleadoEnBDInterna($cedula) { $cedula_esc = mysqli_real_escape_string($this->conexion, trim($cedula)); $result = mysqli_query($this->conexion, "SELECT * FROM empleado WHERE cedula = '$cedula_esc' ORDER BY id DESC LIMIT 1" ); if ($result && mysqli_num_rows($result) > 0) { return mysqli_fetch_assoc($result); } return null; } /** * Busca ÚNICAMENTE registros en estado 'Pendiente' en BD interna. * Si existe un Pendiente → se le agregan EPP (no se crea nuevo registro). * Si no existe (o todos están 'Entregados') → se crea registro nuevo. */ public function buscarEmpleadoPendienteEnBDInterna($cedula) { $cedula_esc = mysqli_real_escape_string($this->conexion, trim($cedula)); $result = mysqli_query($this->conexion, "SELECT * FROM empleado WHERE cedula = '$cedula_esc' AND ESTADO = 'Pendiente' ORDER BY id DESC LIMIT 1" ); if ($result && mysqli_num_rows($result) > 0) { return mysqli_fetch_assoc($result); } return null; } /** * Buscar un registro de empleado por su ID primario. * Usado para verificar el estado antes de agregar EPP. */ public function buscarEmpleadoPorId($id) { $id = intval($id); $result = mysqli_query($this->conexion, "SELECT * FROM empleado WHERE id = $id LIMIT 1" ); if ($result && mysqli_num_rows($result) > 0) { return mysqli_fetch_assoc($result); } return null; } // ─── MODIFICADO: Buscar último registro por cédula (autocompletar) ─ /** * ✅ MODIFICADO: Busca primero en BD externa (datos frescos), * luego complementa con BD principal (tallas, etc.) */ public function buscarUltimoRegistroPorCedula($cedula) { $datosExternos = $this->buscarEmpleadoEnBDExterna($cedula); // Buscar en BD principal (para tallas, área, etc.) usando método específico $datosInternos = $this->buscarEmpleadoEnBDInterna($cedula) ?? []; // ✅ MERGE: Datos externos (más actuales) + datos internos (tallas) if ($datosExternos) { // Priorizar datos externos para: nombre, ccosto, cargo return array_merge($datosInternos, [ 'cedula' => $datosExternos['cedula'], 'nombre' => $datosExternos['nombre'], // nombre completo concatenado 'ccosto' => $datosExternos['ccosto'], 'cargo' => $datosExternos['cargo'], // Mantener tallas, área, etc. de BD interna 'area' => $datosInternos['area'] ?? '', 'fingreso' => $datosInternos['fingreso'] ?? date('Y-m-d'), 'tallaPant' => $datosInternos['tallaPant'] ?? $datosInternos['TALLAPANT'] ?? '', 'tallaCami' => $datosInternos['tallaCami'] ?? $datosInternos['TALLACAMI'] ?? '', 'tallaBot' => $datosInternos['tallaBot'] ?? $datosInternos['TALLABOT'] ?? '', 'tallaChaq' => $datosInternos['tallaChaq'] ?? $datosInternos['TALLACHAQ'] ?? '', 'tallaImp' => $datosInternos['tallaImp'] ?? $datosInternos['TALLAIMP'] ?? '', 'tpEntrega' => $datosInternos['tpEntrega'] ?? $datosInternos['TPENTREGA'] ?? '', 'tpContrato' => $datosInternos['tpContrato'] ?? $datosInternos['TPCONTRATO'] ?? '', 'id' => $datosInternos['id'] ?? null, ]); } // Si no hay datos externos, devolver solo los internos return !empty($datosInternos) ? $datosInternos : null; } // ─── NUEVO: Todos los registros de una cédula (para consulta) ────── public function obtenerRegistrosPorCedula($cedula) { $cedula = mysqli_real_escape_string($this->conexion, trim($cedula)); $result = mysqli_query($this->conexion, "SELECT e.*, (SELECT GROUP_CONCAT(d.nombre_epp, ' (x', d.cantidad, ')' SEPARATOR ', ') FROM dotacion d WHERE d.empleado_id = e.id) AS epp_lista FROM empleado e WHERE e.cedula = '$cedula' ORDER BY e.id DESC" ); $rows = []; while ($r = mysqli_fetch_assoc($result)) $rows[] = $r; return $rows; } // ─── Insertar empleado + dotación ───────────────────────────────── public function insertarEmpleadoConDotacion($datosEmpleado, $dotaciones) { mysqli_autocommit($this->conexion, FALSE); try { $fingreso = mysqli_real_escape_string($this->conexion, $datosEmpleado['fingreso']); $ident = strtoupper(trim(mysqli_real_escape_string($this->conexion, $datosEmpleado['ident']))); $nombre = strtoupper(trim(mysqli_real_escape_string($this->conexion, $datosEmpleado['nombre']))); $ccosto = mysqli_real_escape_string($this->conexion, $datosEmpleado['ccosto']); $area = mysqli_real_escape_string($this->conexion, $datosEmpleado['area']); $cargo = mysqli_real_escape_string($this->conexion, $datosEmpleado['cargo']); $tallaPant = strtoupper(trim(mysqli_real_escape_string($this->conexion, $datosEmpleado['tallaPant']))); $tallaCami = strtoupper(trim(mysqli_real_escape_string($this->conexion, $datosEmpleado['tallaCami']))); $tallaBot = strtoupper(trim(mysqli_real_escape_string($this->conexion, $datosEmpleado['tallaBot']))); $tallaChaq = strtoupper(trim(mysqli_real_escape_string($this->conexion, $datosEmpleado['tallaChaq']))); $tallaImp = strtoupper(trim(mysqli_real_escape_string($this->conexion, $datosEmpleado['tallaImp']))); $tpContrato = mysqli_real_escape_string($this->conexion, $datosEmpleado['tpContrato']); $tpEntrega = mysqli_real_escape_string($this->conexion, $datosEmpleado['tpEntrega']); $q = "INSERT INTO empleado (fingreso, cedula, nombre, ccosto, area, cargo, tallaPant, tallaCami, tallaBot, tallaChaq, tallaImp, tpContrato, ESTADO, tpEntrega) VALUES ('$fingreso','$ident','$nombre','$ccosto','$area','$cargo', '$tallaPant','$tallaCami','$tallaBot','$tallaChaq','$tallaImp', '$tpContrato','Pendiente','$tpEntrega')"; if (!mysqli_query($this->conexion, $q)) throw new Exception("Error al registrar empleado: " . mysqli_error($this->conexion)); $empleado_id = mysqli_insert_id($this->conexion); if ($empleado_id <= 0) throw new Exception("No se pudo obtener el ID del empleado registrado."); $entregas_realizadas = 0; foreach ($dotaciones as $dot) { if (!empty($dot['descripcion']) && intval($dot['cantidad']) > 0) { $desc = mysqli_real_escape_string($this->conexion, $dot['descripcion']); $cant = intval($dot['cantidad']); $codigo = isset($dot['codigo']) ? trim($dot['codigo']) : ''; // Si codigo_epp es numérico (INT), no usar comillas if (!empty($codigo) && is_numeric($codigo)) { $codigo_int = intval($codigo); $qd = "INSERT INTO dotacion (empleado_id, codigo_epp, nombre_epp, cantidad, fecha_entrega) VALUES ($empleado_id, $codigo_int, '$desc', $cant, NOW())"; } else { if (empty($codigo)) { $qd = "INSERT INTO dotacion (empleado_id, codigo_epp, nombre_epp, cantidad, fecha_entrega) VALUES ($empleado_id, NULL, '$desc', $cant, NOW())"; } else { $codigo_esc = mysqli_real_escape_string($this->conexion, $codigo); $qd = "INSERT INTO dotacion (empleado_id, codigo_epp, nombre_epp, cantidad, fecha_entrega) VALUES ($empleado_id, '$codigo_esc', '$desc', $cant, NOW())"; } } if (!mysqli_query($this->conexion, $qd)) throw new Exception("Error al insertar dotación $desc: " . mysqli_error($this->conexion)); $entregas_realizadas++; } } mysqli_commit($this->conexion); return ['success' => true, 'empleado_id' => $empleado_id, 'nombre' => $nombre, 'entregas_realizadas' => $entregas_realizadas]; } catch (Exception $e) { mysqli_rollback($this->conexion); return ['success' => false, 'error' => $e->getMessage()]; } finally { mysqli_autocommit($this->conexion, TRUE); } } // ─── Validar datos ──────────────────────────────────────────────── public function validarDatosEmpleado($datos) { $errores = []; if (empty($datos['fingreso'])) $errores[] = "La fecha de ingreso es obligatoria"; if (empty($datos['ident'])) $errores[] = "La cédula es obligatoria"; if (empty($datos['nombre'])) $errores[] = "El nombre es obligatorio"; if (empty($datos['ccosto'])) $errores[] = "El centro de costo es obligatorio"; if (empty($datos['area'])) $errores[] = "El área es obligatoria"; if (empty($datos['cargo'])) $errores[] = "El cargo es obligatorio"; if (empty($datos['tpEntrega'])) $errores[] = "El tipo de entrega es obligatorio"; if (empty($datos['tpContrato'])) $errores[] = "El tipo de contrato es obligatorio"; return $errores; } // ─── NUEVO: Agregar solo dotaciones a un empleado YA EXISTENTE ─── /** * Usado cuando el empleado ya existe en BD y solo queremos agregar EPP. * Busca el ID del empleado por cédula y agrega las dotaciones. */ public function agregarDotacionesSoloEPP($cedula, $dotaciones) { mysqli_autocommit($this->conexion, FALSE); try { $cedula_esc = mysqli_real_escape_string($this->conexion, trim($cedula)); // Buscar ID del empleado $result = mysqli_query($this->conexion, "SELECT id, nombre FROM empleado WHERE cedula = '$cedula_esc' ORDER BY id DESC LIMIT 1" ); if (!$result || mysqli_num_rows($result) == 0) { throw new Exception("No se encontró el empleado con cédula $cedula en la base de datos."); } $row = mysqli_fetch_assoc($result); $empleado_id = intval($row['id']); $nombre = $row['nombre']; if ($empleado_id <= 0) { throw new Exception("ID de empleado inválido."); } // Insertar dotaciones $entregas_realizadas = 0; foreach ($dotaciones as $dot) { if (!empty($dot['descripcion']) && intval($dot['cantidad']) > 0) { $desc = mysqli_real_escape_string($this->conexion, $dot['descripcion']); $cant = intval($dot['cantidad']); $codigo = isset($dot['codigo']) ? trim($dot['codigo']) : ''; // Si codigo_epp es numérico (INT), no usar comillas if (!empty($codigo) && is_numeric($codigo)) { $codigo_int = intval($codigo); $qd = "INSERT INTO dotacion (empleado_id, codigo_epp, nombre_epp, cantidad, fecha_entrega) VALUES ($empleado_id, $codigo_int, '$desc', $cant, NOW())"; } else { if (empty($codigo)) { $qd = "INSERT INTO dotacion (empleado_id, codigo_epp, nombre_epp, cantidad, fecha_entrega) VALUES ($empleado_id, NULL, '$desc', $cant, NOW())"; } else { $codigo_esc = mysqli_real_escape_string($this->conexion, $codigo); $qd = "INSERT INTO dotacion (empleado_id, codigo_epp, nombre_epp, cantidad, fecha_entrega) VALUES ($empleado_id, '$codigo_esc', '$desc', $cant, NOW())"; } } if (!mysqli_query($this->conexion, $qd)) throw new Exception("Error al insertar dotación $desc: " . mysqli_error($this->conexion)); $entregas_realizadas++; } } mysqli_commit($this->conexion); return ['success' => true, 'empleado_id' => $empleado_id, 'nombre' => $nombre, 'entregas_realizadas' => $entregas_realizadas]; } catch (Exception $e) { mysqli_rollback($this->conexion); return ['success' => false, 'error' => $e->getMessage()]; } finally { mysqli_autocommit($this->conexion, TRUE); } } // ═══════════════════════════════════════════════════════════════ // MÉTODOS DE EDICIÓN Y ELIMINACIÓN // ═══════════════════════════════════════════════════════════════ /** * Agregar un EPP a la dotación de un empleado */ public function agregarEPPADotacion($empleado_id, $codigo_epp, $nombre_epp, $cantidad) { $empleado_id = intval($empleado_id); $codigo_epp = trim($codigo_epp); $nombre_epp = mysqli_real_escape_string($this->conexion, $nombre_epp); $cantidad = intval($cantidad); // Validar que codigo_epp no esté vacío if (empty($codigo_epp)) { return ['success' => false, 'error' => 'El código EPP es obligatorio']; } // Si codigo_epp es numérico (INTEGER), no usar comillas if (is_numeric($codigo_epp)) { $codigo_epp_int = intval($codigo_epp); $q = "INSERT INTO dotacion (empleado_id, codigo_epp, nombre_epp, cantidad, fecha_entrega) VALUES ($empleado_id, $codigo_epp_int, '$nombre_epp', $cantidad, NOW())"; } else { $codigo_epp_escaped = mysqli_real_escape_string($this->conexion, $codigo_epp); $q = "INSERT INTO dotacion (empleado_id, codigo_epp, nombre_epp, cantidad, fecha_entrega) VALUES ($empleado_id, '$codigo_epp_escaped', '$nombre_epp', $cantidad, NOW())"; } if (mysqli_query($this->conexion, $q)) { return ['success' => true, 'mensaje' => 'EPP agregado correctamente']; } else { return ['success' => false, 'error' => mysqli_error($this->conexion)]; } } /** * Eliminar un EPP de la dotación */ public function eliminarEPPDeDotacion($empleado_id, $nombre_epp) { $empleado_id = intval($empleado_id); $nombre_epp = mysqli_real_escape_string($this->conexion, $nombre_epp); $q = "DELETE FROM dotacion WHERE empleado_id = $empleado_id AND nombre_epp = '$nombre_epp' LIMIT 1"; if (mysqli_query($this->conexion, $q)) { return ['success' => true, 'mensaje' => 'EPP eliminado correctamente']; } else { return ['success' => false, 'error' => mysqli_error($this->conexion)]; } } /** * Actualizar cantidad de un EPP en la dotación */ public function actualizarCantidadEPP($empleado_id, $nombre_epp, $cantidad) { $empleado_id = intval($empleado_id); $nombre_epp = mysqli_real_escape_string($this->conexion, $nombre_epp); $cantidad = intval($cantidad); $q = "UPDATE dotacion SET cantidad = $cantidad WHERE empleado_id = $empleado_id AND nombre_epp = '$nombre_epp' LIMIT 1"; if (mysqli_query($this->conexion, $q)) { return ['success' => true, 'mensaje' => 'Cantidad actualizada correctamente']; } else { return ['success' => false, 'error' => mysqli_error($this->conexion)]; } } /** * Eliminar completamente un registro de empleado y toda su dotación */ public function eliminarRegistroCompleto($id) { $id = intval($id); mysqli_autocommit($this->conexion, FALSE); try { // Eliminar dotaciones asociadas $q1 = "DELETE FROM dotacion WHERE empleado_id = $id"; if (!mysqli_query($this->conexion, $q1)) throw new Exception("Error al eliminar dotaciones: " . mysqli_error($this->conexion)); // Eliminar empleado $q2 = "DELETE FROM empleado WHERE id = $id"; if (!mysqli_query($this->conexion, $q2)) throw new Exception("Error al eliminar empleado: " . mysqli_error($this->conexion)); mysqli_commit($this->conexion); return ['success' => true, 'mensaje' => 'Registro eliminado completamente']; } catch (Exception $e) { mysqli_rollback($this->conexion); return ['success' => false, 'error' => $e->getMessage()]; } finally { mysqli_autocommit($this->conexion, TRUE); } } /** * Obtener EPP disponible desde la tabla inventario */ public function getEPPDisponiblesParaAgregar() { $result = mysqli_query($this->conexion, "SELECT CODIGO, DESCRIPCION, CANTIDAD FROM inventario WHERE CANTIDAD > 0 ORDER BY DESCRIPCION" ); if ($result) { $rows = []; while ($r = mysqli_fetch_assoc($result)) $rows[] = $r; return $rows; } return []; } } ?>