File "guardarDevolucion.php"

Full Path: C:/wamp64/www/loteo/guardarDevolucion.php
File size: 4.41 KB
MIME-type: text/x-php
Charset: utf-8

<?php
require_once 'connection.php';

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header("Location: devolucion.php?error=metodo_no_valido");
    exit;
}

// Validar campos requeridos
$required = ['fecha', 'beneficio', 'area', 'observacion', 'firma_entrega', 'firma_recibe'];
foreach ($required as $field) {
    if (empty($_POST[$field])) {
        header("Location: devolucion.php?error=campo_requerido&campo=".$field);
        exit;
    }
}

// Validar que haya al menos un ítem
if (empty($_POST['items']) || empty($_POST['cantidades'])) {
    header("Location: devolucion.php?error=items_requeridos");
    exit;
}

// Validar firmas
if (!preg_match('/^data:image\/(png|jpeg);base64,/', $_POST['firma_entrega']) || 
    !preg_match('/^data:image\/(png|jpeg);base64,/', $_POST['firma_recibe'])) {
    header("Location: devolucion.php?error=formato_firma_invalido");
    exit;
}

try {
    $conn = connection();
    
    if ($conn->connect_error) {
        throw new Exception("Error de conexión a la base de datos: " . $conn->connect_error);
    }
    
    // Iniciar transacción
    $conn->begin_transaction();
    
    $beneficio = $_POST['beneficio'];
    $proceso   = $_POST['proceso'] ?? '';
    $item_names = $_POST['items'];
    $cantidades = $_POST['cantidades'];
    
    if (count($item_names) !== count($cantidades)) {
        throw new Exception("No coincide el número de items con las cantidades");
    }
    
    // Determinar la tabla de items según el beneficio
    $tabla_items = ($beneficio === 'Beneficio Pollo') ? 'items' : 'items_Pavos';
    
    // Preparar consulta de verificación en la tabla correcta
    $stmt_check = $conn->prepare("SELECT item, descripcion FROM $tabla_items WHERE item = ?");
    if (!$stmt_check) {
        throw new Exception("Error al preparar consulta de verificación: " . $conn->error);
    }
    
    // Preparar consulta de inserción
    $sql = "INSERT INTO entregas (fecha, beneficio, proceso, item, descripcion, cantidad, area, observacion, firma_entrega, firma_recibe, tipoMV) 
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
    
    $stmt_insert = $conn->prepare($sql);
    if (!$stmt_insert) {
        throw new Exception("Error al preparar la consulta de inserción: " . $conn->error);
    }
    
    $tipoMV = 'Devolucion';
    $registros_insertados = 0;
    
    foreach ($item_names as $index => $item_name) {
        $cantidad = isset($cantidades[$index]) ? intval($cantidades[$index]) : 0;
        if ($cantidad <= 0) {
            continue;
        }
        
        // Verificar existencia en la tabla correspondiente
        $stmt_check->bind_param("s", $item_name);
        $stmt_check->execute();
        $result = $stmt_check->get_result();
        
        if ($item_data = $result->fetch_assoc()) {
            $stmt_insert->bind_param("sssssssssss", 
                $_POST['fecha'],
                $beneficio,
                $proceso,
                $item_data['item'],
                $item_data['descripcion'],
                $cantidad,
                $_POST['area'],
                $_POST['observacion'],
                $_POST['firma_entrega'],
                $_POST['firma_recibe'],
                $tipoMV
            );
            
            if (!$stmt_insert->execute()) {
                throw new Exception("Error al insertar item " . $item_name . ": " . $stmt_insert->error);
            }
            $registros_insertados++;
        } else {
            throw new Exception("Item no encontrado en tabla $tabla_items: " . $item_name);
        }
    }
    
    if ($registros_insertados === 0) {
        throw new Exception("No se insertó ningún registro válido");
    }
    
    $conn->commit();
    
    // Redirigir a devolucion.php con mensaje de éxito
    header("Location: devolucion.php?success=1&registros=" . $registros_insertados);
    exit;
    
} catch (Exception $e) {
    if (isset($conn)) {
        $conn->rollback();
    }
    error_log("Error en guardarDevolucion.php: " . $e->getMessage());
    header("Location: devolucion.php?error=error_bd&message=".urlencode($e->getMessage()));
    exit;
} finally {
    if (isset($stmt_check) && $stmt_check !== false) {
        $stmt_check->close();
    }
    if (isset($stmt_insert) && $stmt_insert !== false) {
        $stmt_insert->close();
    }
    if (isset($conn)) {
        $conn->close();
    }
}
?>