beginTransaction(); $stmt = $pdo->prepare("SELECT * FROM stock_sedes WHERE product_id = :product_id AND sede_id = :sede_id FOR UPDATE"); $stmt->execute(['product_id' => $product_id, 'sede_id' => $sede_id]); $existing_stock = $stmt->fetch(); if ($existing_stock) { $new_quantity = $existing_stock['quantity'] - $quantity; if ($new_quantity < 0) { $error = "No hay stock para registrar la salida. Stock actual: " . $existing_stock['quantity']; $pdo->rollBack(); } else { $update_stmt = $pdo->prepare("UPDATE stock_sedes SET quantity = :quantity WHERE id = :id"); $update_stmt->execute(['quantity' => $new_quantity, 'id' => $existing_stock['id']]); $history_stmt = $pdo->prepare( "INSERT INTO stock_movements (product_id, sede_id, quantity, type, movement_date) VALUES (:product_id, :sede_id, :quantity, 'salida', :movement_date)" ); $history_stmt->execute([ 'product_id' => $product_id, 'sede_id' => $sede_id, 'quantity' => $quantity, 'movement_date' => $movement_date ]); $pdo->commit(); $stmt_prod_name = $pdo->prepare("SELECT nombre FROM products WHERE id = :id"); $stmt_prod_name->execute(['id' => $product_id]); $product_name = $stmt_prod_name->fetchColumn(); $message = "Salida de 1 unidad de '{$product_name}' registrada. Stock restante: {$new_quantity}."; } } else { $error = "No hay stock registrado para este producto en la sede seleccionada."; $pdo->rollBack(); } } catch (PDOException $e) { if ($pdo && $pdo->inTransaction()) { $pdo->rollBack(); } $error = "Error al actualizar el inventario: " . $e->getMessage(); } } else { $error = "Faltan datos para registrar la salida (producto, sede o fecha)."; } // Devolvemos JSON y terminamos la ejecución header('Content-Type: application/json'); if ($error) { echo json_encode(['success' => false, 'message' => $error]); } else { echo json_encode(['success' => true, 'message' => $message]); } exit; } // Obtener sedes para el dropdown $sedes = []; try { $pdo = db(); $sedes_stmt = $pdo->query("SELECT id, nombre FROM sedes ORDER BY nombre ASC"); $sedes = $sedes_stmt->fetchAll(PDO::FETCH_ASSOC); } catch (PDOException $e) { $error_page_load = "Error al cargar datos: " . $e->getMessage(); } ?>
Escanear Código de Barras

Productos Registrados
Producto SKU Estado