#php #netsuite #suitescript
#php #netsuite #suitescript
Вопрос:
У меня возникли проблемы с созданием записи «Выполнение товара» на основе «Заказа на продажу» с использованием следующего кода.
$objx = array();
$objx = new InitializeRecord();
$objx->type = "itemFulfillment";
$objx->reference->type = "salesOrder";
$objx->reference->internalId = 7793877; // ID of sales order
$request = new InitializeListRequest();
$request->initializeRecord = $objx;
$response = $service->initializeList($request);
Однако выдается следующее сообщение об ошибке :
[code] => VALID_LINE_ITEM_REQD
[message] => You must have at least one valid line item for this transaction.
[type] => ERROR
Я использовал другие примеры в Интернете и, похоже, всегда получал одно и то же сообщение об ошибке. В Netsuite включено расширенное управление запасами.
Обновление 16/04/2019 :
Впервые заглянул в suitescript, и ему удалось собрать некоторый код в качестве теста для преобразования заказа на продажу в выполнение товара с помощью nlapiTransformRecord. Однако при этом также появляется то же сообщение об ошибке.
var soId = nlapiGetRecordId();
var ifRec = nlapiTransformRecord('salesorder', soId, 'itemfulfillment');
var lcounttwo = ifRec.getLineItemCount('item');
for (var i = 1; i <= lcounttwo; i ){
ifRec.selectLineItem('item', i);
}
nlapiSubmitRecord(ifRec);
Комментарии:
1. Я думаю, у вас проблема с настройкой
$service
переменной. ПРОСМОТРИТЕ эту документацию один раз и проверьте ссылку2. К сожалению, я думаю, что все в порядке, потому что у меня не было никаких проблем с переменной $ service в отношении создания заказа на продажу или даже создания продаж наличными на основе заказа на продажу.
3. Есть ли в целевом заказе на продажу какие-либо выполнимые строки?
4. В заказе на продажу есть позиция с выполненным 0 и количеством 1.
5. Fufillable Может также включать наличие или фиксацию запасов и утверждение заказа на продажу. Простая проверка: можете ли вы выполнить заказ из пользовательского интерфейса?
Ответ №1:
Не слишком уверен в этом аспекте PHP, но в Java это будет сделано следующим образом. Обратите внимание, что первым шагом является использование initialize
вызова для получения записи выполнения товара, а затем вы сохраняете ее в обычном режиме. Шаг пометки каждой строки как выполнимой ( itemReceive
) является общим для SuiteTalk и Suitescript.
ReadResponse initFF = nsClient.getPort().initialize(new InitializeRecord(InitializeType.itemFulfillment, new InitializeRef(null, InitializeRefType.salesOrder, soId, null), null));
ItemFulfillment ff = (ItemFulfillment)initFF.getRecord();
ItemFulfillment ff = (ItemFulfillment)initFF.getRecord();
for(ItemFulfillmentItem ffItem : ff.getItemList().getItem()){
ffItem.setItemReceive(Boolean.TRUE);
}
ff.setShipStatus(ItemFulfillmentShipStatus._shipped);
System.err.println("adding fulfillment");
WriteResponse ffResp = nsClient.getPort().add(ff);
if(!ffResp.getStatus().isIsSuccess()){
System.err.println(nsClient.getStatusDetails(ffResp.getStatus()));
fail("Unable to add item fulfillment");
}
Таким образом, вызов, который вы делаете, кажется неправильным. Если бы вы использовали PHPtoolkit, поставляемый NS, вы бы делали:
$service->initialize($objx);
Соответствующий Suitescript потребует, чтобы вы прошли по строкам товара и установили значение столбца itemreceive равным true. итак, в вашем цикле ifRec.setCurrentLineItemValue('item', 'itemreceive', 'T');
Некоторые гораздо более старые .php, которые я написал, выглядят следующим образом и, похоже, работали без части itemReceive. Хотя он по-прежнему извлекает запись выполнения из вызова initialize перед попыткой отправки выполнения:
$initRefFields = array('internalId' => $soId, 'type' => 'salesOrder');
$initRef = new nsComplexObject('InitializeRef');
$initRef -> setFields($initRefFields);
$initRecFields = array('reference' => $initRef, 'type' => 'itemFulfillment');
$initRec = new nsComplexObject('InitializeRecord');
$initRec -> setFields($initRecFields);
$readReponse = $nsClient -> initialize($initRec);
if($readReponse -> isSuccess) {
$itemFulfillment = $readReponse -> record;
... manipulate lines
$addResponse = $nsClient -> add($itemFulfillment);
}
Комментарии:
1. Использование Initialize, а не InitializeList с передачей переменной $request выдает точно такое же сообщение. Если я изменяю $request на $objx, я получаю сообщение об ошибке, в котором указано, что $objx должен иметь тип InitializeRequest . Я заметил других с такой же проблемой, также с расширенным управлением запасами и инструментарием PHP, может быть, это просто невозможно? Интересно, можно ли достичь того же с помощью suitescript, хотя я никогда этим не пользовался.