Создание записи «Выполнение товара» на основе «Заказа на продажу» с использованием Netsuite PHP API и SuiteScript

#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, хотя я никогда этим не пользовался.