【问题标题】:Creating 'Item Fulfilment' record based on 'Sales Order' using Netsuite PHP API and SuiteScript使用 Netsuite PHP API 和 SuiteScript 基于“销售订单”创建“项目履行”记录
【发布时间】:2019-04-15 12:41:30
【问题描述】:

我在使用以下代码根据“销售订单”创建“项目履行”记录时遇到问题。

$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 中启用了高级库存管理。

2019 年 4 月 16 日更新:

第一次查看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);

【问题讨论】:

  • 我认为您在设置 $service 变量时遇到问题。浏览此文档一次并检查link
  • 遗憾的是,我认为这一切都很好,因为在创建销售订单甚至基于销售订单创建现金销售方面,我对 $service 变量没有任何问题。
  • 目标销售订单是否有可履行行?
  • 销售订单有一个 FulFilled 0 和 Quantity 1 的行项目。
  • Fufillable 可能还包括可用或已承诺的库存以及已批准的销售订单。一个简单的检查是你能从 UI 中完成订单吗?

标签: php netsuite suitescript


【解决方案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");
}

所以你打的电话似乎是错误的。如果你使用的是 NS 提供的 PHPtoolkit,你会这样做:

$service->initialize($objx);

相应的 Suitescript 将要求您遍历项目行并将列值 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);
    }

【讨论】:

  • 使用 Initialize 而不是 InitializeList 并传递 $request 变量会产生完全相同的消息。如果我将 $request 更改为 $objx,我会收到错误消息,指出 $objx 必须是 InitializeRequest 类型。我注意到其他人也有同样的问题,还有高级库存管理和 PHP 工具包,也许这不可能?我想知道套件脚本是否可以实现相同的效果,尽管我从未使用过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多