Lrabe
Lrabe

Reputation: 35

Suitescript Invoice for only Fulfilled Items on Sales Orders

I am fairly new to suitescript and would like to build a script that runs on a recurring schedule and only invoices based on item fulfillments (ie there is a one to one relationship between the invoice and item fulfillment but potentially a one to many relationship between the sales order and invoice/item fulfillments).

I am able to successfully run a script that transforms the sales order in total into an invoice - however this includes all items on sales order and not just the items that have been fulfilled (we have many situations in our business in which only partial fulfillment occurs and the order must then be closed out). At this point from my research I'm unable to find other examples of this script being successfully created. My initial idea is to somehow store the 'qtyfulfilled' on the sales order in an an array with the items and somehow create an invoice with this. However to me it seems that the transform function is the best way to retain a link between sales order and the invoice.

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

This returns an invoice with all items from the sales order rather than just the fulfilled items.

EDIT:

I implemented a version of the code suggested where I just iterate over the lines of the sales order and replace each line quantity on the invoice with 'fulfilledquantity' - however I realized when the quantity is zero the invoice appears to be still storing that line at a zero value.

Downstream of the invoice script I'm passing the invoice record to our EDI provider via a NS integration. The invoices created via my script map into the EDI 810 (invoice record) with 0 quantity lines for the line items that werent fulfilled which cause errors in the EDI file.

I wrote the following to iterate through invoice lines after the quantity and remover the zero quantity lines but am getting the following error: "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--;

                    }

                }   

Upvotes: 1

Views: 3570

Answers (2)

bknights
bknights

Reputation: 15462

If you do this in an After Submit user event on Item Fulfillments you can transform the related Sales Order to an invoice and then walk backwards through the line times and delete the ones not on the fulfillment.

You should check quantities for the against the shipped quantities and you may need to have logic for billing any unfulfillable items ( I do that either the first fulfillment on an order or when there are no more lines to ship. )

Finally you may need to handle shipping charge logic to either charge the amount of shipping on each fulfillment or charge the fulfillment’s shipping up to the shipping charge on the original sales order.

Upvotes: 1

michoel
michoel

Reputation: 3783

After you transform the sales order to an invoice, iterate through the lines and change the quantity to only invoice the amount that was fulfilled.

The sample below is from a legacy script written in SS1.0 but will translate pretty easily to 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);
}

Upvotes: 2

Related Questions