File "guardar.php"

Full Path: C:/wamp64/www/loteo1/guardar.php
File size: 4.6 KB
MIME-type: text/x-php
Charset: utf-8

<?php
require_once 'connection.php';

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

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

// Validar que haya al menos un ítem
if (empty($_POST['items']) || empty($_POST['cantidades'])) {
    header("Location: registrar.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: registrar.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();
    
    $proceso = $_POST['proceso'];
    $item_names = $_POST['items'];
    $cantidades = $_POST['cantidades'];
    
    // Validar que tengamos la misma cantidad de items y 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 proceso
    $tabla_items = ($proceso === 'Pollo') ? 'items' : 'items_Pavos';
    
    // Preparar la consulta de verificación de items en la tabla correspondiente
    $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 la consulta de inserción
    $sql = "INSERT INTO entregas (fecha, 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 = 'Entrega';
    $registros_insertados = 0;
    
    // Procesar cada ítem
    foreach ($item_names as $index => $item_name) {
        $cantidad = isset($cantidades[$index]) ? intval($cantidades[$index]) : 0;
        
        if ($cantidad <= 0) {
            continue; // Saltar items sin cantidad válida
        }
        
        // Verificar que el item existe en la tabla correcta
        $stmt_check->bind_param("s", $item_name);
        $stmt_check->execute();
        $result = $stmt_check->get_result();
        
        if ($item_data = $result->fetch_assoc()) {
            // Insertar registro individual
            $stmt_insert->bind_param("ssssssssss", 
                $_POST['fecha'],
                $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 la tabla $tabla_items: " . $item_name);
        }
    }
    
    if ($registros_insertados === 0) {
        throw new Exception("No se insertó ningún registro válido");
    }
    
    // Confirmar transacción
    $conn->commit();
    
    // Redirigir con mensaje de éxito, incluyendo la cantidad de registros
    header("Location: registrar.php?success=1&registros=" . $registros_insertados);
    exit;
    
} catch (Exception $e) {
    // Revertir transacción
    if (isset($conn)) {
        $conn->rollback();
    }
    
    error_log("Error en guardar.php: " . $e->getMessage());
    header("Location: registrar.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();
    }
}
?>