<?php class EntregaModel { private $conexion; public function __construct() { // Usa la clase Database definida en config/db.php $database = new Database(); $this->conexion = $database->connect(); } // ───────────────────────────────────────────────────────────── // BÚSQUEDA DE EMPLEADOS // ───────────────────────────────────────────────────────────── /** * Buscar empleado por cédula con estado Pendiente (retorna el primero - compatibilidad) */ public function buscarEmpleadoPendiente($cedula) { $cedula = mysqli_real_escape_string($this->conexion, $cedula); $query = "SELECT * FROM empleado WHERE cedula = '$cedula' AND ESTADO = 'Pendiente'"; $result = mysqli_query($this->conexion, $query); if ($result === false) { throw new Exception("Error en la consulta empleado: " . mysqli_error($this->conexion)); } if (mysqli_num_rows($result) > 0) { return mysqli_fetch_assoc($result); } return null; } /** * Buscar TODOS los registros pendientes de una cédula (pueden ser varios) */ public function buscarTodosEmpleadosPendientes($cedula) { $cedula = mysqli_real_escape_string($this->conexion, $cedula); $query = "SELECT * FROM empleado WHERE cedula = '$cedula' AND ESTADO = 'Pendiente' ORDER BY id ASC"; $result = mysqli_query($this->conexion, $query); if ($result === false) { throw new Exception("Error en la consulta empleados pendientes: " . mysqli_error($this->conexion)); } $lista = []; while ($row = mysqli_fetch_assoc($result)) { $lista[] = $row; } return $lista; } /** * Buscar empleado por cédula sin filtro de estado */ public function buscarEmpleadoPorCedula($cedula) { $cedula = mysqli_real_escape_string($this->conexion, $cedula); $query = "SELECT * FROM empleado WHERE cedula = '$cedula'"; $result = mysqli_query($this->conexion, $query); if ($result && mysqli_num_rows($result) > 0) { return mysqli_fetch_assoc($result); } return null; } // ───────────────────────────────────────────────────────────── // DOTACIÓN // ───────────────────────────────────────────────────────────── /** * Obtener dotación pendiente de un empleado */ public function obtenerDotacionPendiente($empleado_id) { $empleado_id = mysqli_real_escape_string($this->conexion, $empleado_id); $query = "SELECT codigo_epp, nombre_epp, cantidad FROM dotacion WHERE empleado_id = '$empleado_id'"; $result = mysqli_query($this->conexion, $query); if ($result === false) { throw new Exception("Error en la consulta dotación: " . mysqli_error($this->conexion)); } $dotacion = []; while ($row = mysqli_fetch_assoc($result)) { $dotacion[] = $row; } return $dotacion; } /** * Obtener última entrega de EPP registrada para un empleado */ public function obtenerUltimaEntrega($cedula) { $cedula = mysqli_real_escape_string($this->conexion, $cedula); $query = "SELECT * FROM dotxcc WHERE CEDULA = '$cedula' ORDER BY ID DESC LIMIT 1"; $result = mysqli_query($this->conexion, $query); if ($result && mysqli_num_rows($result) > 0) { return mysqli_fetch_assoc($result); } return null; } // ───────────────────────────────────────────────────────────── // INVENTARIO // ───────────────────────────────────────────────────────────── /** * Obtener EPP disponible en inventario filtrado por la dotación asignada al empleado */ public function obtenerEppFiltradoPorDotacion($empleado_id, $tipo_inventario) { $empleado_id = mysqli_real_escape_string($this->conexion, $empleado_id); $tabla = ($tipo_inventario === 'nuevo') ? 'inventario' : 'inventariousado'; // Obtener nombres de EPP asignados $query_nombres = "SELECT DISTINCT nombre_epp FROM dotacion WHERE empleado_id = '$empleado_id'"; $result_nombres = mysqli_query($this->conexion, $query_nombres); if (!$result_nombres || mysqli_num_rows($result_nombres) == 0) { return []; } $nombres = []; while ($row = mysqli_fetch_assoc($result_nombres)) { $nombres[] = "'" . mysqli_real_escape_string($this->conexion, $row['nombre_epp']) . "'"; } $nombres_str = implode(',', $nombres); $query = "SELECT * FROM $tabla WHERE CANTIDAD > 0 AND (DESCRIPCION IN ($nombres_str) OR CODIGO IN ($nombres_str)) ORDER BY CODIGO"; $result = mysqli_query($this->conexion, $query); if (!$result) { throw new Exception("Error al consultar inventario filtrado: " . mysqli_error($this->conexion)); } $epp = []; while ($row = mysqli_fetch_assoc($result)) { $epp[] = $row; } return $epp; } /** * Verificar stock disponible de un item */ public function verificarStock($id, $tabla) { $id = intval($id); $tabla_segura = ($tabla === 'inventario') ? 'inventario' : 'inventariousado'; $query = "SELECT CANTIDAD FROM $tabla_segura WHERE ID = $id"; $result = mysqli_query($this->conexion, $query); if (!$result) { throw new Exception("Error al verificar stock en $tabla_segura: " . mysqli_error($this->conexion)); } if (mysqli_num_rows($result) == 0) { throw new Exception("El item con ID $id no existe en $tabla_segura"); } $row = mysqli_fetch_assoc($result); return intval($row['CANTIDAD']); } // ───────────────────────────────────────────────────────────── // TALLAS // ───────────────────────────────────────────────────────────── /** * Actualizar tallas de un empleado */ public function actualizarTallas($cedula, $tallas) { $cedula = mysqli_real_escape_string($this->conexion, $cedula); $pant = mysqli_real_escape_string($this->conexion, $tallas['tallaPant']); $cami = mysqli_real_escape_string($this->conexion, $tallas['tallaCami']); $bot = mysqli_real_escape_string($this->conexion, $tallas['tallaBot']); $chaq = mysqli_real_escape_string($this->conexion, $tallas['tallaChaq']); $imp = mysqli_real_escape_string($this->conexion, $tallas['tallaImp']); $query = "UPDATE empleado SET tallapant = '$pant', tallacami = '$cami', tallabot = '$bot', tallachaq = '$chaq', tallaimp = '$imp' WHERE cedula = '$cedula' AND ESTADO = 'Pendiente'"; if (!mysqli_query($this->conexion, $query)) { throw new Exception("Error al actualizar tallas: " . mysqli_error($this->conexion)); } return mysqli_affected_rows($this->conexion) > 0; } // ───────────────────────────────────────────────────────────── // PROCESAMIENTO DE ENTREGA // ───────────────────────────────────────────────────────────── /** * Procesar entrega completa de EPP (transacción) */ public function procesarEntrega($datosEmpleado, $eppItems, $userEntrega) { mysqli_autocommit($this->conexion, false); try { $cedula = mysqli_real_escape_string($this->conexion, $datosEmpleado['cedula']); $nombre = 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']); $tpEntrega = mysqli_real_escape_string($this->conexion, $datosEmpleado['tpEntrega']); $fEntrega = date('Y-m-d'); $tpEstado = 'Entregado'; $fechaActual = date('Y-m-d H:i:s'); $userEntregaEsc = mysqli_real_escape_string($this->conexion, $userEntrega); // 1. Actualizar estado del empleado (solo el registro específico por ID) $empleado_id_reg = intval($datosEmpleado['empleado_id'] ?? 0); if ($empleado_id_reg > 0) { $q = "UPDATE empleado SET ESTADO = 'Entregado' WHERE id = $empleado_id_reg AND cedula = '$cedula'"; } else { // Fallback: actualizar solo el primer Pendiente de esa cédula $q = "UPDATE empleado SET ESTADO = 'Entregado' WHERE cedula = '$cedula' AND ESTADO = 'Pendiente' ORDER BY id ASC LIMIT 1"; } if (!mysqli_query($this->conexion, $q)) { throw new Exception("Error al actualizar estado del empleado: " . mysqli_error($this->conexion)); } if (mysqli_affected_rows($this->conexion) == 0) { throw new Exception("No se encontró el empleado con cédula $cedula para actualizar"); } // 2. Procesar cada EPP foreach ($eppItems as $item) { $parts = explode('|', $item); if (count($parts) != 5) { throw new Exception("Formato de item EPP inválido: $item"); } $tipo = $parts[0]; $id = intval($parts[1]); $codigo = mysqli_real_escape_string($this->conexion, $parts[2]); $descripcion = mysqli_real_escape_string($this->conexion, $parts[3]); $cantidad = intval($parts[4]); if ($cantidad <= 0) { throw new Exception("Cantidad inválida para el item $codigo: $cantidad"); } // Verificar stock $tabla_inv = ($tipo === 'nuevo') ? 'inventario' : 'inventariousado'; $stock_disp = $this->verificarStock($id, $tabla_inv); if ($stock_disp < $cantidad) { throw new Exception("Stock insuficiente para $codigo. Disponible: $stock_disp, Solicitado: $cantidad"); } // Insertar en dotxcc $q1 = "INSERT INTO dotxcc (CCOSTO, CEDULA, CARGO, ITEM, DESCRIPCION, CANTIDAD, FECHA, ESTADO) VALUES ('$ccosto', '$cedula', '$cargo', '$codigo', '$descripcion', '$cantidad', '$fechaActual', '$tpEstado')"; if (!mysqli_query($this->conexion, $q1)) { throw new Exception("Error al insertar en dotxcc: " . mysqli_error($this->conexion)); } // Insertar en entregasst $q2 = "INSERT INTO entregasst (cedula, nombre, ccosto, area, cargo, fEntrega, tpEstado, codigo, epp, cantidad, userEntrega, tpEntrega) VALUES ('$cedula', '$nombre', '$ccosto', '$area', '$cargo', '$fEntrega', '$tpEstado', '$codigo', '$descripcion', '$cantidad', '$userEntregaEsc', '$tpEntrega')"; if (!mysqli_query($this->conexion, $q2)) { throw new Exception("Error al insertar en entregasst: " . mysqli_error($this->conexion)); } // Insertar en registro histórico $tabla_reg = ($tipo === 'nuevo') ? 'regInventario' : 'regusado'; $q3 = "INSERT INTO $tabla_reg (CODIGO, DESCRIPCION, CANTIDAD, MOVIMIENTO, AREA, userEntrega, fechaIngreso) VALUES ('$codigo', '$descripcion', $cantidad, 'Salida', '$area', '$userEntregaEsc', NOW())"; if (!mysqli_query($this->conexion, $q3)) { throw new Exception("Error al insertar en $tabla_reg: " . mysqli_error($this->conexion)); } // Actualizar stock en inventario $nuevo_stock = $stock_disp - $cantidad; $q4 = "UPDATE $tabla_inv SET CANTIDAD = $nuevo_stock WHERE ID = $id"; if (!mysqli_query($this->conexion, $q4)) { throw new Exception("Error al actualizar inventario en $tabla_inv: " . mysqli_error($this->conexion)); } if (mysqli_affected_rows($this->conexion) == 0) { throw new Exception("No se pudo actualizar el inventario para el item ID: $id"); } } mysqli_commit($this->conexion); mysqli_autocommit($this->conexion, true); return [ 'success' => true, 'nombre' => $nombre, 'cedula' => $cedula, 'total_items' => count($eppItems), 'fecha' => date('d/m/Y H:i') ]; } catch (Exception $e) { mysqli_rollback($this->conexion); mysqli_autocommit($this->conexion, true); return [ 'success' => false, 'error' => $e->getMessage() ]; } } // ───────────────────────────────────────────────────────────── // HELPERS // ───────────────────────────────────────────────────────────── /** * Obtener un valor seguro de un array intentando múltiples claves */ public static function obtenerValorSeguro($array, $claves, $defecto = '') { if (!is_array($array)) return $defecto; foreach ($claves as $clave) { if (isset($array[$clave]) && $array[$clave] !== '') { return $array[$clave]; } } return $defecto; } } ?>