Track Deposits and Refunds

The following sample shows how to track the balance of deposits and refunds on sales orders.

For the complete tutorial, see Track Customer Deposit Balances.

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/search', 'N/log'], (record, search, log) => {
    function beforeSubmit(scriptContext) {
        const contextDep = scriptContext.newRecord;
        const soID = contextDep.getValue({
            fieldId: 'salesorder'
        });
        if ((soID !== null) && (scriptContext.type === scriptContext.UserEventType.DELETE)) {
            const depAmt = contextDep.getValue({
                fieldId: 'payment'
            });
            const salesorder = record.load({
                type: record.Type.SALES_ORDER,
                id: soID
            });
            const status = salesorder.getValue({
                fieldId: 'status'
            });
            if (status !== 'Billed') {
                const soTotalPaid = salesorder.getValue({
                    fieldId: 'custbody_total_deposit_paid'
                });
                const soRemainingBalance = salesorder.getValue({
                    fieldId: 'custbody_balance_remaining'
                });   
                salesorder.setValue({
                    fieldId: 'custbody_total_deposit_paid',
                    value: soTotalPaid - depAmt
                });
                salesorder.setValue({
                    fieldId: 'custbody_balance_remaining',
                    value: (soRemainingBalance + depAmt)
                });
                const id = salesorder.save({
                    enableSourcing: true,
                    ignoreMandatoryFields: true
                });
            }
        }
    }
    function afterSubmit(scriptContext) {
        const contextDep = scriptContext.newRecord;
        const soID = contextDep.getValue({
            fieldId: 'salesorder'
        });
        if ((soID !== null) && ((scriptContext.type === scriptContext.UserEventType.CREATE) || (scriptContext.type === scriptContext.UserEventType.EDIT))) {
            const salesorder = record.load({
                type: record.Type.SALES_ORDER,
                id: soID
            });
            const status = salesorder.getValue({
                fieldId: 'status'
            });
            if (status !== 'Billed') {
                const soEntity = salesorder.getValue({
                    fieldId: 'entity'
                });
                const soTranId = salesorder.getValue({
                    fieldId: 'tranid'
                });
                const soFullTextTranID = 'Sales Order #' + soTranId;
                const mySearch = search.load({
                    id: 'customsearch_sobalancedue'
                });
                const entityFilter = search.createFilter({
                    name: 'name',
                    operator: search.Operator.IS,
                    values: soEntity
                });
                const soIdFilter = search.createFilter({
                    name: 'formulatext',
                    operator: search.Operator.IS,
                    summary: search.Summary.MAX,
                    formula: "CASE WHEN {type}='Customer Deposit' then {appliedtotransaction} when {type}='Deposit Application' then {‌createdfrom.salesorder} when {type}='Sales Order' then 'Order #'||{number} end",
                    values: soFullTextTranID
                });
                mySearch.filters.push(entityFilter, soIdFilter);
                const soresults = mySearch.run();
                mySearch.run().each(function(soresults) {
                    let soTextID = soresults.getValue({
                        name: 'formulatext',
                        summary: search.Summary.GROUP
                    });
                    if (soFullTextTranID === soTextID) {
                        let totalPaid = soresults.getValue({
                            name: 'formulacurrency',
                            summary: search.Summary.SUM
                        });
                        let soTotal = salesorder.getValue({
                            fieldId: 'total'
                        });
                        let remainingBalanceOnOrder = parseFloat(soTotal)-parseFloat(totalPaid);
                        salesorder.setValue({
                            fieldId: 'custbody_total_deposit_paid',
                            value: totalPaid
                        });
                        salesorder.setValue({
                            fieldId: 'custbody_balance_remaining',
                            value: remainingBalanceOnOrder
                        });
                        let id = salesorder.save({
                            enableSourcing: true,
                            ignoreMandatoryFields: true
                        });
                    }
                });
            }
        }
    }
    return {
        beforeSubmit: beforeSubmit,
        afterSubmit: afterSubmit
    };
}); 

        
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/search', 'N/log'], (record, search, log) => {
    function afterSubmit(scriptContext) {
        const contextDepApp = scriptContext.oldRecord;
        const depAppId = contextDepApp.id;
        const soEntity = contextDepApp.getValue({
            fieldId: 'customer'
        });
        const createdFrom = contextDepApp.getValue({
            fieldId: 'deposit'
        });
        const cusDeposit = record.load({
            type: record.Type.CUSTOMER_DEPOSIT,
            id: createdFrom,
            isDynamic: true
        });
        const orderId = cusDeposit.getValue({
            fieldId: 'salesorder'
        });
        const soFullTextTranID = cusDeposit.getText({
            fieldId: 'salesorder',
        });
        const mySearch = search.load({
            id: 'customsearch_sobalancedue'
        });
        const entityFilter = search.createFilter({
            name: 'internalidnumber',
            operator: search.Operator.IS,
            values: soEntity
        });
        const soIdFilter = search.createFilter({
            name: 'formulatext',
            operator: search.Operator.IS,
            formula: "CASE WHEN {type}='Customer Deposit' then {appliedtotransaction} when {type}='Deposit Application' then {‌createdfrom.salesorder} when {type}='Sales Order' then 'Sales Order #'||{number} end",
            values: soFullTextTranID
        });
        mySearch.filters.push(entityFilter, soIdFilter);
        const soresults = mySearch.run();
        mySearch.run().each(function(soresults) {
            let soTextID = soresults.getValue({
                name: 'formulatext',
                summary: search.Summary.GROUP
            });
            if (soFullTextTranID === soTextID) {
                let totalPaid = soresults.getValue({
                    name: 'formulacurrency',
                    summary: search.Summary.SUM
                });
                let salesorder = record.load({
                    type: record.Type.SALES_ORDER,
                    id: orderId,
                    isDynamic: true
                });
                let soTotal = salesorder.getValue({
                    fieldId: 'total'
                });
                let remainingBalanceOnOrder = parseFloat(soTotal);
                remainingBalanceOnOrder = parseFloat(remainingBalanceOnOrder) - parseFloat(totalPaid);
                salesorder.setValue({
                    fieldId: 'custbody_total_deposit_paid',
                    value: totalPaid
                });
                salesorder.setValue({
                    fieldId: 'custbody_balance_remaining',
                    value: remainingBalanceOnOrder
                });
                let id = salesorder.save({
                    enableSourcing: true,
                    ignoreMandatoryFields: true
                });
            }
        });
    }
    return {
        afterSubmit: afterSubmit
    };
}); 

        
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/search', 'N/log'], (record, search, log) => {
    return {
        afterSubmit: function(scriptContext) {
            const contextRef = scriptContext.newRecord;
            const refId = contextRef.id;
            UpdateSalesOrder(refId);
        }
    };
    function UpdateSalesOrder(refId) {
        const refund = record.load({
            type: record.Type.CUSTOMER_REFUND,
            id: refId,
            isDynamic: true
        });
        const soEntity = refund.getValue({
            fieldId: 'customer'
        });
        const lines = refund.getLineCount({
            sublistId: 'apply'
        });
        for (let i = 0; i < lines; i++) {
            let depositnum = refund.getSublistText({
                sublistId: 'apply',
                fieldId: 'internalid',
                line: i
            });
            let refundamt = refund.getSublistValue({
                sublistId: 'apply',
                fieldId: 'amount',
                line: i
            });
            let order = search.lookupFields({
                type: search.Type.DEPOSIT_APPLICATION,
                id: depositnum,
                columns: 'createdfrom.salesorder'
            });
            let soFullTextTranID = order['createdfrom.salesorder'][0].text;
            let orderId = order['createdfrom.salesorder'][0].value;
            let soTotalPaid = search.lookupFields({
                type: search.Type.SALES_ORDER,
                id: orderId,
                columns: ['total']
            });
            let soTotal = soTotalPaid['total'];
            let mySearch = search.load({
                id: 'customsearch_sobalancedue'
            });
            let entityFilter = search.createFilter({
                name: 'internalid',
                join: 'customer',
                operator: search.Operator.EQUALTO,
                summary: search.Summary.MAX,
                values: soEntity
            });
            let soIdFilter = search.createFilter({
                name: 'formulatext',
                operator: search.Operator.IS,
                formula: "CASE WHEN {type}='Customer Deposit' then {appliedtotransaction} when {type}='Deposit Application' then {‌createdfrom.salesorder} when {type}='Sales Order' then 'Sales Order #'||{number} end",
                values: soFullTextTranID
            });
            mySearch.filters.push(entityFilter, soIdFilter);
            let soresults = mySearch.run();
            mySearch.run().each(function(soresults) {
                let soTextID = soresults.getValue({
                    name: 'formulatext',
                    summary: search.Summary.GROUP
                });
                if (soFullTextTranID === soTextID) {
                    let totalPaid = soresults.getValue({
                        name: 'formulacurrency',
                        summary: search.Summary.SUM
                    });
                    let remainingBalanceOnOrder = parseFloat(soTotal);
                    remainingBalanceOnOrder = parseFloat(remainingBalanceOnOrder)-parseFloat(totalPaid);
                    let salesorder = record.load({
                        type: record.Type.SALES_ORDER,
                        id: orderId,
                        isDynamic: true
                    });
                    salesorder.setValue({
                        fieldId: 'custbody_total_deposit_paid',
                        value: totalPaid
                    });
                    salesorder.setValue({
                        fieldId: 'custbody_balance_remaining',
                        value: remainingBalanceOnOrder
                    });
                    let id = salesorder.save({
                        enableSourcing: true,
                        ignoreMandatoryFields: true
                    });
                }
            });
        }
    }
}); 

        
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/search', 'N/log'], (record, search, log) => {
    function afterSubmit(scriptContext) {
        const contextOrder = scriptContext.newRecord;
        const soID = contextOrder.id;
        const salesorder = record.load({
            type: record.Type.SALES_ORDER,
            id: soID
        });
        const soTotal = salesorder.getValue({
            fieldId: 'total'
        });
        const soEntity = salesorder.getValue({
            fieldId: 'entity'
        });
        const soTranId = salesorder.getValue({
            fieldId: 'tranid'
        });
        const soFullTextTranID = 'Sales Order #'+soTranId;
        const mySearch = search.load({
            id: 'customsearch_sobalancedue'
        });
        const entityFilter = search.createFilter({
            name: 'entity',
            operator: search.Operator.ANYOF,
            values: soEntity
        });
        const soIdFilter = search.createFilter({
            name: 'formulatext',
            operator: search.Operator.IS,
            formula: "CASE WHEN {type}='Customer Deposit' then {appliedtotransaction} when {type}='Deposit Application' then {‌createdfrom.salesorder} when {type}='Sales Order' then 'Sales Order #'||{number} end",
            values: soFullTextTranID
        });
        mySearch.filters.push(entityFilter, soIdFilter);
        const soresults = mySearch.run();
        mySearch.run().each(function(soresults) {
            let soTextID = soresults.getValue({
                name: 'formulatext',
                summary: search.Summary.GROUP
            });
            if (soFullTextTranID === soTextID) {
                let totalPaid = soresults.getValue({
                    name: 'formulacurrency',
                    summary: search.Summary.SUM
                });
                let remainingBalanceOnOrder = parseFloat(parseFloat(soTotal))-parseFloat(totalPaid);
                salesorder.setValue({
                    fieldId: 'custbody_total_deposit_paid',
                    value: totalPaid
                });
                salesorder.setValue({
                    fieldId: 'custbody_balance_remaining',
                    value: remainingBalanceOnOrder
                });
                let id = salesorder.save({
                    enableSourcing: true,
                    ignoreMandatoryFields: true
                });
            }
        });
    }
    return{
        afterSubmit: afterSubmit
    };
}); 

        

General Notices