Netsuite SuiteTalk-通过PHP为客户请求发票列表
我正在使用Netsuite PHP工具包尝试获取客户的发票列表。我可以毫无问题地打电话(使用TransactionSearch),但我很难理解如何获取发票的所有详细信息,即发票“标题”详细信息(例如总计、货币、主菜单行等)以及每行项目的详细信息(净值、应税值、项目等) 我尝试了几种方法:Netsuite SuiteTalk-通过PHP为客户请求发票列表,php,netsuite,Php,Netsuite,我正在使用Netsuite PHP工具包尝试获取客户的发票列表。我可以毫无问题地打电话(使用TransactionSearch),但我很难理解如何获取发票的所有详细信息,即发票“标题”详细信息(例如总计、货币、主菜单行等)以及每行项目的详细信息(净值、应税值、项目等) 我尝试了几种方法: TransactionSearchAdvanced,指定了返回列,并将returnSearchColumns首选项设置为“false”。这将返回所有单独的行(woo!),但货币和术语之类的内容不会展开-您只需要
任何帮助都将不胜感激。我在Netsuite中创建了一个保存的搜索,并使用restlet调用该搜索。有了它,它非常轻量级,您可以像在保存的搜索中一样调用数据
性能方面的Restlet比webservices好得多。就像你一样,我开始尝试使用webservicesapi(又称SuiteTalk)做一些事情.大多数情况下,这是一次沮丧的练习,因为最终我发现我无法用它们做我想做的事。而且表现非常糟糕,即使它工作正常,也会毁掉我的项目 和Faz一样,我发现结合使用RESTlet和保存的搜索比处理web服务框架更容易、更快 基本上将您的问题分解为以下几部分:
- 保存搜索,返回所需结果(跟踪稍后需要的内部ID)
- RESTlet它只是一个Javascript文件,定义了用于返回搜索结果的函数
- 调用RESTlet并获取结果的客户端代码
function getSearchResults(){
var max_rows = 1000;
var search_id = 1211;
var search = nlapiLoadSearch(null, search_id);
var results = search.runSearch();
var rows = [];
// add starting point for usage
var context = nlapiGetContext();
startingUsage = context.getRemainingUsage();
rows.push(["beginning usage", startingUsage]);
// now create the collection of result rows in 1000 row chunks
var index = 0;
do{
var chunk = results.getResults(index, index+1000);
if( ! chunk ) break;
chunk.forEach( function(row){
rows.push(row);
index++;
});
}while( chunk.length === max_rows);
// add a line that returns the remaining usage for this RESTlet
context = nlapiGetContext();
var remainingUsage = context.getRemainingUsage();
rows.push(["remaining usage",remainingUsage]);
// send back the rows
return rows;
}
在这里,您可以通过传递保存的搜索内部ID来启动程序:
var search = nlapiLoadSearch(null, SEARCH_ID);
var resultSet = search.runSearch();
然后代码重复调用getResults()要获得1000个结果块,这是NetSuite的一个限制。一旦你写了这篇文章,你就必须将脚本上传到NetSuite,并对其进行配置和部署。最重要的是告诉它要为每个动词分配什么函数。在这种情况下,我指定了get来执行getSearchResults。这里有很多工作要做,我不打算去做g输入所有内容,因为学习这一部分是值得的。至少足够让IDE为您完成它=D。您可以在“RESTlets简介”指南中阅读所有内容
第三部分。
客户机代码可以是您想要的任何形式,并以您喜欢的方式进行休息。我个人喜欢Python,因为请求库非常棒。
下面是一些Python代码示例:
import requests
import json
url = 'https://rest.sandbox.netsuite.com/app/site/hosting/restlet.nl?script=123&deploy=1'
headers = {'Content-Type': 'application/json', 'Authorization':'NLAuth nlauth_account=1234567, nlauth_email=someone@somewhere.com, nlauth_signature=somepassword, nlauth_role=3'}
resp = requests.get(url, headers=headers)
data = resp.json()
URL将作为RESTlet部署的一部分显示给您,然后由您来处理返回的数据
所以我建议你花点时间在
- 设置NetSuite IDE
- 获取和阅读SuiteScript开发人员参考文档
- 找到一种用您选择的语言创建REST客户机代码的好方法
我希望这会有所帮助。创建一个新的suitelet脚本并部署它 下面的脚本将按客户内部id为您提供发票列表
功能自定义搜索(请求、响应){
var行=[];
var结果;
var过滤器=[];
//9989是客户内部id,您可以添加更多
//通过将附加ID推送到阵列
push(新的nlobjSearchFilter('entity',null,'anyOf',[9989]);
var invoiceList=nlapiSearchRecord('invoice',null,filters,[]);
//默认记录限制为1000
//拿了100张唱片
对于(变量i=0;i0){
recordid=invoiceList[i].getId();
试一试{
结果=nlapiLoadRecord(invoiceList[i].getRecordType(),recordid);
//争取结果
行。推送(恢复)
public function getCustomerInvoices($customer_id)
{
$service = new NetSuiteService($this->config);
$customerSearchBasic = new CustomerSearchBasic();
$searchValue = new RecordRef();
$searchValue->type = 'customer';
$searchValue->internalId = $customer_id;
$searchMultiSelectField = new SearchMultiSelectField();
setFields($searchMultiSelectField, array('operator' => 'anyOf', 'searchValue' => $searchValue));
$customerSearchBasic->internalId = $searchMultiSelectField;
$transactionSearchBasic = new TransactionSearchBasic();
$searchMultiSelectEnumField = new SearchEnumMultiSelectField();
setFields($searchMultiSelectEnumField, array('operator' => 'anyOf', 'searchValue' => "_invoice"));
$transactionSearchBasic->type = $searchMultiSelectEnumField;
$transactionSearch = new TransactionSearch();
$transactionSearch->basic = $transactionSearchBasic;
$transactionSearch->customerJoin = $customerSearchBasic;
$request = new SearchRequest();
$request->searchRecord = $transactionSearch;
$searchResponse = $service->search($request);
return $searchResponse->searchResult->recordList;
}