首页 > 解决方案 > Suitescript 仅针对销售订单上已履行的项目开具发票

问题描述

我对suitescript相当陌生,想构建一个脚本,该脚本按循环计划运行,并且仅基于项目履行的发票(即发票和项目履行之间存在一对一的关系,但可能是一对多的关系销售订单和发票/项目履行)。

我能够成功运行将销售订单全部转换为发票的脚本-但这包括销售订单上的所有项目,而不仅仅是已履行的项目(我们的业务中有很多情况只发生部分履行然后必须关闭订单)。目前,根据我的研究,我无法找到成功创建此脚本的其他示例。我最初的想法是以某种方式将销售订单上的“qtyfulfilled”存储在一个包含项目的数组中,并以此创建发票。但是对我来说,转换功能似乎是保留销售订单和发票之间链接的最佳方式。

 var invoice = record.transform({
      fromType: record.Type.SALES_ORDER,
      fromID: salesOrderId,
      toType: record.Type.INVOICE,
      isDynamic: true
 });

这将返回包含销售订单中所有项目的发票,而不仅仅是已履行的项目。

编辑:

我实现了建议的代码版本,我只是迭代销售订单的行并将发票上的每一行数量替换为“fulfilledquantity” - 但是我意识到当数量为零时,发票似乎仍在将该行存储在一个零值。

在发票脚本的下游,我通过 NS 集成将发票记录传递给我们的 EDI 提供商。通过我的脚本创建的发票映射到 EDI 810(发票记录),其中未履行的行项目的数量行为 0,这会导致 EDI 文件中的错误。

我编写了以下内容以在数量之后遍历发票行并删除零数量行,但出现以下错误:“name”:“USER_ERROR”,“message”:“请选择要添加的项目” -

    for (var k = 0; k < lineCount; k++) {

                    var currentInvoiceLineQuantity = newInvoice.getSublistValue ({
                        sublistId: 'item',
                        fieldId: 'quantity',
                        line: k
                    });

                    if(currentInvoiceLineQuantity === 0){
                        newInvoice.removeSublistSubrecord({
                            sublistId: 'item',
                            fieldid: 'item',
                            line: k
                        });

                        k--;

                        lineCount--;

                    }

                }   

标签: netsuitesuitescriptsuitescript2.0

解决方案


将销售订单转换为发票后,遍历行并将数量更改为仅对已履行的金额开票。

下面的示例来自一个用 SS1.0 编写的遗留脚本,但可以很容易地转换为 SS2.0。

var lineCount = invoice.getLineItemCount('item');

for (var i = 1; i <= lineCount; i++) {
  const quantity = invoice.getLineItemValue('item', 'quantity', i);
  const remaining = invoice.getLineItemValue('item', 'quantityremaining', i);
  invoice.setLineItemValue('item', 'quantity', i, quantity - remaining);
}

推荐阅读