Netsuite SuiteTalk - 通过PHP请求客户发票清单

时间:2014-11-12 11:34:18

标签: php netsuite

我使用Netsuite PHP Toolkit尝试获取客户的发票清单。我可以毫无问题地拨打电话(使用TransactionSearch),但我很难理解我应该如何获得发票的所有详细信息 - 即发票&# 34;头"详细信息(例如总计,货币,主菜单行等)以及每个行项目的详细信息(净值,应税值,项目等)。

我尝试了几种方法:

  1. TransactionSearchAdvanced,指定了返回列,并将returnSearchColumns首选项设置为" false"。这会返回所有单独的行(喔!),但是货币和术语之类的东西都没有扩展出来 - 你只需要指定internalId而不是实际的文本(或符号)。此外,使用TSA,您真的必须指定您想要的每一列吗?即默认真的只是一组空字段?难道没有办法说出"给我每张发票所有行的所有细节?

  2. TransactionSearch,其中returnSearchColumns首选项设置为" true"。这给出了单个发票类型记录的列表,其中正确填充了所有货币和期限内容,但令人沮丧的是,没有单个行项目。它更像是一个总结。

  3. 所以我留下了几个选项,两者都不是很可口,即:

    1. 同时调用所有发票并合并数据。这些搜索需要很长时间(性能是我的另一个问题,所以我真的不想这样做。
      1. 找出一种请求条款,货币等数据的方法,以及获取发票行的方法。
      2. 我不知道你应该如何做到这一点,并且无法在互联网上找到任何关于它的内容。这是我使用过的最糟糕的界面之一(而且我已经使用了一些非常糟糕的界面)。

        非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

就像你一样,我开始尝试使用Web Services API(也称为SuiteTalk)。大多数情况下,这是一种令人沮丧的运动,因为我最终发现的是我平常无法做到我想要的东西。那和性能非常糟糕,即使它已经正常工作也会导致我的项目失败。

与Faz一样,我发现使用RESTlet和Saved Searches的组合要比处理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。这里有很多工作要做,我不打算把它全部输出,因为值得花时间学习这一部分。至少足以让IDE为你做这个= D。您可以在“RESTlets简介”指南中阅读所有相关内容。

第III部分。 客户端代码可以是您想要的任何方式,以您喜欢的方式执行REST。我个人喜欢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()

作为RESTlet部署的一部分,URL将显示给您。然后由您自己决定使用返回的数据。

所以我建议你花时间的事情是

  • 设置NetSuite IDE
  • 获取和阅读SuiteScript开发人员参考文档
  • 找到一种以您选择的语言创建REST客户端代码的好方法。

我希望有所帮助。

答案 1 :(得分:1)

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

性能明智的Restlet比webservices好得多。

答案 2 :(得分:0)

创建新的suitelet脚本并部署

下面的脚本将按客户内部ID

为您提供发票清单



function customSearch(request, response) {
	var rows = [];	
	var result;
	var filters = [];
	//9989 is customer internal id you can add more
	// by pushing additional ids to array
    filters.push(new nlobjSearchFilter('entity', null, 'anyOf', [9989] ));
	var invoiceList = nlapiSearchRecord('invoice', null, filters, []);
	// by default record limit is 1000 
	// taking 100 records 
  for (var i = 0; i < Math.min(100, invoiceList.length); i++)
    {
        if (parseInt(invoiceList[i].getId()) > 0) {
            recordid = invoiceList[i].getId();
            try {
               result=  nlapiLoadRecord(invoiceList[i].getRecordType(), recordid);   
			   // pushing in to result
			   rows.push(result);			
            } catch (e) {
                if (e instanceof nlobjError) {
                    nlapiLogExecution('DEBUG', 'system error', e.getCode() + '\n' + e.getDetails());
                } else {
                    nlapiLogExecution('DEBUG', 'unexpected error', e.toString());
                }
            }
        } 
    }
	response.setContentType('JSON');
	response.write(JSON.stringify({'records' : rows}));
	return;

}
&#13;
&#13;
&#13;

    } 
}
response.setContentType('JSON');
response.write(JSON.stringify({'records' : rows}));
return;

}

答案 3 :(得分:0)

以下是我获取客户发票的原因:

    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;

}