File "EntregaController.php"

Full Path: C:/wamp64/www/AVIDOTAPP/config/EntregaController.php
File size: 15.03 KB
MIME-type: text/x-php
Charset: utf-8

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