Calculate Commission on a Sales Order

The following sample shows how to calculate a commission amount and populate that amount to a custom field.

For the complete tutorial, see Calculate Commission on Sales Orders.

Important:

This sample uses SuiteScript 2.1. For more information, see SuiteScript 2.1.

          /**
 * @NApiVersion 2.1
 * @NScriptType UserEventScript
 * @NModuleScope SameAccount
 */

define(['N/record', 'N/log'], (record, log) => {
    function afterSubmit(scriptContext) {
        const stMethodName = 'afterSubmit_calculateCommission';
        try {
            if (scriptContext.type !== scriptContext.UserEventType.CREATE && scriptContext.type !== scriptContext.UserEventType.EDIT) {
                return;
            }
            let stItemType = null;
            let flMSRPTotalAmt = 0.00;
            let flMSRPAmt = 0.00;
            let flNetDistributorCost = 0.00;
            let flCommissionAmount = null;
            let flQuantity = 0.00;
            const recSalesOrder = scriptContext.newRecord;
            let flSubtotal = parseFloat(recSalesOrder.getValue({
                fieldId: 'subtotal'
            }));
            const numItems = recSalesOrder.getLineCount({
                sublistId: 'item'
            });
            for (let intLinenum = 0; intLinenum < numItems; intLinenum++) {
                flMSRPAmt = parseFloat(recSalesOrder.getSublistValue({
                    sublistId: 'item',
                    fieldId: 'custcol_salesorder_msrp',
                    line: intLinenum
                }));
                flQuantity = parseFloat(recSalesOrder.getSublistValue({
                    sublistId: 'item',
                    fieldId: 'quantity',
                    line: intLinenum
                }));
                stItemType = recSalesOrder.getSublistValue({
                    sublistId: 'item',
                    fieldId: 'itemtype',
                    line: intLinenum
                });
                if (stItemType !== 'Discount' && stItemType !== 'Subtotal' && stItemType !== 'Markup') {
                    flMSRPTotalAmt = flMSRPTotalAmt + (flMSRPAmt * flQuantity);
                }
            }
            flNetDistributorCost = flMSRPTotalAmt * 0.5;
            if (flSubtotal === flNetDistributorCost) {
                flCommissionAmount = flSubtotal * 0.10;
            } else if ((flSubtotal > flNetDistributorCost) && (flSubtotal <= flMSRPTotalAmt)) {
                flCommissionAmount = flNetDistributorCost * 0.10 + (flSubtotal - flNetDistributorCost) * 0.75;
            } else {
                if (flSubtotal > flMSRPTotalAmt) {
                    flCommissionAmount = flNetDistributorCost * 0.10 + (flMSRPTotalAmt - flNetDistributorCost) * 0.75 + (flSubtotal - flMSRPTotalAmt) * 0.5;
                }
            }
            const thisSalesOrderID = recSalesOrder.id;
            const updateSalesOrder = record.load({
                type: record.Type.SALES_ORDER,
                id: thisSalesOrderID
            });
            updateSalesOrder.setValue({
                fieldId: 'custbody_commission_amount',
                value: flCommissionAmount
            });
            const updateSalesOrderID = updateSalesOrder.save();
        } catch(e) {
            log.debug({
                title: stMethodName,
                details: ' - Exit (Catch)- '
            });
            if (e.getDetails !== undefined) {
                log.error({
                    title: 'Process Error',
                    details: JSON.stringify(e)
                });
                throw e;
            } else {
                log.error({
                    title: 'Unexpected Error',
                    details: JSON.stringify(e)
                });
                throw error.create({
                    name: 'Unexpected Error',
                    message: JSON.stringify(e)
                });
            }
        }
    }
    return {
        afterSubmit: afterSubmit
    };
}); 

        

General Notices