Когда я отправляю вызов для отдыха в Netsuite и создаю новый заказ на продажу через RESTlet, я обнаружил, что мой код может работать отлично, если поле «item» заказа клиента содержит только инвентаризацию. Однако, когда в заказе клиента содержится элемент assemblyitem или kit/package, функция nlapiSubmitRecord() вернет значение null и заказ клиента не будет создан. (Ошибка не выбрасывается) Может ли кто-нибудь рассказать мне причину? Благодаря!Netsuite RESTlet - nlapiSubmitRecord() возвращает null при создании заказа клиента, содержащего элементы сборки
Моя Restlet функция для создания нового заказа клиента выглядит следующим образом:
function createSalesorder(datain) {
// init message and sales order obj
var message = new Object();
var record = nlapiCreateRecord('salesorder');
// check if the sales order already exists in Netsuite
if(!datain['otherrefnum']){
message.status = 'failed',
message.message = 'missing Customer P.O.';
return message;
} else {
var filters = new Array();
var columns = new Array();
filters.push(new nlobjSearchFilter('otherrefnum', null, 'equalto', datain['otherrefnum']));
filters.push(new nlobjSearchFilter('entity', null, 'is', datain['entity']));
// columns.push(new nlobjSearchColumn('otherrefnum', null, null));
var search = nlapiSearchRecord(datain.recordtype, null, filters, columns);
if(search && search.length>0){
message.status = 'duplicated',
message.id = search[0].id;
return message;
}
}
// check input data has required fields
if(!datain['item']){
message.status = 'failed';
message.message = 'missing item';
return message;
}
if(!datain['entity']){
message.status = 'failed';
message.message = 'missing customer id';
return message;
}
// init fields with default values
if(!datain['custbody_shipping_reason']){
record.setFieldValue('custbody_shipping_reason',1);
}
if(!datain['custbody_order_type']){
record.setFieldValue('custbody_order_type',1);
}
if(!datain['shipmethod']){
record.setFieldValue('shipmethod', 4304);
}
if(!datain['location']){
record.setFieldValue('location', 21);
}
if(!datain['istaxable']){
record.setFieldValue('taxitem', -8);
}
// load data input
for(var fieldname in datain){
switch(fieldname){
case 'recordtype':
case 'type':
case 'id':
break;
case 'istaxable':
record.setFieldValue(fieldname, datain[fieldname]);
if(datain[fieldname] == 'T') record.setFieldValue('taxitem', 2908);
else record.setFieldValue('taxitem', -8);
case 'item':
for(var i = 0; i < datain[fieldname].length; i++){
for(var itemfield in datain[fieldname][i]){
record.setLineItemValue('item', itemfield, i+1, datain[fieldname][i][itemfield]);
}
}
break;
default:
record.setFieldValue(fieldname, datain[fieldname]);
break;
}
}
// submit record
var recordID = nlapiSubmitRecord(record, true);
nlapiLogExecution('DEBUG', 'Create a new salesorder, id = '+recordID);
// return results
message.status = 'create';
message.id = recordID;
var order_entity = nlapiLoadRecord('salesorder', message.id);
message.refid = order_entity.getFieldValue('tranid');
return message;
}
Update 1: Я попытался запустить тот же код в NetSuite отладчик, оказывается, чтобы успешно написать заказ на продажу, кроме того, что есть пришел с предупреждением:
warning Items on this line have been drop shipped or special ordered. Are you sure you want to modify it?
Не уверен, если это проблема, которая мешает мне, чтобы сохранить заказ клиента должным образом в производственном режиме.
Вы пробовали имитировать свой код вручную, выполняя те же операции в графическом интерфейсе? Возможно, ваши элементы сборки имеют некоторые ограничения на них, например, на другой отдел или дочернее предприятие. Кроме того, вы пробовали отладку RESTlet с помощью отладчика? Вы также можете попробовать выполнить фрагменты кода из консоли в Chrome или firefox, как еще один метод для отладки. – TonyH
@TonyH Спасибо за ваше предложение. Я пробовал вручную создать заказ на поставку с элементом сборки, и мне кажется, что то же самое, что и я вручную создавал заказы на продажу с элементами инвентаря. Однако я понимаю, что для элемента сборки система автоматически создаст рабочий заказ, который будет построен, а для элемента инвентаря такая вещь не требуется. Мне было интересно, если это разница, но не так уверенно, как создать рабочий заказ через RESTlet. Я попробую отладить код с помощью отладчика Netsuite. Еще раз спасибо! – MsXN31