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®istros=" . $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();
}
}
?>