File "insertar.php"
Full Path: C:/wamp64/www/APPSST/dotacion/insertar.php
File size: 14.52 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, 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();
}
?>