仅适用于销售订单上已完成项目的 Suitescript 发票

Suitescript Invoice for only Fulfilled Items on Sales Orders

我对 suitescript 还很陌生,想构建一个 运行 定期执行的脚本,并且只根据项目履行情况开具发票(即发票和项目之间存在一对一关系fulfillment 但销售订单和 invoice/item fulfillments 之间可能存在一对多关系)。

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

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

此 returns 发票包含销售订单中的所有项目,而不仅仅是已完成的项目。

编辑:

我实施了一个建议的代码版本,我只是遍历销售订单的行并将发票上的每一行数量替换为 'fulfilledquantity' - 但是我意识到当数量为零时会出现发票仍然将该行存储为零值。

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

我编写了以下代码以遍历数量后的发票行并删除零数量行,但出现以下错误:"name":"USER_ERROR","message":"Please choose an item to add" -

    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--;

                    }

                }   

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

下面的示例来自用 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);
}

如果您在 Item Fulfillments 的 After Submit 用户事件中执行此操作,您可以将相关的销售订单转换为发票,然后向后遍历行时间并删除不在 fulfillments 中的那些。

您应该根据已发货的数量核对数量,并且您可能需要有逻辑来为任何无法发货的商品开票(我会在订单的第一次发货时或在没有更多行要发货时这样做。)

最后,您可能需要处理运费逻辑,以收取每次履行的运费或收取履行的运费,最高可达原始销售订单的运费。