File "insertar.php.bak"

Full Path: C:/wamp64/www/APPSST/dotacion/insertar.php.bak
File size: 14.51 KB
MIME-type: text/x-php
Charset: utf-8

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
session_start();

// Incluir conexión a la base de datos
include("../bd/conexion.php");

// Verificar si la conexión a la base de datos fue exitosa
if (!$conexion) {
    die("<script>alert('Error de conexión a la base de datos: ".mysqli_connect_error()."'); window.location.href='REG.PHP';</script>");
}

// ★★★ DEPURACIÓN INICIAL ★★★
error_log("=== INICIO INSERTAR.PHP ===");
error_log("POST recibido: " . print_r($_POST, true));

// Verificar si el formulario fue enviado correctamente
if(!isset($_POST['guardar'])) {
    error_log("ERROR: No se recibió el botón guardar");
    echo "<script>alert('Acceso no válido. Debe enviar el formulario.'); window.location.href='REG.PHP';</script>";
    exit();
}

// Obtener usuario de diferentes fuentes
$userEntrega = '';
if(isset($_POST['hidden_user']) && !empty($_POST['hidden_user'])) {
    $userEntrega = mysqli_real_escape_string($conexion, $_POST['hidden_user']);
    error_log("Usuario obtenido de hidden_user: " . $userEntrega);
} else if(isset($_SESSION['DIGITA']) && !empty($_SESSION['DIGITA'])) {
    $userEntrega = mysqli_real_escape_string($conexion, $_SESSION['DIGITA']);
    error_log("Usuario obtenido de sesión: " . $userEntrega);
} else {
    $userEntrega = 'USUARIO_' . $_SERVER["REMOTE_ADDR"];
    error_log("Usuario por defecto: " . $userEntrega);
}

// Validar y limpiar datos del formulario
$required_fields = ['ident', 'ccosto', 'cargo', 'fEntrega', 'tpEntrega', 'tpDevolutivo', 'tpEstado'];
foreach ($required_fields as $field) {
    if (!isset($_POST[$field]) || empty($_POST[$field])) {
        error_log("ERROR: Campo requerido faltante: $field");
        die("<script>alert('El campo $field es requerido'); window.location.href='REG.PHP';</script>");
    }
}

// Verificar si hay elementos EPP seleccionados
if(!isset($_POST['epp_items']) || empty($_POST['epp_items'])) {
    error_log("ERROR: No hay elementos EPP seleccionados");
    error_log("POST keys disponibles: " . implode(', ', array_keys($_POST)));
    die("<script>alert('No se han seleccionado elementos EPP para entregar'); window.location.href='REG.PHP';</script>");
}

// ★★★ MANEJAR INFORMACIÓN DEL EMPLEADO ★★★
$ident = mysqli_real_escape_string($conexion, $_POST['ident']);
$es_empleado_nuevo = isset($_POST['es_empleado_nuevo']) ? $_POST['es_empleado_nuevo'] : '0';
$empleado_completo = isset($_POST['empleado_completo']) ? $_POST['empleado_completo'] : '0';

// Determinar el nombre del empleado
if($es_empleado_nuevo == '1' && isset($_POST['nombre_nuevo']) && !empty($_POST['nombre_nuevo'])) {
    $nombre = strtoupper(mysqli_real_escape_string($conexion, $_POST['nombre_nuevo']));
    error_log("Nombre de empleado nuevo: " . $nombre);
} else {
    $nombre = strtoupper(mysqli_real_escape_string($conexion, $_POST['nombre']));
    error_log("Nombre de empleado existente: " . $nombre);
}

// Validar que el nombre no esté vacío
if(empty($nombre)) {
    error_log("ERROR: Nombre del empleado está vacío");
    die("<script>alert('Error: El nombre del empleado es requerido'); window.location.href='REG.PHP';</script>");
}

