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