Jira Code: CORP-49
Description
We have to skip the calculation for spiff and commission amount if the sales order has a replacement item.
The spiff calculated when there is a spiff person, the invoice is “paid in full” and there is no replacement item.
The commission is calculated when the invoice is “paid in full”.
COMMISSION AMOUNT
/**
* @NApiVersion 2.x
* @NScriptType UserEventScript
* @NModuleScope SameAccount
*/
/**
* Script Description
* In SO, Calculates commission based on value in commission field.
.
*
*/
/*******************************************************************************
* CORP DESIGN
* **************************************************************************
*
* Date: 23/05/2019
*
* Author: Jobin & Jismi IT Services LLP
*
*
* REVISION HISTORY
*
* Revision $ 23/05/2019 Maria: Create
* 19/06/2019 Anju Babu:Updated
*
******************************************************************************/
define(['N/record', 'N/search'],
function(record, search) {
/**
* 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 {
if (scriptContext.type == 'create') {
var payment = record.load({
type: "customerpayment",
id: scriptContext.newRecord.id,
isDynamic: false
});
var numLines = payment.getLineCount({
sublistId: 'apply'
});
var invoiceArray = [];
var invoiceId;
for (var i = 0; i < numLines; i++) {
var applyvalue = payment.getSublistValue({
sublistId: 'apply',
fieldId: 'apply',
line: i
});
var INVtYPE = payment.getSublistValue({
sublistId: 'apply',
fieldId: 'type',
line: i
});
log.debug("INVtYPE", INVtYPE)
if (applyvalue == true && INVtYPE == "Invoice") {
var dataObj = {};
var invId = payment.getSublistValue({
sublistId: 'apply',
fieldId: 'internalid',
line: i
});
var amt = invItemInvoice(invId)
var checkReplacement = search.lookupFields({
type: search.Type.INVOICE,
id: invId,
columns: ['custbody_corp49_skip_replacemnt']
});
var invoiceSales = search.lookupFields({
type: search.Type.INVOICE,
id: invId,
columns: ['salesrep']
});
log.debug(invoiceSales);
var invoiceSalesId = invoiceSales.salesrep[0].value;
var commisPerc = search.lookupFields({
type: search.Type.EMPLOYEE,
id: invoiceSalesId,
columns: ['custentity_cd12_jj_commi_percent']
});
/*var commisPerc = search.lookupFields({
type: search.Type.INVOICE,
id: invId,
columns: ['custbody_cd12_sales_rep_comm_percent']
});*/
var innvoiceStatus = search.lookupFields({
type: search.Type.INVOICE,
id: invId,
columns: ['status']
});
var oldVal = search.lookupFields({
type: search.Type.INVOICE,
id: invId,
columns: ['custbody_cd12_invsales_rep_comm_amount']
});
log.debug(innvoiceStatus, innvoiceStatus.status[0].text);
var ststusInvoice = innvoiceStatus.status[0].text;
log.debug(checkReplacement, checkReplacement)
if (!oldVal.custbody_cd12_invsales_rep_comm_amount && ststusInvoice == "Paid In Full" && checkReplacement.custbody_corp49_skip_replacemnt == false) {
dataObj.invId = invId;
dataObj.amt = amt;
log.debug('dataObj.amt', dataObj.amt)
// dataObj.amt = scriptContext.newRecord.getSublistValue({
// sublistId: 'apply',
// fieldId: 'amount',
// line: i
// });
dataObj.commisPerct = 0;
dataObj.commisAmt = 0;
var commisPerct = (commisPerc.custentity_cd12_jj_commi_percent).split("%");
log.debug(' commisPerct', commisPerct);
if (commisPerct != null && commisPerct !== undefined && commisPerct != "" && commisPerct != " " && commisPerct != NaN) {
log.debug(' entry dataObj.commisAmt', dataObj.commisAmt);
dataObj.commisPerct = commisPerct[0];
dataObj.commisAmt = parseFloat(dataObj.amt) * parseFloat(dataObj.commisPerct) / 100;
}
log.debug(' dataObj.commisAmt1', dataObj.commisAmt)
invoiceArray.push(dataObj);
}
}
}
log.debug('invoiceArray', invoiceArray);
var inv_length = invoiceArray.length;
if (inv_length > 0)
updateinvoice(invoiceArray);
}
} catch (e) {
logme("error@afterSubmit", getError(e));
}
}
function beforeSubmit(scriptContext) {
try {
log.debug("entry", "entry");
log.debug("scriptContext", scriptContext)
var oldRecId = scriptContext.oldRecord.id;
log.debug('oldRecId', oldRecId)
if (scriptContext.type == "delete") {
var invoiceRec = record.load({
type: "customerpayment",
id: oldRecId,
isDynamic: false
});
var numLines = invoiceRec.getLineCount({
sublistId: 'apply'
});
var invoiceArray = [];
var invoiceId;
for (var i = 0; i < numLines; i++) {
var applyvalue = invoiceRec.getSublistValue({
sublistId: 'apply',
fieldId: 'apply',
line: i
});
var INVtYPE = invoiceRec.getSublistValue({
sublistId: 'apply',
fieldId: 'type',
line: i
}); //
if (applyvalue == true && INVtYPE == "Invoice") {
var dataObj = {};
var invId = invoiceRec.getSublistValue({
sublistId: 'apply',
fieldId: 'internalid',
line: i
});
var amt = invItemInvoice(invId);
log.debug(12);
var checkReplacement = search.lookupFields({
type: search.Type.INVOICE,
id: invId,
columns: ['custbody_corp49_skip_replacemnt']
});
log.debug(123);
var invoiceSales = search.lookupFields({
type: search.Type.INVOICE,
id: invId,
columns: ['salesrep']
});
log.debug(invoiceSales);
var invoiceSalesId = invoiceSales.salesrep[0].value;
log.debug(invoiceSalesId);
var commisPerc = search.lookupFields({
type: search.Type.EMPLOYEE,
id: invoiceSalesId,
columns: ['custentity_cd12_jj_commi_percent']
});
log.debug(12456);
log.debug(commisPerc, commisPerc);
var innvoiceStatus = search.lookupFields({
type: search.Type.INVOICE,
id: invId,
columns: ['status']
});
log.debug(innvoiceStatus, innvoiceStatus)
var ststusInvoice = innvoiceStatus.status[0].text;
log.debug(checkReplacement, checkReplacement)
if (ststusInvoice == "Paid In Full" && checkReplacement.custbody_corp49_skip_replacemnt == false) {
dataObj.invId = invId;
dataObj.amt = -amt;
log.debug('dataObj.amt', dataObj.amt)
// dataObj.amt = scriptContext.newRecord.getSublistValue({
// sublistId: 'apply',
// fieldId: 'amount',
// line: i
// });
dataObj.commisPerct = 0;
dataObj.commisAmt = 0;
log.debug(commisPerc.custentity_cd12_jj_commi_percent);
var commisPerct = (commisPerc.custentity_cd12_jj_commi_percent).split("%");
log.debug(' commisPerct2', commisPerct)
if (commisPerct != null && commisPerct !== undefined && commisPerct != "" && commisPerct != " " && commisPerct != NaN) {
log.debug(' entry 2 dataObj.commisAmt', dataObj.commisAmt)
dataObj.commisPerct = commisPerct[0];
dataObj.commisAmt = parseFloat(dataObj.amt) * parseFloat(dataObj.commisPerct) / 100;
}
}
log.debug(' dataObj.commisAmt2', dataObj.commisAmt)
invoiceArray.push(dataObj);
}
}
log.debug('invoiceArray', invoiceArray);
var inv_length = invoiceArray.length;
if (inv_length > 0)
updateinvoice(invoiceArray);
}
} catch (e) {
logme("error@beforeSubmit", getError(e));
}
}
function updateinvoice(invoiceArray) {
try {
for (var i = 0, len = invoiceArray.length; i < len; i++) {
var invoice = invoiceArray[i];
var inv_id = invoice.invId;
var commisAmt = 0;
var commisPerct = 0;
if (invoice.commisAmt != null && invoice.commisAmt !== undefined && invoice.commisAmt != "" && invoice.commisAmt != " " && invoice.commisAmt != NaN)
commisAmt = invoice.commisAmt;
if (invoice.commisPerct != null && invoice.commisPerct !== undefined && invoice.commisPerct != "" && invoice.commisPerct != " " && invoice.commisPerct != NaN)
commisPerct = invoice.commisPerct;
log.debug("inv_id", inv_id);
var invoicesLoad = record.load({
type: "invoice",
id: inv_id,
isDynamic: true
});
var commission_amount = invoicesLoad.getValue({
fieldId: 'custbody_cd12_invsales_rep_comm_amount'
});
if (!commission_amount) {
invoicesLoad.setValue({
fieldId: 'custbody_cd12_invsales_rep_comm_amount',
value: (parseFloat(commisAmt)).toFixed(3)
});
invoicesLoad.setValue({
fieldId: 'custbody_cd12_invsales_rep_comm_prcnt',
value: commisPerct
});
var salesorderid = invoicesLoad.getValue({
fieldId: 'createdfrom'
});
if (salesorderid) {
var salesLoad = record.load({
type: "salesorder",
id: salesorderid,
isDynamic: true
});
var sales_commissionamount = salesLoad.getValue({
fieldId: 'custbody_cd12_sales_rep_comm_amount'
});
if (sales_commissionamount) {
var new_salescomm_amount = parseFloat(commisAmt) + parseFloat(sales_commissionamount);
salesLoad.setValue({
fieldId: 'custbody_cd12_sales_rep_comm_amount',
value: (parseFloat(new_salescomm_amount)).toFixed(3)
});
} else {
salesLoad.setValue({
fieldId: 'custbody_cd12_sales_rep_comm_amount',
value: (parseFloat(commisAmt)).toFixed(3)
});
}
var sales_record = salesLoad.save();
}
}
var invoice_record = invoicesLoad.save();
}
} catch (e) {
logme("error@updateinvoice", getError(e));
}
}
/*******************************************************************************
Function to find the inventory items from invoice
******************************************************************************/
function invItemInvoice(invId) {
try {
var amount_total = 0;
var invoiceRec = record.load({
type: "invoice",
id: invId,
isDynamic: true
});
var numLines = invoiceRec.getLineCount({
sublistId: 'item'
});
log.debug('numLines', numLines)
for (i = 0; i < numLines; i++) {
var item_type = invoiceRec.getSublistValue({
sublistId: 'item',
fieldId: 'itemtype',
line: i
});
log.debug('item_type', item_type)
if (item_type == 'InvtPart') {
var item_amount = invoiceRec.getSublistValue({
sublistId: 'item',
fieldId: 'amount',
line: i
});
log.debug('item_amount', item_amount)
amount_total += item_amount;
}
}
return amount_total;
} catch (err) {
log.debug('error @ invItemInvoice ', err)
}
}
/*******************************************************************************
* 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
});
}
return {
//beforeLoad: beforeLoad,
beforeSubmit: beforeSubmit,
afterSubmit: afterSubmit
};
});
SPIFF AMOUNT
/**
* @NApiVersion 2.x
* @NScriptType UserEventScript
* @NModuleScope SameAccount
*/
/*******************************************************************************
* CD-13 UE Update Spiff Amount
* **************************************************************************
*
* Date: 03-05-2019 ANJU:CREATE
* 19/06/2019 UPDATED
* Author: Jobin & Jismi IT Services LLP
*
*****************************************************************************
**/
define(['N/format', 'N/url', 'N/search', 'N/runtime', 'N/record', 'N/https', 'N/ui/serverWidget'],
function(format, url, search, runtime, record, https, serverWidget) {
var main = {
afterSubmit: function(scriptContext) {
log.debug("scriptContext", scriptContext)
var newRecId = scriptContext.newRecord.id;
if (scriptContext.type == "edit") {
var payment = record.load({
type: "customerpayment",
id: newRecId,
isDynamic: false
});
var numLines = payment.getLineCount({
sublistId: 'apply'
});
var invoiceArray = [];
for (var k = 0; k < numLines; k++) {
var itemid = payment.getSublistValue({
sublistId: 'apply',
fieldId: 'internalid',
line: k
});
var applyvalue = payment.getSublistValue({
sublistId: 'apply',
fieldId: 'apply',
line: k
});
var INVtYPE = payment.getSublistValue({
sublistId: 'apply',
fieldId: 'type',
line: k
});
if (applyvalue == true && INVtYPE == "Invoice")
invoiceArray.push(itemid);
}
log.debug(invoiceArray);
for (var index = 0, len = invoiceArray.length; index < len; index++) {
var Id = invoiceArray[index];
log.debug("Id", Id)
var invoiceLoad = record.load({
type: "invoice",
id: Id,
isDynamic: false
});
var statusinvoice = invoiceLoad.getValue({
fieldId: 'status'
})
log.debug("statusinvoice", statusinvoice)
var spiffinvoice = invoiceLoad.getText({
fieldId: 'custbody_corpdesign_spiff'
})
var replacement = invoiceLoad.getText({
fieldId: 'custbody_corp49_skip_replacemnt'
})
log.debug('replacement', replacement)
log.debug("spiffinvoice", spiffinvoice)
var oldval = invoiceLoad.getValue({
fieldId: 'custbodyjj_spiff_amount_custom'
});
log.debug("oldval", oldval);
if (!oldval && statusinvoice == "Paid In Full" && spiffinvoice != '' && replacement == "F") {
var numLines1 = invoiceLoad.getLineCount({
sublistId: 'item'
});
log.debug("invoicenum", numLines1)
var spiffamount = 0;
for (var n = 0; n < numLines1; n++) {
var item_type = invoiceLoad.getSublistValue({
sublistId: 'item',
fieldId: 'itemtype',
line: n
});
if (item_type == 'InvtPart') {
var invoiceAmount = invoiceLoad.getSublistValue({
sublistId: 'item',
fieldId: 'rate',
line: n
});
var invoiceQty = invoiceLoad.getSublistValue({
sublistId: 'item',
fieldId: 'quantity',
line: n
});
var classpiff = invoiceLoad.getSublistText({
sublistId: 'item',
fieldId: 'class',
line: n
});
var classpiff = invoiceLoad.getSublistValue({
sublistId: 'item',
fieldId: 'class',
line: n
});
if (classpiff) {
var classpiff = main.getSpiffpercent(classpiff);
var spiffRate;
if (classpiff[classpiff.length - 1] === '%') {
// log.debug("classpiff", classpiff)
spiffRate = (parseFloat(invoiceAmount) * parseFloat(classpiff) / 100) * parseFloat(invoiceQty);
log.debug("spiffRateperce", spiffRate.toFixed(2))
} else {
spiffRate = parseFloat(invoiceQty) * parseFloat(classpiff);
log.debug("spiffRatecclcamm", spiffRate.toFixed(2))
}
invoiceLoad.setSublistValue({
sublistId: 'item',
fieldId: 'custcoljj_spiff_custom',
line: n,
value: spiffRate
});
spiffamount = parseFloat(spiffamount) + parseFloat(spiffRate);
log.debug("spiffamount", spiffamount.toFixed(2))
}
}
}
log.debug("spiffamounttotal", spiffamount.toFixed(2))
invoiceLoad.setValue({
fieldId: 'custbodyjj_spiff_amount_custom',
value: spiffamount
});
var salesorderid = invoiceLoad.getValue({
fieldId: 'createdfrom'
})
main.salesorder(salesorderid, spiffamount, Id);
}
var invoiceLoadId = invoiceLoad.save();
log.debug(invoiceLoadId);
}
}
},
beforeSubmit: function(scriptContext) {
log.debug("scriptContext", scriptContext)
var oldRecId = scriptContext.oldRecord.id;
if (scriptContext.type == "delete") {
var payment = record.load({
type: "customerpayment",
id: oldRecId,
isDynamic: false
});
var numLines = payment.getLineCount({
sublistId: 'apply'
});
var invoiceArray = [];
for (var k = 0; k < numLines; k++) {
var itemid = payment.getSublistValue({
sublistId: 'apply',
fieldId: 'internalid',
line: k
});
var applyvalue = payment.getSublistValue({
sublistId: 'apply',
fieldId: 'apply',
line: k
});
var INVtYPE = payment.getSublistValue({
sublistId: 'apply',
fieldId: 'type',
line: k
});
if (applyvalue == true && INVtYPE == "Invoice")
invoiceArray.push(itemid);
}
log.debug(invoiceArray);
for (var index = 0, len = invoiceArray.length; index < len; index++) {
var Id = invoiceArray[index];
log.debug("Id", Id)
var invoiceLoad = record.load({
type: "invoice",
id: Id,
isDynamic: false
});
var statusinvoice = invoiceLoad.getValue({
fieldId: 'status'
})
log.debug("statusinvoice", statusinvoice)
var spiffinvoice = invoiceLoad.getText({
fieldId: 'custbody_corpdesign_spiff'
})
var replacement = invoiceLoad.getText({
fieldId: 'custbody_corp49_skip_replacemnt'
})
log.debug('replacement', replacement)
log.debug("spiffinvoice", spiffinvoice)
if (statusinvoice == "Paid In Full" && spiffinvoice != '' && replacement == "F") {
var spiffamount = invoiceLoad.getValue({
fieldId: 'custbodyjj_spiff_amount_custom',
});
invoiceLoad.setValue({
fieldId: 'custbodyjj_spiff_amount_custom',
value: 0
});
spiffamount = -spiffamount;
var salesorderid = invoiceLoad.getValue({
fieldId: 'createdfrom'
})
main.salesorder(salesorderid, spiffamount, Id);
}
var invoiceLoadId = invoiceLoad.save();
log.debug(invoiceLoadId);
}
}
},
salesorder: function(salesid, spiffamount, saleId) {
var salesLoad = record.load({
type: "salesorder",
id: salesid,
isDynamic: false
});
var spiffsales = salesLoad.getText({
fieldId: 'custbody_corpdesign_spiff'
})
log.debug("spiffsales", spiffsales)
if (spiffsales != '') {
var numLines1 = salesLoad.getLineCount({
sublistId: 'links'
});
log.debug("salesnum", numLines1)
var idSales = [];
for (var n = 0; n < numLines1; n++) {
var salesId = salesLoad.getSublistValue({
sublistId: 'links',
fieldId: 'id',
line: n
});
var salesstatus = salesLoad.getSublistValue({
sublistId: 'links',
fieldId: 'status',
line: n
});
var salestype = salesLoad.getSublistValue({
sublistId: 'links',
fieldId: 'type',
line: n
});
if (salesstatus == 'Paid In Full' && salestype == 'Invoice')
// if (salestype == 'Invoice')
if (salesId != saleId)
idSales.push(salesId);
}
var salesSpiffamount = parseFloat(spiffamount);
if (idSales.length > 0) {
for (var index = 0, len = idSales.length; index < len; index++) {
var Id = idSales[index];
log.debug("Id", Id)
var invoicesSaleLoad = record.load({
type: "invoice",
id: Id,
isDynamic: false
});
var InvoicesSpiff = invoicesSaleLoad.getValue({
fieldId: 'custbodyjj_spiff_amount_custom'
});
log.debug(InvoicesSpiff, InvoicesSpiff);
salesSpiffamount = parseFloat(salesSpiffamount) + parseFloat(InvoicesSpiff);
log.debug(salesSpiffamount, salesSpiffamount);
}
salesLoad.setValue({
fieldId: 'custbodyjj_spiff_amount_custom',
value: salesSpiffamount
});
} else {
var oldval = salesLoad.getValue({
fieldId: 'custbodyjj_spiff_amount_custom',
});
salesSpiffamount = oldval + salesSpiffamount;
salesLoad.setValue({
fieldId: 'custbodyjj_spiff_amount_custom',
value: salesSpiffamount
});
}
}
var salesLoadId = salesLoad.save();
log.debug(salesLoadId);
},
getSpiffpercent: function(spiffclass) {
log.debug("spiffclass", spiffclass)
var spiffrate;
var customrecord_jj_item_class_spiffSearchObj = search.create({
type: "customrecord_jj_item_class_spiff",
filters: [
["custrecord_jj_item_class", "anyof", spiffclass]
],
columns: [
search.createColumn({ name: "custrecord_jj_spiff_percentage", label: "Spiff Percentage" }),
search.createColumn({ name: "custrecord_jj_spiff_amount", label: "Spiff Amount" })
]
});
var searchResultCount = customrecord_jj_item_class_spiffSearchObj.runPaged().count;
// log.debug("customrecord_jj_item_class_spiffSearchObj result count", searchResultCount);
customrecord_jj_item_class_spiffSearchObj.run().each(function(result) {
// .run().each has a limit of 4,000 res
spiffrate = result.getValue("custrecord_jj_spiff_percentage");
if (!spiffrate) {
spiffrate = result.getValue("custrecord_jj_spiff_amount");
log.debug("spiffrateamount", spiffrate)
}
return true;
});
return spiffrate;
}
}
for (var key in main) {
if (typeof main[key] === 'function') {
main[key] = trycatch(main[key], key);
}
};
function trycatch(myfunction, key) {
return function() {
try {
return myfunction.apply(this, arguments);
} catch (e) {
log.debug("e in " + key, e);
}
}
};
return main;
});