<?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;
}
}
?>