File "InventarioController.php"

Full Path: C:/wamp64/www/AVIDOTAPP/controllers/InventarioController.php
File size: 13.21 KB
MIME-type: text/x-php
Charset: utf-8

<?php
class InventarioController {
    private $modelo;

    public function __construct() {
        require_once 'models/InventarioModel.php';
        $this->modelo = new InventarioModel();
    }

    // ═══════════════════════════════════════════════════════════════
    // INVENTARIO PRINCIPAL
    // ═══════════════════════════════════════════════════════════════

    /**
     * Pantalla principal: lista EPPs con checkbox + cantidad para seleccionar
     * URL: index.php?controller=Inventario&action=index
     * Equivale a: inventario/DOTIN.PHP
     */
    public function index() {
        $this->verificarSesion();

        // Mensajes flash
        $msg_ok  = $_SESSION['mensaje_exito'] ?? '';
        $msg_err = $_SESSION['mensaje_error'] ?? '';
        unset($_SESSION['mensaje_exito'], $_SESSION['mensaje_error']);

        // POST — seleccionar elementos
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['CONTINUAR'])) {
            $seleccionados = $this->procesarSeleccion($_POST);
            if (!empty($seleccionados)) {
                $_SESSION['elementos_seleccionados'] = $seleccionados;
                $_SESSION['inv_tipo'] = 'principal';
                header('Location: index.php?controller=Inventario&action=verificar');
                exit();
            }
            $msg_err = 'Debes seleccionar al menos un elemento con cantidad válida.';
        }

        $epps = $this->modelo->getEPPs();
        include 'views/inventario/seleccionar.php';
    }

    /**
     * Verificar / previsualizar antes de confirmar — inventario principal
     * URL: index.php?controller=Inventario&action=verificar
     * Equivale a: inventario/VERNOEN.PHP (con factura/proveedor/precio)
     */
    public function verificar() {
        $this->verificarSesion();

        // Eliminar elemento de la lista
        if (isset($_GET['eliminar'])) {
            $this->eliminarDeSession($_GET['eliminar']);
            header('Location: index.php?controller=Inventario&action=verificar');
            exit();
        }

        // Guardar info factura/proveedor/precio por elemento (AJAX o POST)
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['guardar_info'])) {
            $codigo = $_POST['codigo'];
            if (!isset($_SESSION['info_elementos'])) $_SESSION['info_elementos'] = [];
            $_SESSION['info_elementos'][$codigo] = [
                'nfactura' => trim($_POST['nfactura'] ?? ''),
                'provedor' => trim($_POST['provedor'] ?? ''),
                'precio'   => floatval($_POST['precio'] ?? 0),
            ];
            echo json_encode(['ok' => true]);
            exit();
        }

        // Confirmar ingreso
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['CONFIRMA'])) {
            $elementos     = $_SESSION['elementos_seleccionados'] ?? [];
            $info_elementos = $_SESSION['info_elementos'] ?? [];
            $user          = $_SESSION['DIGITA'] ?? 'DESCONOCIDO';

            // Validar que todos tengan factura y proveedor
            $errores = $this->validarInfoElementos($elementos, $info_elementos);
            if (!empty($errores)) {
                $_SESSION['mensaje_error'] = implode('<br>', $errores);
                header('Location: index.php?controller=Inventario&action=verificar');
                exit();
            }

            $resultado = $this->modelo->confirmarIngresoPrincipal($elementos, $info_elementos, $user);

            if ($resultado['ok']) {
                unset($_SESSION['elementos_seleccionados'], $_SESSION['info_elementos']);
                $_SESSION['mensaje_exito'] = 'Inventario actualizado correctamente.';
                header('Location: index.php?controller=Inventario&action=index');
            } else {
                $_SESSION['mensaje_error'] = $resultado['error'];
                header('Location: index.php?controller=Inventario&action=verificar');
            }
            exit();
        }

        $msg_ok  = $_SESSION['mensaje_exito'] ?? '';
        $msg_err = $_SESSION['mensaje_error'] ?? '';
        unset($_SESSION['mensaje_exito'], $_SESSION['mensaje_error']);

        $elementos_session = $_SESSION['elementos_seleccionados'] ?? [];
        $info_elementos    = $_SESSION['info_elementos'] ?? [];
        $elementos_mostrar = $this->prepararElementosVer($elementos_session, 'principal');

        include 'views/inventario/verificar.php';
    }

    /**
     * Agregar nuevo EPP al catálogo
     * URL: index.php?controller=Inventario&action=agregarEPP
     * Equivale a: inventario/AGREGAR.PHP
     */
    public function agregarEPP() {
        $this->verificarSesion();
        $msg_ok = $msg_err = '';

        if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['guardar'])) {
            $codigo = trim($_POST['codigo'] ?? '');
            $prenda = trim($_POST['prenda'] ?? '');

            if (strlen($codigo) >= 1 && strlen($prenda) >= 1) {
                if ($this->modelo->agregarEPP($codigo, $prenda)) {
                    $msg_ok = 'EPP creado correctamente.';
                } else {
                    $msg_err = 'Error al crear el EPP. Verifique que el código no exista.';
                }
            } else {
                $msg_err = 'Por favor completa todos los campos.';
            }
        }

        include 'views/inventario/agregar_epp.php';
    }

    /**
     * AJAX — actualizar cantidad en inventario principal
     * URL: index.php?controller=Inventario&action=ajaxActualizar  (POST)
     * Equivale a: inventario/BOTON.PHP
     */
    public function ajaxActualizar() {
        $codigo   = $_POST['codigo']   ?? '';
        $cantidad = $_POST['cantidad'] ?? 0;
        $ok = $this->modelo->actualizarCantidadPrincipal($codigo, (int)$cantidad);
        echo $ok ? 'success' : 'error';
        exit();
    }

    /**
     * AJAX — eliminar del inventario principal
     * URL: index.php?controller=Inventario&action=ajaxEliminar  (POST)
     * Equivale a: inventario/ELIMINAR.PHP
     */
    public function ajaxEliminar() {
        $codigo = $_POST['codigo'] ?? '';
        $ok = $this->modelo->eliminarItemPrincipal($codigo);
        echo $ok ? 'success' : 'Error: ' . 'no se pudo eliminar';
        exit();
    }

    // ═══════════════════════════════════════════════════════════════
    // INVENTARIO USADO
    // ═══════════════════════════════════════════════════════════════

    /**
     * Pantalla principal inventario usado
     * URL: index.php?controller=Inventario&action=usado
     * Equivale a: inventarioUsa/DOTIN.PHP
     */
    public function usado() {
        $this->verificarSesion();

        $msg_ok  = $_SESSION['mensaje_exito'] ?? '';
        $msg_err = $_SESSION['mensaje_error'] ?? '';
        unset($_SESSION['mensaje_exito'], $_SESSION['mensaje_error']);

        if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['CONTINUAR'])) {
            $seleccionados = $this->procesarSeleccion($_POST);
            if (!empty($seleccionados)) {
                $_SESSION['elementos_seleccionados'] = $seleccionados;
                $_SESSION['inv_tipo'] = 'usado';
                header('Location: index.php?controller=Inventario&action=verificarUsado');
                exit();
            }
            $msg_err = 'Debes seleccionar al menos un elemento con cantidad válida.';
        }

        $epps = $this->modelo->getEPPs();
        include 'views/inventario/seleccionar_usado.php';
    }

    /**
     * Verificar / previsualizar — inventario usado (sin factura/proveedor)
     * URL: index.php?controller=Inventario&action=verificarUsado
     * Equivale a: inventarioUsa/VERNOEN.PHP
     */
    public function verificarUsado() {
        $this->verificarSesion();

        if (isset($_GET['eliminar'])) {
            $this->eliminarDeSession($_GET['eliminar']);
            header('Location: index.php?controller=Inventario&action=verificarUsado');
            exit();
        }

        if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['CONFIRMA'])) {
            $elementos = $_SESSION['elementos_seleccionados'] ?? [];
            $user      = $_SESSION['DIGITA'] ?? 'DESCONOCIDO';

            $resultado = $this->modelo->confirmarIngresoUsado($elementos, $user);

            if ($resultado['ok']) {
                unset($_SESSION['elementos_seleccionados']);
                $_SESSION['mensaje_exito'] = 'Inventario de usados actualizado correctamente.';
                header('Location: index.php?controller=Inventario&action=usado');
            } else {
                $_SESSION['mensaje_error'] = $resultado['error'];
                header('Location: index.php?controller=Inventario&action=verificarUsado');
            }
            exit();
        }

        $msg_ok  = $_SESSION['mensaje_exito'] ?? '';
        $msg_err = $_SESSION['mensaje_error'] ?? '';
        unset($_SESSION['mensaje_exito'], $_SESSION['mensaje_error']);

        $elementos_session = $_SESSION['elementos_seleccionados'] ?? [];
        $elementos_mostrar = $this->prepararElementosVer($elementos_session, 'usado');

        include 'views/inventario/verificar_usado.php';
    }

    /**
     * AJAX — actualizar cantidad inventario usado
     * URL: index.php?controller=Inventario&action=ajaxActualizarUsado  (POST)
     */
    public function ajaxActualizarUsado() {
        $codigo   = $_POST['codigo']   ?? '';
        $cantidad = $_POST['cantidad'] ?? 0;
        $ok = $this->modelo->actualizarCantidadUsado($codigo, (int)$cantidad);
        echo $ok ? 'success' : 'error';
        exit();
    }

    /**
     * AJAX — eliminar del inventario usado
     * URL: index.php?controller=Inventario&action=ajaxEliminarUsado  (POST)
     */
    public function ajaxEliminarUsado() {
        $codigo = $_POST['codigo'] ?? '';
        $ok = $this->modelo->eliminarItemUsado($codigo);
        echo $ok ? 'success' : 'Error: no se pudo eliminar';
        exit();
    }

    // ═══════════════════════════════════════════════════════════════
    // HELPERS PRIVADOS
    // ═══════════════════════════════════════════════════════════════

    private function procesarSeleccion(array $post): array {
        $seleccionados = [];
        foreach ($post as $key => $value) {
            if (strpos($key, 'seleccionar_') === 0 && $value === 'on') {
                $codigo   = substr($key, 12);
                $cantidad = isset($post[$codigo]) ? intval($post[$codigo]) : 0;
                if ($cantidad > 0) {
                    $epps = $this->modelo->getEPPs();
                    $desc = '';
                    foreach ($epps as $e) {
                        if ($e['CODIGO'] === $codigo) { $desc = $e['NOMBRE']; break; }
                    }
                    $seleccionados[] = ['codigo' => $codigo, 'descripcion' => $desc, 'cantidad' => $cantidad];
                }
            }
        }
        return $seleccionados;
    }

    private function prepararElementosVer(array $elementos, string $tipo): array {
        $resultado = [];
        foreach ($elementos as $el) {
            $actual = $tipo === 'principal'
                ? $this->modelo->getCantidadActualPrincipal($el['codigo'])
                : $this->modelo->getCantidadActualUsado($el['codigo']);
            $resultado[] = [
                'codigo'         => $el['codigo'],
                'descripcion'    => $el['descripcion'],
                'cantidad'       => $el['cantidad'],
                'cantidad_actual'=> $actual,
                'cantidad_total' => $actual + $el['cantidad'],
            ];
        }
        return $resultado;
    }

    private function validarInfoElementos(array $elementos, array $info): array {
        $errores = [];
        foreach ($elementos as $el) {
            $cod = $el['codigo'];
            if (!isset($info[$cod])) {
                $errores[] = "Falta información de factura/proveedor para: {$el['descripcion']}";
                continue;
            }
            if (empty($info[$cod]['nfactura'])) $errores[] = "Falta N° factura para: {$el['descripcion']}";
            if (empty($info[$cod]['provedor'])) $errores[] = "Falta proveedor para: {$el['descripcion']}";
        }
        return $errores;
    }

    private function eliminarDeSession(string $codigo) {
        if (isset($_SESSION['elementos_seleccionados'])) {
            $_SESSION['elementos_seleccionados'] = array_values(
                array_filter($_SESSION['elementos_seleccionados'],
                    fn($el) => $el['codigo'] !== $codigo)
            );
        }
    }

    private function verificarSesion() {
        if (!isset($_SESSION['DIGITA']) || empty($_SESSION['DIGITA'])) {
            header('Location: index.php');
            exit();
        }
    }
}
?>