Jira code : CD-8
Created a workflow and workflow action script, the workflow will trigger when the “mark shipped” button click and by workflow action script an invoice for the corresponding IF will be created in the background. The workflow also triggers when the context is bulk processing. We deployed a script on item fulfilment, So when the IF status changed to shipped(from IF status field), an invoice for the corresponding IF will be created in the background. Email sent to the customer when the invoice created.
Workflow
Search type is a transaction
Type: Item fulfilment
Trigger Type: after record submit
Event type: ship
Context: User interface, user event script.
The workflow will trigger on IF ‘mark shipped’ button click and also during bulk processing.
Workflow action script
/**
* @NApiVersion 2.x
* @NScriptType workflowactionscript
*/
/**
* Script Description
* In PO on Receive by date field update, the ETA date in PO line items get updated.
*
*/
/*******************************************************************************
* CORP DESIGN
* **************************************************************************
*
* Date: 23/04/2019
*
* Author: Jobin & Jismi IT Services LLP
*
*
* REVISION HISTORY
*
* Revision $ 23/04/2019 Maria: Create
*
******************************************************************************/
define(['N/record'],
function(record) {
function onAction(scriptContext) {
try{
var Items = new Object();
var removeitem = new Object();
var newRec = scriptContext.newRecord;
var id = newRec.id; // item fulfillemet id
var salesOrderId = newRec.getValue({ // Here we are getting the sales order id to use in the transform function
fieldId: 'createdfrom'
}); // sales order id
// Transform the Sales Order into an Invoice
var invoiceRecord = record.transform({
fromType: record.Type.SALES_ORDER,
fromId: salesOrderId,
toType: record.Type.INVOICE
});
//To get IF date
var IF_date = newRec.getValue({
fieldId: 'trandate'
});
var lineCountItemSublist = newRec.getLineCount({ sublistId: 'item' });
for (var i = 0; i < lineCountItemSublist; i++) {
try {
var itemId = newRec.getSublistValue({
sublistId: 'item',
fieldId: 'item',
line: i
});
var itemQuatity = newRec.getSublistValue({
sublistId: 'item',
fieldId: 'quantity',
line: i
});
var itemfxamount = newRec.getSublistValue({
sublistId: 'item',
fieldId: 'itemfxamount',
line: i
});
var itemunitprice = newRec.getSublistValue({
sublistId: 'item',
fieldId: 'itemunitprice',
line: i
});
removeitem[itemId] = itemQuatity;
Items[itemId] = [itemQuatity,itemfxamount,itemunitprice];
} catch (e) {
logme('err@lineCountItemSublist', e.message);
}
}
var InvoiceLine = invoiceRecord.getLineCount({ sublistId: 'item' });
for (var i = 0; i < InvoiceLine; i++) {
try {
var itemId = invoiceRecord.getSublistValue({
sublistId: 'item',
fieldId: 'item',
line: i
});
if (Items[itemId] != null || Items[itemId] != undefined){
var itemQuatity = invoiceRecord.setSublistValue({
sublistId: 'item',
fieldId: 'quantity',
line: i,
value: Items[itemId][0]
});
var itemfxamount = invoiceRecord.setSublistValue({
sublistId: 'item',
fieldId: 'amount',
line: i,
value: Items[itemId][1]
});
if(Items[itemId][2]){
var itemunitprice = invoiceRecord.setSublistValue({
sublistId: 'item',
fieldId: 'rate',
line: i,
value: Items[itemId][2]
});
}
}
} catch (e) {
log.debug('err@InvoiceLine', e.message);
}
}
for (var i = (InvoiceLine - 1); i >= 0; i--){ // to delete items excluded in fulfillment
try {
var itemId = invoiceRecord.getSublistValue({
sublistId: 'item',
fieldId: 'item',
line: i
});
if ((removeitem[itemId] == null) || (removeitem[itemId] == undefined) || (removeitem[itemId] == "") || (removeitem[itemId] == " ")) {
invoiceRecord.removeLine({
sublistId: 'item',
line: i,
ignoreRecalc: true
});
}
} catch (e) { log.debug("e", e); }
}
//logme('Items', Items);
try{
//set IF date value as invoice date
invoiceRecord.setValue({
fieldId: 'trandate',
value: IF_date,
ignoreFieldChange: true
});
//Submit the record
var saveInv = invoiceRecord.save();
logme('Saved Invoice', saveInv);
} catch (e) { log.debug("error@recordsave", e); }
} catch (e) {
logme("@itemupdate", getError(e));
}
}
return {
onAction : onAction
};
/*******************************************************************************
* return error
*
* @param e
* @returns
*
* Created on 22-Feb-2019 by Maria
*/
function getError(e) {
var stErrMsg = '';
if (e.getDetails != undefined) {
stErrMsg = '_' + e.getCode() + '<br>' + e.getDetails() + '<br>' +
e.getStackTrace();
} else {
stErrMsg = '_' + e.toString();
}
return stErrMsg;
}
/*******************************************************************************
* Log these data
*
* @param title
* @param details
* @returns
*
* Created on 22-Feb-2019 by Maria
*/
function logme(title, details) {
log.debug({
title: title,
details: details
});
}
});
User event Script
/**
* @NApiVersion 2.x
* @NScriptType UserEventScript
* @NModuleScope SameAccount
*/
define(['N/record','N/error'],
function(record,error) {
/**
* Function definition to be triggered before record is loaded.
*
* @param {Object} scriptContext
* @param {Record} scriptContext.newRecord - New record
* @param {Record} scriptContext.oldRecord - Old record
* @param {string} scriptContext.type - Trigger type
* @Since 2015.2
*/
function afterSubmit(scriptContext) {
try{
var workflowcontext = scriptContext.type;
var newrecord = scriptContext.newRecord;
var oldrecord = scriptContext.oldRecord;
if(workflowcontext == 'create'){
var newshipstatus = newrecord.getValue({
fieldId: 'shipstatus'
});
}
if(workflowcontext == 'edit'){
var oldshipstatus = oldrecord.getValue({
fieldId: 'shipstatus'
});
var newshipstatus = newrecord.getValue({
fieldId: 'shipstatus'
});
}
if((workflowcontext == 'create') && (newshipstatus == 'C')){
invoicecreation(scriptContext);
}
if((workflowcontext == 'edit') && ((oldshipstatus == 'A') || (oldshipstatus == 'B')) && (newshipstatus == 'C')){
invoicecreation(scriptContext);
}
} catch (e) {
logme("@itemupdate", getError(e));
}
}
//function to create invoice
function invoicecreation(scriptContext){
try{
var Items = new Object();
var removeitem = new Object();
var newRec = scriptContext.newRecord;
var id = newRec.id; // item fulfillemet id
var salesOrderId = newRec.getValue({ // Here we are getting the sales order id to use in the transform function
fieldId: 'createdfrom'
}); // sales order id
// Transform the Sales Order into an Invoice
var invoiceRecord = record.transform({
fromType: record.Type.SALES_ORDER,
fromId: salesOrderId,
toType: record.Type.INVOICE
});
//T get IF date
var IF_date = newRec.getValue({
fieldId: 'trandate'
});
var lineCountItemSublist = newRec.getLineCount({ sublistId: 'item' });
for (var i = 0; i < lineCountItemSublist; i++) {
try {
var itemId = newRec.getSublistValue({
sublistId: 'item',
fieldId: 'item',
line: i
});
var itemQuatity = newRec.getSublistValue({
sublistId: 'item',
fieldId: 'quantity',
line: i
});
var itemfxamount = newRec.getSublistValue({
sublistId: 'item',
fieldId: 'itemfxamount',
line: i
});
var itemunitprice = newRec.getSublistValue({
sublistId: 'item',
fieldId: 'itemunitprice',
line: i
});
removeitem[itemId] = itemQuatity;
Items[itemId] = [itemQuatity,itemfxamount,itemunitprice];
} catch (e) {
logme('err@lineCountItemSublist', e.message);
}
}
var InvoiceLine = invoiceRecord.getLineCount({ sublistId: 'item' });
for (var i = 0; i < InvoiceLine; i++) {
try {
var itemId = invoiceRecord.getSublistValue({
sublistId: 'item',
fieldId: 'item',
line: i
});
if (Items[itemId] != null || Items[itemId] != undefined){
var itemQuatity = invoiceRecord.setSublistValue({
sublistId: 'item',
fieldId: 'quantity',
line: i,
value: Items[itemId][0]
});
var itemfxamount = invoiceRecord.setSublistValue({
sublistId: 'item',
fieldId: 'amount',
line: i,
value: Items[itemId][1]
});
if(Items[itemId][2]){
var itemunitprice = invoiceRecord.setSublistValue({
sublistId: 'item',
fieldId: 'rate',
line: i,
value: Items[itemId][2]
});
}
}
} catch (e) {
log.debug('err@InvoiceLine', e.message);
}
}
for (var i = (InvoiceLine - 1); i >= 0; i--){ // to delete items excluded in fulfillment
try {
var itemId = invoiceRecord.getSublistValue({
sublistId: 'item',
fieldId: 'item',
line: i
});
if ((removeitem[itemId] == null) || (removeitem[itemId] == undefined) || (removeitem[itemId] == "") || (removeitem[itemId] == " ")) {
invoiceRecord.removeLine({
sublistId: 'item',
line: i,
ignoreRecalc: true
});
}
} catch (e) { log.debug("e", e); }
}
//logme('Items', Items);
try{
//set IF date value as invoice date
invoiceRecord.setValue({
fieldId: 'trandate',
value: IF_date,
ignoreFieldChange: true
});
//Submit the record
var saveInv = invoiceRecord.save();
logme('Saved Invoice', saveInv);
} catch (e) { log.debug("error@recordsave", e); }
} catch (e) {
logme("@invoicecreation", getError(e));
}
}
return {
//beforeLoad: beforeLoad,
//beforeSubmit: beforeSubmit,
afterSubmit: afterSubmit
};
/*******************************************************************************
* return error
*
* @param e
* @returns
*
* Created on 22-Feb-2019 by Maria
*/
function getError(e) {
var stErrMsg = '';
if (e.getDetails != undefined) {
stErrMsg = '_' + e.getCode() + '<br>' + e.getDetails() + '<br>' +
e.getStackTrace();
} else {
stErrMsg = '_' + e.toString();
}
return stErrMsg;
}
/*******************************************************************************
* Log these data
*
* @param title
* @param details
* @returns
*
* Created on 22-Feb-2019 by Maria
*/
function logme(title, details) {
log.debug({
title: title,
details: details
});
}
});