Jira Code: CD-13
Description
Spiffs will be calculated only on FULLY PAID invoices.
Spiff % or dollar amounts will be defined at the item level along with item category.
When an invoice is paid, the script calculates spiffs based on % or dollar amount listed at the item level for each line item and updates the invoice custom fields with the spiff amount.
When an invoice is paid the spiff amount for each line item should be calculated and shown to the item level.
Also, both invoice and sales order is calculated and the total amount spiff amount to be calculated and shown to a custom field.
/**
* @NApiVersion 2.x
* @NScriptType UserEventScript
* @NModuleScope SameAccount
*/
/*******************************************************************************
* CD-13 UE Update Spiff Amount
* **************************************************************************
*
* Date: 03-05-2019
*
* 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 = {
beforeLoad: function(scriptContext) {
log.debug("scriptContext", scriptContext)
var newRecId = scriptContext.newRecord.id;
if (scriptContext.type == "view") {
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
});
if (applyvalue == true)
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'
})
log.debug("spiffinvoice", spiffinvoice)
if (statusinvoice == "Paid In Full" && spiffinvoice != '') {
var numLines1 = invoiceLoad.getLineCount({
sublistId: 'item'
});
log.debug("invoicenum", numLines1)
var spiffamount = 0;
for (var n = 0; n < numLines1; n++) {
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);
}
}
},
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);
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'
});
salesSpiffamount = parseFloat(salesSpiffamount) + parseFloat(InvoicesSpiff)
}
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;
});