Netsuite SuiteTalk - запрос списка счетов-фактур для клиента через PHP


Я использую инструментарий PHP Netsuite, чтобы попытаться получить список счетов-фактур для клиента. Я могу позвонить (используя поиск транзакций) без проблем, но я изо всех сил пытаюсь понять, как я должен получить все Сведения о счете-фактуре - т. Е. Сведения о "заголовке" счета (например, общая сумма, валюта, строка главного меню и т. Д.), А также Сведения о каждой позиции (чистая стоимость, налогооблагаемая стоимость, товар и т. Д.).

Я пробовал несколько подходы:

  1. TransactionSearch расширен, с указанными столбцами возврата и предпочтением returnsearchcolumns, установленным в "false". Это возвращает все отдельные строки (ого!), Но такие вещи, как валюта и термин, не раскрываются - вы просто указываете внутренний идентификатор, а не фактический текст (или символ). Кроме того, в TSA вам действительно нужно указывать каждый столбец, который вы хотите? т. Е. Действительно ли по умолчанию просто пустой набор полей? Разве нет способа просто говоря: "дайте мне все подробности по всем строкам каждого счета-фактуры?

  2. TransactionSearch, с предпочтением returnSearchColumns, установленным в "true". Это дает список записей одного типа счета-фактуры со всеми правильно заполненными данными о валюте и сроках, но, к сожалению, ни одной из отдельных позиций. Это скорее краткое изложение.

Так что у меня остается пара вариантов, ни один из которых не очень приятен, а именно:

  1. Выполняйте оба вызова для всех выставляйте счета и объединяйте данные. Эти поиски занимают много времени (производительность - еще одна проблема для меня, поэтому я действительно не хочу этого делать.

Или

  1. Определите способ запроса данных об условиях, валюте и т.д., а также способ получения строк счета-фактуры.

Я понятия не имею, как вы должны это делать, и ничего не могу найти об этом в Интернете. Это один из худших интерфейсов, которые я использовал (и я использовал некоторые довольно плохие интерфейсы).

Любой помощь была бы очень признательна.

Author: El Presidente, 2014-11-12

4 answers

Так же, как и вы, я начал пытаться что-то делать с API веб-сервисов (он же SuiteTalk). В основном это было упражнение в разочаровании, потому что в конце концов я обнаружил, что просто не могу делать с ними то, что хочу. Это и производительность были довольно плохими, что убило бы мой проект, даже если бы он работал должным образом.

Как и Faz, я обнаружил, что гораздо проще и быстрее использовать комбинацию рестлетов и сохраненных поисковых запросов, чем иметь дело с веб-сервисами рамки.

В основном разбейте вашу проблему на следующие части:

  • Сохраненный поиск, который возвращает нужные вам результаты (следите за внутренним идентификатором, который вам понадобится позже)
  • Restlet это просто файл Javascript, который определяет функцию, которую вы будете использовать для возврата результатов поиска
  • Клиентский код для вызова RESTlet и получения результатов.

Часть I: Таким образом, сохраненный поиск довольно прост. Я собираюсь предположить, что вы можете сделать это случается, а также то, что вы действительно можете получить все нужные поля в одном месте. По моему опыту, так было не всегда.

Часть II: Рестлет включает в себя гораздо больше шагов, хотя на самом деле это очень простая вещь. Что усложняет его, так это загрузка и развертывание на вашем сайте NetSuite. Если у вас еще не установлена среда IDE NetSuite, я настоятельно рекомендую ее, хотя бы для того, чтобы немного упростить развертывание сценариев. Автозаполнение и всплывающие подсказки к тому же чрезвычайно полезный.

Например, вот код, который я использую для получения результатов поиска, о котором я заботился. Это было адаптировано из публикации какой-то доброй души где-то в Интернете, но я забыл, где:

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

Здесь вы получаете все необходимое, передавая сохраненный внутренний идентификатор поиска:

var search = nlapiLoadSearch(null, SEARCH_ID);
var resultSet = search.runSearch();

Затем код повторно вызывает GetResults(), чтобы получить фрагменты из 1000 результатов, это ограничение NetSuite. Как только вы это напишете, вам нужно будет загрузить скрипт в NetSuite а также настроить и развернуть его. Самая важная часть - это указать, какую функцию следует назначить каждому глаголу. В этом случае я назначил GET для выполнения getSearchResults. Здесь предстоит проделать большую работу, и я не собираюсь печатать все это, потому что вам стоит потратить время на изучение этой части. По крайней мере, достаточно, чтобы IDE сделала это за вас =D. Вы можете прочитать все об этом в руководстве "Введение в рестлеты".

Часть III. Клиентский код может быть любым, каким вы хотите, чтобы он оставался таким, как вы хотелось бы. Лично мне нравится 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, [email protected], nlauth_signature=somepassword, nlauth_role=3'}
resp = requests.get(url, headers=headers)
data = resp.json()

URL-адрес будет отображаться вам как часть развертывания RESTlet. Тогда вам решать, что вы хотите делать с возвращаемыми данными.

Итак, я бы посоветовал вам провести время с такими вещами, как

  • Настройка IDE NetSuite
  • Получение и чтение ссылки разработчика SuiteScript документы
  • Нахождение хорошего способа создания клиентского кода REST на выбранном вами языке.

Я надеюсь, что это поможет.

 2
Author: torpy, 2016-06-28 06:18:29

Я создал сохраненный поиск в Netsuite и вызываю этот поиск с помощью restlet. При этом он довольно легкий, и вы можете вызывать данные так, как они есть в сохраненном поиске.

Рестлет с точки зрения производительности намного лучше, чем веб-сервисы.

 1
Author: Faz, 2014-11-12 16:38:50

Создайте новый сценарий набора костюмов и разверните

Ниже скрипт предоставит вам список счетов-фактур по внутреннему идентификатору клиента

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;

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

}

 0
Author: Vishnu Bhatvadekar, 2016-12-20 11:40:09

Вот что у меня есть для получения счетов-фактур клиентов:

    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;

}
 0
Author: zeros-and-ones, 2017-02-28 20:41:57