Создание записи «Выполнение товара» на основе «Заказа на продажу» с использованием Netsuite PHP API и SuiteScript - PullRequest
0 голосов
/ 15 апреля 2019

У меня проблемы с созданием записи «Выполнение изделия» на основе «Заказа клиента» с использованием следующего кода.

$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 Ответ

0 голосов
/ 15 апреля 2019

Не слишком уверен насчет 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);

Соответствующий пакет сценариев потребовал бы, чтобы вы прошли через строки элементов и установили значение столбца itemreceive в true.так что в вашем цикле ifRec.setCurrentLineItemValue('item', 'itemreceive', 'T');

Некоторые гораздо более старые .php, которые я написал, выглядят следующим образом и, похоже, работали без элемента itemReceive.Хотя он по-прежнему извлекает запись выполнения из вызова инициализации перед попыткой передать выполнение:

    $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);
    }
...