Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Netsuite SuiteTalk-通过PHP为客户请求发票列表_Php_Netsuite - Fatal编程技术网

Netsuite SuiteTalk-通过PHP为客户请求发票列表

Netsuite SuiteTalk-通过PHP为客户请求发票列表,php,netsuite,Php,Netsuite,我正在使用Netsuite PHP工具包尝试获取客户的发票列表。我可以毫无问题地打电话(使用TransactionSearch),但我很难理解如何获取发票的所有详细信息,即发票“标题”详细信息(例如总计、货币、主菜单行等)以及每行项目的详细信息(净值、应税值、项目等) 我尝试了几种方法: TransactionSearchAdvanced,指定了返回列,并将returnSearchColumns首选项设置为“false”。这将返回所有单独的行(woo!),但货币和术语之类的内容不会展开-您只需要

我正在使用Netsuite PHP工具包尝试获取客户的发票列表。我可以毫无问题地打电话(使用TransactionSearch),但我很难理解如何获取发票的所有详细信息,即发票“标题”详细信息(例如总计、货币、主菜单行等)以及每行项目的详细信息(净值、应税值、项目等)

我尝试了几种方法:

  • TransactionSearchAdvanced,指定了返回列,并将returnSearchColumns首选项设置为“false”。这将返回所有单独的行(woo!),但货币和术语之类的内容不会展开-您只需要指定internalId,而不是实际的文本(或符号)。另外,有了TSA,您真的必须指定所需的每一列吗?i、 默认值真的只是一组空字段吗?难道没有一种方式可以说“给我每张发票所有行的所有细节吗

  • TransactionSearch,returnSearchColumns首选项设置为“true”。这提供了一个单一发票类型记录的列表,正确填充了所有货币和术语,但令人沮丧的是,没有单个行项目。它更像是一个摘要

  • 因此,我有两个选择,这两个都不是很好的选择,即:

  • 同时调用所有发票并合并数据。这些搜索需要很长时间(性能对我来说是另一个问题,所以我真的不想这样做)
  • 找出请求条款、货币等数据的方法,以及获取发票行的方法
  • 我不知道你应该怎么做,在互联网上也找不到任何关于它的信息。这是我用过的最糟糕的界面之一(我用过一些非常糟糕的界面)


    任何帮助都将不胜感激。

    我在Netsuite中创建了一个保存的搜索,并使用restlet调用该搜索。有了它,它非常轻量级,您可以像在保存的搜索中一样调用数据


    性能方面的Restlet比webservices好得多。

    就像你一样,我开始尝试使用webservicesapi(又称SuiteTalk)做一些事情.大多数情况下,这是一次沮丧的练习,因为最终我发现我无法用它们做我想做的事。而且表现非常糟糕,即使它工作正常,也会毁掉我的项目

    和Faz一样,我发现结合使用RESTlet和保存的搜索比处理web服务框架更容易、更快

    基本上将您的问题分解为以下几部分:

    • 保存搜索,返回所需结果(跟踪稍后需要的内部ID)
    • RESTlet它只是一个Javascript文件,定义了用于返回搜索结果的函数
    • 调用RESTlet并获取结果的客户端代码
    第一部分: 所以保存的搜索非常简单。我假设你可以做到这一点,并且你可以在一个地方得到你想要的所有字段。在我的经验中,情况并非总是这样

    第二部分: RESTlet涉及更多的步骤,尽管它实际上是一件非常简单的事情。让它变得复杂的是将它上载并部署到您的NetSuite站点。如果您还没有安装NetSuite IDE,我强烈推荐它,如果只是为了使部署脚本变得更容易一些。自动完成和工具提示非常有用我也是

    例如,下面是我用来从我关心的搜索中获取结果的代码。这是根据某个灵魂在互联网上的某个地方发布的帖子改编的,但我忘了在哪里:

    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;
    
    }