beginTransaction(); // 1. Verificar stock actual $stmt = $pdo->prepare("SELECT stock_actual FROM stock_por_ciudad WHERE producto_id = :producto_id AND ciudad_id = :ciudad_id FOR UPDATE"); $stmt->execute(['producto_id' => $producto_id, 'ciudad_id' => $ciudad_id]); $stock_disponible = $stmt->fetchColumn(); if ($stock_disponible === false || $stock_disponible < $cantidad) { $_SESSION['error'] = "No hay stock suficiente para realizar esta operación. Stock actual: " . ($stock_disponible ?: 0); header("Location: registrar_salida.php"); $pdo->rollBack(); exit(); } // 2. Actualizar el stock en la ciudad $stmt = $pdo->prepare("UPDATE stock_por_ciudad SET stock_actual = stock_actual - :cantidad WHERE producto_id = :producto_id AND ciudad_id = :ciudad_id"); $stmt->execute([ 'cantidad' => $cantidad, 'producto_id' => $producto_id, 'ciudad_id' => $ciudad_id ]); // 3. Registrar el movimiento de salida $stmt = $pdo->prepare( "INSERT INTO movimientos (tipo, producto_id, ciudad_origen_id, cantidad, usuario_id, observacion, fecha, fecha_registro) VALUES ('Salida', :producto_id, :ciudad_origen_id, :cantidad, :usuario_id, :observacion, :fecha, NOW())" ); $stmt->execute([ 'producto_id' => $producto_id, 'ciudad_origen_id' => $ciudad_id, 'cantidad' => $cantidad, 'usuario_id' => $usuario_id, 'observacion' => $observacion, 'fecha' => $fecha ]); $pdo->commit(); $_SESSION['success'] = "Salida de producto registrada correctamente."; header("Location: productos.php"); exit(); } catch (Exception $e) { $pdo->rollBack(); $_SESSION['error'] = "Error al registrar la salida: " . $e->getMessage(); header("Location: registrar_salida.php"); exit(); } } else { header("Location: registrar_salida.php"); exit(); } ?>