Create a script to assist with the promotion of sales order to invoice

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

Leave a comment

Your email address will not be published. Required fields are marked *