// Otros datos del formulario
$ccosto = mysqli_real_escape_string($conexion, $_POST['ccosto']);
$area = mysqli_real_escape_string($conexion, $_POST['area']);
$cargo = mysqli_real_escape_string($conexion, $_POST['cargo']);
$fEntrega = mysqli_real_escape_string($conexion, $_POST['fEntrega']);
$tpEntrega = mysqli_real_escape_string($conexion, $_POST['tpEntrega']);
$tpDevolutivo = mysqli_real_escape_string($conexion, $_POST['tpDevolutivo']);
$tpEstado = mysqli_real_escape_string($conexion, $_POST['tpEstado']);
$fechaActual = date('Y-m-d');

// Log para depuración
error_log("Datos procesados - Ident: $ident, Nombre: $nombre, Usuario: $userEntrega");
error_log("Es empleado nuevo: $es_empleado_nuevo, Empleado completo: $empleado_completo");
error_log("EPP items recibidos: " . print_r($_POST['epp_items'], true));

// ★★★ VERIFICAR ESTRUCTURA DE TABLAS ★★★
$tables_to_check = ['entregasst', 'dotxcc', 'empleado'];
foreach($tables_to_check as $table) {
    $check_table = "SHOW TABLES LIKE '$table'";
    $table_result = mysqli_query($conexion, $check_table);
    if(mysqli_num_rows($table_result) == 0) {
        error_log("ERROR: La tabla $table no existe");
        die("<script>alert('Error: La tabla $table no existe en la base de datos'); window.location.href='REG.PHP';</script>");
    }
}

// Iniciar transacción para asegurar integridad de datos
mysqli_begin_transaction($conexion);

