<?php class EntregaController { private $modelo; public function __construct() { require_once 'models/EntregaModel.php'; $this->modelo = new EntregaModel(); } // ───────────────────────────────────────────────────────────── // ACCIONES // ───────────────────────────────────────────────────────────── /** * Página principal: buscador de empleados * GET → index.php?controller=Entrega&action=index */ public function index() { $this->verificarSesion(); $empleado_info = null; $empleados_pendientes = []; // ← lista de todos los pendientes $mostrar_epp = false; $dotacion_pendiente = []; $inventario_nuevo = []; $inventario_usado = []; $mensaje_ultima = ''; $detalles_ultima = ''; $error_message = ''; // ── Mostrar mensajes de sesión ───────────────────────────── $mensaje_exito = ''; $mensaje_error = ''; if (isset($_SESSION['mensaje_exito'])) { $mensaje_exito = $_SESSION['mensaje_exito']; unset($_SESSION['mensaje_exito']); } if (isset($_SESSION['mensaje_error'])) { $mensaje_error = $_SESSION['mensaje_error']; unset($_SESSION['mensaje_error']); } // ── Procesar búsqueda ───────────────────────────────────── if (isset($_POST['buscar_empleado']) && !empty($_POST['cedula_empleado'])) { $cedula = trim($_POST['cedula_empleado']); try { $lista = $this->modelo->buscarTodosEmpleadosPendientes($cedula); if (!empty($lista)) { $mostrar_epp = true; // Para compatibilidad con la vista (última entrega, etc.) usamos el primero $empleado_info = $this->normalizarClaves($lista[0]); // Construir datos completos de cada pendiente foreach ($lista as $emp) { $emp = $this->normalizarClaves($emp); $emp_id = EntregaModel::obtenerValorSeguro($emp, ['id', 'ID'], ''); $emp['_dotacion'] = []; $emp['_inventario_nuevo'] = []; $emp['_inventario_usado'] = []; if ($emp_id !== '') { $emp['_dotacion'] = $this->modelo->obtenerDotacionPendiente($emp_id); $emp['_inventario_nuevo'] = $this->modelo->obtenerEppFiltradoPorDotacion($emp_id, 'nuevo'); $emp['_inventario_usado'] = $this->modelo->obtenerEppFiltradoPorDotacion($emp_id, 'usado'); } $empleados_pendientes[] = $emp; } // Dotación e inventario del primero (para compatibilidad) $dotacion_pendiente = $empleados_pendientes[0]['_dotacion']; $inventario_nuevo = $empleados_pendientes[0]['_inventario_nuevo']; $inventario_usado = $empleados_pendientes[0]['_inventario_usado']; // Última entrega $ultima = $this->modelo->obtenerUltimaEntrega($cedula); if ($ultima) { $fecha_ult = date('d/m/Y', strtotime($ultima['FECHA'])); $mensaje_ultima = "Empleado con dotación pendiente - Última entrega de EPP: $fecha_ult"; $detalles_ultima = "<div class='mt-2'> <strong>Item:</strong> {$ultima['ITEM']}<br> <strong>Descripción:</strong> {$ultima['DESCRIPCION']}<br> <strong>Cantidad:</strong> {$ultima['CANTIDAD']} </div>"; } else { $mensaje_ultima = "Empleado con dotación pendiente - Sin entregas previas de EPP"; $detalles_ultima = "<div class='mt-2'><em>Este empleado no tiene entregas previas registradas</em></div>"; } } else { $empleado_sin = $this->modelo->buscarEmpleadoPorCedula($cedula); if ($empleado_sin) { $estado_actual = $empleado_sin['ESTADO'] ?? 'Desconocido'; $error_message = "El empleado con cédula $cedula no tiene dotación pendiente.<br>Estado actual: <strong>$estado_actual</strong>"; } else { $error_message = "El empleado con cédula $cedula no se encuentra registrado en el sistema."; } } } catch (Exception $e) { $error_message = "Error al buscar empleado: " . $e->getMessage(); } } // ── Procesar actualización de tallas ────────────────────── if (isset($_POST['actualizar_tallas'])) { $cedula = trim($_POST['cedula_empleado']); try { $actualizado = $this->modelo->actualizarTallas($cedula, [ 'tallaPant' => $_POST['nueva_talla_pant'] ?? '', 'tallaCami' => $_POST['nueva_talla_cami'] ?? '', 'tallaBot' => $_POST['nueva_talla_bot'] ?? '', 'tallaChaq' => $_POST['nueva_talla_Chaq'] ?? '', 'tallaImp' => $_POST['nueva_talla_Imp'] ?? '', ]); if ($actualizado) { $mensaje_exito = 'Tallas actualizadas exitosamente'; // Recargar datos del empleado $empleado_info = $this->modelo->buscarEmpleadoPendiente($cedula); if ($empleado_info) { $empleado_info = $this->normalizarClaves($empleado_info); $mostrar_epp = true; $empleado_id = EntregaModel::obtenerValorSeguro($empleado_info, ['id', 'ID'], ''); if ($empleado_id !== '') { $dotacion_pendiente = $this->modelo->obtenerDotacionPendiente($empleado_id); $inventario_nuevo = $this->modelo->obtenerEppFiltradoPorDotacion($empleado_id, 'nuevo'); $inventario_usado = $this->modelo->obtenerEppFiltradoPorDotacion($empleado_id, 'usado'); } } } else { $error_message = 'No se pudieron actualizar las tallas. Verifique que el empleado esté en estado Pendiente.'; } } catch (Exception $e) { $error_message = 'Error al actualizar tallas: ' . $e->getMessage(); } } // ── Cargar vista ────────────────────────────────────────── include 'views/entregas/consulta.php'; } /** * Procesar entrega de EPP * POST → index.php?controller=Entrega&action=procesarEntrega */ public function procesarEntrega() { $this->verificarSesion(); if ($_SERVER['REQUEST_METHOD'] !== 'POST') { header('Location: index.php?controller=Entrega&action=index'); exit(); } // Validar datos mínimos if (!isset($_POST['guardar']) || !isset($_POST['epp_items'])) { $_SESSION['mensaje_error'] = 'Error: Datos incompletos para procesar la entrega.'; header('Location: index.php?controller=Entrega&action=index'); exit(); } $userEntrega = $_SESSION['DIGITA']; // Datos del empleado $datosEmpleado = [ 'cedula' => $_POST['cedula'] ?? '', 'nombre' => $_POST['nombre'] ?? '', 'ccosto' => $_POST['ccosto'] ?? '', 'area' => $_POST['area'] ?? '', 'cargo' => $_POST['cargo'] ?? '', 'tpEntrega' => $_POST['tpEntrega'] ?? '', ]; $epp_items = $_POST['epp_items']; $resultado = $this->modelo->procesarEntrega($datosEmpleado, $epp_items, $userEntrega); if ($resultado['success']) { $_SESSION['mensaje_exito'] = "✅ ENTREGA PROCESADA EXITOSAMENTE!\n\n" . "👤 Empleado: {$resultado['nombre']}\n" . "🆔 Cédula: {$resultado['cedula']}\n" . "📦 Items entregados: {$resultado['total_items']}\n" . "📅 Fecha: {$resultado['fecha']}\n\n" . "✨ El inventario ha sido actualizado automáticamente."; } else { $_SESSION['mensaje_error'] = "❌ ERROR AL PROCESAR LA ENTREGA:\n\n" . "{$resultado['error']}\n\n" . "🔄 Por favor, intente nuevamente.\n" . "💡 Verifique que haya suficiente stock disponible."; } header('Location: index.php?controller=Entrega&action=index'); exit(); } /** * Preparar y enviar formulario de entrega (acción interna desde consulta) * POST → index.php?controller=Entrega&action=prepararEntrega */ public function prepararEntrega() { $this->verificarSesion(); if ($_SERVER['REQUEST_METHOD'] !== 'POST') { header('Location: index.php?controller=Entrega&action=index'); exit(); } $cedula_empleado = $_POST['empleado_cedula'] ?? ''; $empleado_id_post = intval($_POST['empleado_id'] ?? 0); if (empty($cedula_empleado)) { $_SESSION['mensaje_error'] = 'Error: No se encontró información del empleado. Por favor, busque el empleado nuevamente.'; header('Location: index.php?controller=Entrega&action=index'); exit(); } try { $empleado_info = $this->modelo->buscarEmpleadoPendiente($cedula_empleado); if (!$empleado_info) { $_SESSION['mensaje_error'] = 'El empleado ya no tiene dotación pendiente o ha sido procesado por otro usuario.'; header('Location: index.php?controller=Entrega&action=index'); exit(); } if (!isset($_POST['epp_seleccionado']) || empty($_POST['epp_seleccionado'])) { $_SESSION['mensaje_error'] = 'Debe seleccionar al menos un elemento EPP para entregar.'; header('Location: index.php?controller=Entrega&action=index'); exit(); } $empleado_info = $this->normalizarClaves($empleado_info); // Construir epp_items con el mismo formato que espera procesarEntrega() $epp_items = []; foreach ($_POST['epp_seleccionado'] as $epp_selected) { $parts = explode('|', $epp_selected); if (count($parts) == 4) { $tipo = $parts[0]; $id = $parts[1]; $codigo = $parts[2]; $descripcion = $parts[3]; $cantidad = isset($_POST['cantidad'][$id]) ? intval($_POST['cantidad'][$id]) : 1; $epp_items[] = "$tipo|$id|$codigo|$descripcion|$cantidad"; } } if (empty($epp_items)) { $_SESSION['mensaje_error'] = 'No se pudo procesar ningún item EPP.'; header('Location: index.php?controller=Entrega&action=index'); exit(); } // Construir datos del empleado para procesarEntrega() $datosEmpleado = [ 'empleado_id' => $empleado_id_post ?: EntregaModel::obtenerValorSeguro($empleado_info, ['id', 'ID'], 0), 'cedula' => EntregaModel::obtenerValorSeguro($empleado_info, ['cedula', 'CEDULA'], ''), 'nombre' => EntregaModel::obtenerValorSeguro($empleado_info, ['nombre', 'NOMBRE'], ''), 'ccosto' => EntregaModel::obtenerValorSeguro($empleado_info, ['ccosto', 'CCOSTO'], ''), 'area' => EntregaModel::obtenerValorSeguro($empleado_info, ['area', 'AREA'], ''), 'cargo' => EntregaModel::obtenerValorSeguro($empleado_info, ['cargo', 'CARGO'], ''), 'tpEntrega' => EntregaModel::obtenerValorSeguro($empleado_info, ['tpEntrega', 'TPENTREGA'], ''), ]; $resultado = $this->modelo->procesarEntrega($datosEmpleado, $epp_items, $_SESSION['DIGITA']); if ($resultado['success']) { $_SESSION['mensaje_exito'] = "✅ ENTREGA PROCESADA EXITOSAMENTE!\n\n" . "👤 Empleado: {$resultado['nombre']}\n" . "🆔 Cédula: {$resultado['cedula']}\n" . "📦 Items entregados: {$resultado['total_items']}\n" . "📅 Fecha: {$resultado['fecha']}\n\n" . "✨ El inventario ha sido actualizado automáticamente."; } else { $_SESSION['mensaje_error'] = "❌ ERROR AL PROCESAR LA ENTREGA:\n\n" . "{$resultado['error']}\n\n" . "🔄 Por favor, intente nuevamente."; } } catch (Exception $e) { $_SESSION['mensaje_error'] = 'Error al procesar la entrega: ' . $e->getMessage(); } header('Location: index.php?controller=Entrega&action=index'); exit(); } // ───────────────────────────────────────────────────────────── // HELPERS PRIVADOS // ───────────────────────────────────────────────────────────── /** * Verificar que exista sesión activa */ private function verificarSesion() { if (!isset($_SESSION['DIGITA']) || empty($_SESSION['DIGITA'])) { header('Location: index.php'); exit(); } } /** * Normalizar claves del array del empleado para que siempre estén en minúsculas */ private function normalizarClaves($empleado) { if (isset($empleado['CEDULA']) && !isset($empleado['cedula'])) { $empleado['cedula'] = $empleado['CEDULA']; } if (isset($empleado['NOMBRE']) && !isset($empleado['nombre'])) { $empleado['nombre'] = $empleado['NOMBRE']; } return $empleado; } } ?>