Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
File Manager
/
APPSST
/
dotacion
:
insertar.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?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, AREA, userEntrega, fechaIngreso) VALUES ('$codigo', '$descripcion', $cantidad, 'Salida', '$area', '$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(); } ?>