File "EntregaModel.php"
Full Path: C:/wamp64/www/AVIDOTAPP/models/EntregaModel.php
File size: 15.33 KB
MIME-type: text/x-php
Charset: utf-8
<?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;
}
}
?>