try {
    // ★★★ MANEJAR TABLA EMPLEADO SEGÚN EL ESTADO ★★★
    if($empleado_completo == '1') {
        // ★★★ EMPLEADO YA REGISTRADO - SOLO ACTUALIZAR SI ES NECESARIO ★★★
        error_log("Empleado ya registrado completamente: $ident");
        
        // Verificar si necesita actualización (centro de costo o cargo diferentes)
        $check_empleado = "SELECT ccosto, cargo FROM empleado WHERE cedula = '$ident'";
        $result_empleado = mysqli_query($conexion, $check_empleado);
        
        if($result_empleado && mysqli_num_rows($result_empleado) > 0) {
            $empleado_actual = mysqli_fetch_assoc($result_empleado);
            
            // Solo actualizar si hay cambios en ccosto o cargo
            if($empleado_actual['ccosto'] != $ccosto || $empleado_actual['cargo'] != $cargo) {
                $update_empleado = "UPDATE empleado 
                                   SET ccosto = '$ccosto', cargo = '$cargo', fecha_actualizacion = '$fechaActual' 
                                   WHERE cedula = '$ident'";
                
                if(!mysqli_query($conexion, $update_empleado)) {
                    throw new Exception("Error al actualizar empleado: " . mysqli_error($conexion));
                }
                error_log("Empleado actualizado: $ident - Centro de costo y/o cargo modificados");
            } else {
                error_log("Empleado sin cambios: $ident - No requiere actualización");
            }
        }
        
    } else {
        // ★★★ EMPLEADO NUEVO O INCOMPLETO - INSERTAR O ACTUALIZAR ★★★
        $check_empleado = "SELECT * FROM empleado WHERE cedula = '$ident'";
        $result_empleado = mysqli_query($conexion, $check_empleado);
        
        if(!$result_empleado) {
            throw new Exception("Error al verificar empleado: " . mysqli_error($conexion));
        }
        
        if(mysqli_num_rows($result_empleado) == 0) {
            // El empleado no existe, insertarlo
            $insert_empleado = "INSERT INTO empleado (cedula, nombre, ccosto, area, cargo, fecha_registro) 
                               VALUES ('$ident', '$nombre', '$ccosto', '$area', '$cargo', '$fechaActual')";
            
            if(!mysqli_query($conexion, $insert_empleado)) {
                throw new Exception("Error al insertar empleado: " . mysqli_error($conexion));
            }
            error_log("Empleado insertado correctamente: $ident - $nombre");
        } else {
            // El empleado existe pero está incompleto, actualizarlo
            $update_empleado = "UPDATE empleado 
                               SET nombre = '$nombre', ccosto = '$ccosto', '$area', cargo = '$cargo', fecha_registro = '$fechaActual' 
                               WHERE cedula = '$ident'";
            
            if(!mysqli_query($conexion, $update_empleado)) {
                throw new Exception("Error al actualizar empleado: " . mysqli_error($conexion));
            }
            error_log("Empleado actualizado correctamente: $ident - $nombre");
        }
    }
    
    // ★★★ PROCESAR CADA EPP SELECCIONADO ★★★
$epp_procesados = 0;
foreach($_POST['epp_items'] as $index => $epp) {
    error_log("Procesando EPP $index: $epp");
    
    // Validar formato del item EPP
    $epp_parts = explode('|', $epp);
    if(count($epp_parts) !== 5) {
        throw new Exception("Formato incorrecto para EPP: $epp (se esperaban 5 partes, se recibieron " . count($epp_parts) . ")");
    }
    
    list($tipo, $id, $codigo, $descripcion, $cantidad) = $epp_parts;
    
    // Validar cantidad
    if(!is_numeric($cantidad) || $cantidad <= 0) {
        throw new Exception("Cantidad inválida para $codigo: $cantidad");
    }
    
    // Sanitizar datos específicos del EPP
    $codigo = mysqli_real_escape_string($conexion, $codigo);
    $descripcion = mysqli_real_escape_string($conexion, $descripcion);
    $cantidad = intval($cantidad);
    $id = intval($id);
    
    error_log("EPP procesado - Tipo: $tipo, ID: $id, Código: $codigo, Cantidad: $cantidad");
    
    // ★★★ VERIFICAR DISPONIBILIDAD EN INVENTARIO ★★★
    $table_inventario = ($tipo == 'nuevo') ? 'inventario' : 'inventariousado';
    $check_stock = "SELECT CANTIDAD FROM $table_inventario WHERE ID = $id";
    $stock_result = mysqli_query($conexion, $check_stock);
    
    if(!$stock_result) {
        throw new Exception("Error al verificar stock en $table_inventario: " . mysqli_error($conexion));
    }
    
    if(mysqli_num_rows($stock_result) == 0) {
        throw new Exception("El item con ID $id no existe en $table_inventario");
    }
    
    $stock_row = mysqli_fetch_assoc($stock_result);
    $stock_disponible = intval($stock_row['CANTIDAD']);
    
    if($stock_disponible < $cantidad) {
        throw new Exception("Stock insuficiente para $codigo. Disponible: $stock_disponible, Solicitado: $cantidad");
    }
    
    // ★★★ INSERTAR EN TABLA DE REGISTRO HISTÓRICO ★★★
    $table_registro = ($tipo == 'nuevo') ? 'regInventario' : 'regUsado';
    $query_registro = "INSERT INTO $table_registro 
                      (CODIGO, DESCRIPCION, CANTIDAD, MOVIMIENTO, userEntrega, fechaIngreso) 
                      VALUES 
                      ('$codigo', '$descripcion', $cantidad, 'Salida', '$userEntrega', NOW())";
    
    error_log("Query registro histórico ($table_registro): " . $query_registro);
    
    if(!mysqli_query($conexion, $query_registro)) {
        throw new Exception("Error al insertar en $table_registro: " . mysqli_error($conexion));
    }
        
        // ★★★ INSERTAR EN ENTREGASST ★★★
        // Verificar si la columna userEntrega existe
        $check_column = "SHOW COLUMNS FROM entregasst LIKE 'userEntrega'";
        $column_result = mysqli_query($conexion, $check_column);
        
        if(mysqli_num_rows($column_result) > 0) {
            // La columna existe, incluirla en la consulta
            $query_entregasst = "INSERT INTO entregasst 
                                (cedula, nombre, ccosto, area, cargo, fEntrega, tpEntrega, tpEstado, tpDevolutivo, codigo, epp, cantidad, userEntrega) 
                                VALUES 
                                ('$ident', '$nombre', '$ccosto', '$area', '$cargo', '$fEntrega', '$tpEntrega', '$tpEstado', '$tpDevolutivo', '$codigo', '$descripcion', '$cantidad', '$userEntrega')";
        } else {
            // La columna no existe, excluirla de la consulta
            $query_entregasst = "INSERT INTO entregasst 
                                (cedula, nombre, ccosto, area, cargo, fEntrega, tpEntrega, tpEstado, tpDevolutivo, codigo, epp, cantidad) 
                                VALUES 
                                ('$ident', '$nombre', '$ccosto', '$area', '$cargo', '$fEntrega', '$tpEntrega', '$tpEstado', '$tpDevolutivo', '$codigo', '$descripcion', '$cantidad')";
        }
        
        error_log("Query entregasst: " . $query_entregasst);
        
        if(!mysqli_query($conexion, $query_entregasst)) {
            throw new Exception("Error al insertar en entregasst: " . mysqli_error($conexion));
        }
        
        // ★★★ INSERTAR EN DOTXCC ★★★
        $query_dotxcc = "INSERT INTO dotxcc 
                        (CCOSTO, CEDULA, CARGO, ITEM, DESCRIPCION, CANTIDAD, FECHA, ESTADO) 
                        VALUES 
                        ('$ccosto', '$ident', '$cargo', '$codigo', '$descripcion', '$cantidad', '$fechaActual', '$tpEstado')";
        
        error_log("Query dotxcc: " . $query_dotxcc);
        
        if(!mysqli_query($conexion, $query_dotxcc)) {
            throw new Exception("Error al insertar en dotxcc: " . mysqli_error($conexion));
        }
		
        
        // ★★★ ACTUALIZAR INVENTARIO ★★★
        $update_query = "UPDATE $table_inventario SET CANTIDAD = CANTIDAD - $cantidad WHERE ID = $id";
        
        error_log("Query actualizar inventario: " . $update_query);
        
        if(!mysqli_query($conexion, $update_query)) {
            throw new Exception("Error al actualizar inventario $table_inventario: " . mysqli_error($conexion));
        }
        
        // Verificar que la actualización fue exitosa
        $verify_update = "SELECT CANTIDAD FROM $table_inventario WHERE ID = $id";
        $verify_result = mysqli_query($conexion, $verify_update);
        $new_stock = mysqli_fetch_assoc($verify_result)['CANTIDAD'];
        
        error_log("Stock actualizado para ID $id: $stock_disponible -> $new_stock");
        $epp_procesados++;
    }
    
    // ★★★ CONFIRMAR TRANSACCIÓN ★★★
    mysqli_commit($conexion);
    
    error_log("=== TRANSACCIÓN COMPLETADA EXITOSAMENTE ===");
    error_log("Empleado: $nombre ($ident)");
    error_log("Usuario: $userEntrega");
    error_log("EPP procesados: $epp_procesados");
    error_log("Estado empleado: " . ($empleado_completo == '1' ? 'Registrado previamente' : 'Nuevo/Actualizado'));
    
    // Mensaje de éxito personalizado según el tipo de empleado
    $mensaje_tipo = ($empleado_completo == '1') ? 'empleado registrado' : 'empleado nuevo/actualizado';
    
    // Redireccionar con éxito
    echo "<script>
        alert('Registro guardado correctamente.\\n\\nEmpleado: $nombre\\nCédula: $ident\\nTipo: $mensaje_tipo\\nUsuario: $userEntrega\\nElementos entregados: $epp_procesados');
        window.location.href='MENUP.PHP';
    </script>";
    exit();
    
} catch (Exception $e) {
    // Revertir transacción en caso de error
    mysqli_rollback($conexion);
    
    // Mostrar error detallado
    error_log("ERROR en insertar.php: " . $e->getMessage());
    error_log("=== TRANSACCIÓN REVERTIDA ===");
    
    echo "<script>
        alert('Error al guardar los datos:\\n\\n" . addslashes($e->getMessage()) . "\\n\\nPor favor, revise los datos e intente nuevamente.');
        window.location.href='REG.PHP';
    </script>";
    exit();
}
?>