A Suitelet form for vendor bill creation and transforms the vendor bill into a journal entry.

Jira Code: TRS-7

Create a vendor bill using the custom form and in the approval button action, the vendor bill converts into a journal entry.
In this task, the primary fund number is auto-populated. In the validation part, the button is only visible for the particular vendor bill created using custom suitelet form.


//Suitelet for creating custom form and button action


/**
 * @NApiVersion 2.x
 * @NScriptType Suitelet
 * @NModuleScope SameAccount
 */

/*******************************************************************************
 * Trust Bridge
 *  
  ******************************************************************************
 * Date: 
  
 * Author: Jobin & Jismi IT Services LLP
 * Script Description: Created for suitelet form for creating vendor bill,
 * Date created :18/06/2019
 
 ******************************************************************************/
define(['N/ui/serverWidget', 'N/search', 'N/record', 'N/runtime'],

    function(serverWidget, search, record, runtime) {

        /**
         * Definition of the Suitelet script trigger point.
         *
         * @param {Object} context
         * @param {ServerRequest} context.request - Encapsulation of the incoming request
         * @param {ServerResponse} context.response - Encapsulation of the Suitelet response
         * @Since 2015.2
         */
        function checkForParameter(parameter) {
            if (parameter != "" && parameter !== null && parameter !== undefined && parameter !== false && parameter !== "null" && parameter !== "undefined" && parameter !== 'false' && parameter != " ")
                return parameter;
            else {
                return null;
            }
        }

        function onRequest(context) {
            if (context.request.method == 'GET') {
                try {

                    var chartArr = [];

                    // crate custom form with fields

                    var form = serverWidget.createForm({
                        title: 'CREATE A VENDOR BILL'
                    });

                    form.clientScriptFileId = 642;
                    // Add fields that will shows in results

                    var nameField = form.addField({
                        id: 'custpage_name',
                        type: serverWidget.FieldType.SELECT,
                        label: 'Vendor name',
                        source: 'vendor'
                    })
                    nameField.isMandatory = true;
                    nameField.updateDisplaySize({
                        height: 80,
                        width: 600
                    });

                    var dateField = form.addField({
                        id: 'custpage_date',
                        type: serverWidget.FieldType.DATE,
                        label: 'Date'
                    })
                    dateField.isMandatory = true;

                    dateField.updateDisplaySize({
                        height: 80,
                        width: 600
                    });


                    var currencyField = form.addField({
                        id: 'custpage_currency',
                        type: serverWidget.FieldType.SELECT,
                        label: 'Currency',
                        source: 'currency'

                    });

                    currencyField.isMandatory = true;

                    currencyField.updateDisplaySize({
                        height: 80,
                        width: 600
                    });

                    // search for getting chart of account child under grant account

                    var accountSearchObj = search.create({
                        type: "account",
                        filters: [
                            ["parent", "anyof", "252"] //grant expense chart of account
                        ],
                        columns: [
                            search.createColumn({
                                name: "name",
                                sort: search.Sort.ASC,
                                label: "Name"
                            }),
                            search.createColumn({ name: "internalid", label: "Internal ID" })
                        ]
                    });
                    var searchResultCount = accountSearchObj.runPaged().count;
                    log.debug("accountSearchObj result count", searchResultCount);
                    accountSearchObj.run().each(function(result) {
                        var chartObj = {};
                        chartObj.name = result.getValue(accountSearchObj.columns[0]);
                        chartObj.id = result.getValue(accountSearchObj.columns[1]);
                        chartArr.push(chartObj);
                        return true;
                    });


                    var accountField = form.addField({
                        id: 'custpage_account',
                        type: serverWidget.FieldType.SELECT,
                        label: 'Account'
                    });
                    accountField.isMandatory = true;
                    accountField.addSelectOption({
                        value: "",
                        text: ""
                    });
                    for (var i = 1; i < chartArr.length; i++) {

                        accountField.addSelectOption({

                            value: chartArr[i].id,
                            text: chartArr[i].name

                        });
                    }
                    accountField.updateDisplaySize({
                        height: 80,
                        width: 600
                    });

                    var amountField = form.addField({
                        id: 'custpage_amount',
                        type: serverWidget.FieldType.CURRENCY,
                        label: 'Amount'
                    });
                    amountField.updateDisplaySize({
                        height: 80,
                        width: 40
                    });
                    amountField.isMandatory = true;

                    var memoField = form.addField({
                        id: 'custpage_memo',
                        type: serverWidget.FieldType.TEXT,
                        label: 'Memo'
                    });
                    memoField.isMandatory = true;
                    memoField.updateDisplaySize({
                        height: 80,
                        width: 40
                    });


                    var fundField = form.addField({
                        id: 'custpage_fundnum',
                        type: serverWidget.FieldType.SELECT,
                        label: 'Fund number',
                        source: 'customrecord_cseg5'
                    });
                    fundField.isMandatory = true;

                    fundField.updateDisplaySize({
                        height: 80,
                        width: 600
                    });
                    var primaryField = form.addField({
                        id: 'custpage_primarychar',
                        type: serverWidget.FieldType.SELECT,
                        label: 'Primary Charity Purpose',
                        source: 'customrecord_cseg6'
                    });
                    primaryField.isMandatory = true;
                    primaryField.updateDisplaySize({
                        height: 80,
                        width: 600
                    });


                    form.addSubmitButton('Submit');
                    context.response.writePage(form);


                } catch (err) {
                    log.debug("err", err);

                }


            } else {
                try {

                    // getting values using post action and set values for mandatory field

                    var currentUserMail = runtime.getCurrentUser().email;
                    log.debug("currentUserMail", currentUserMail)


                    var billRecord = record.create({
                        type: record.Type.VENDOR_BILL
                    });

                    billRecord.setText({
                        fieldId: 'custbody_user_mailid',
                        text: currentUserMail
                    });

                    billRecord.setText({
                        fieldId: 'approvalstatus',
                        text: "Pending Approval"
                    });


                    var nameField2 = context.request.parameters.custpage_name

                    log.debug("nameField2", nameField2)


                    billRecord.setValue({
                        fieldId: 'entity',
                        value: checkForParameter(nameField2)
                    });


                    var dateField2 = context.request.parameters.custpage_date

                    log.debug("dateField2", dateField2)

                    billRecord.setValue({
                        fieldId: 'trandate',
                        value: new Date(dateField2)
                    });



                    var currencyField2 = context.request.parameters.custpage_currency
                    log.debug("currencyField2", currencyField2)

                    billRecord.setValue({
                        fieldId: 'currency',
                        value: checkForParameter(currencyField2)
                    });

                    var memoField2 = context.request.parameters.custpage_memo
                    log.debug("memoField2", memoField2)

                    billRecord.setValue({
                        fieldId: 'memo',
                        value: checkForParameter(memoField2)
                    });
                    var fundField2 = context.request.parameters.custpage_fundnum
                    log.debug("fundField2", fundField2)

                    billRecord.setValue({
                        fieldId: 'cseg5',
                        value: checkForParameter(fundField2)
                    });
                    var primaryField2 = context.request.parameters.custpage_primarychar
                    log.debug("primaryField2", primaryField2)

                    billRecord.setValue({
                        fieldId: 'cseg6',
                        value: checkForParameter(primaryField2)
                    });

                    var amountField2 = context.request.parameters.custpage_amount
                    log.debug("amountField2", amountField2)

                    billRecord.setSublistValue({
                        sublistId: 'expense',
                        fieldId: 'amount',
                        line: 0,
                        value: checkForParameter(amountField2)
                    });

                    var accountField2 = context.request.parameters.custpage_account
                    log.debug("accountField2", accountField2)


                    billRecord.setSublistValue({
                        sublistId: 'expense',
                        fieldId: 'account',
                        line: 0,
                        value: checkForParameter(accountField2)
                    });


                    var billRecordId = billRecord.save({
                        enableSourcing: true,
                        ignoreMandatoryFields: true
                    });

                    log.debug("billRecordId", billRecordId);

                    if (billRecordId) {
                        var htmlCode = '<html><head></head><body><script>confirm("Successfully created Vendor Bill. Internal ID of Vendor bill = ' + billRecordId + '");window.location.href ="' + "https://5432341-sb1.app.netsuite.com/app/site/hosting/scriptlet.nl?script=24&deploy=1&whence=" + '";</script></body></html>';
                        context.response.write(htmlCode);
                    }
                } catch (err1) {
                    log.debug("err1", err1);

                }


            }


        }

        return {
            onRequest: onRequest
        };

    });



// client script for field change for auto population and currency validation.


/**
 * @NApiVersion 2.x
 * @NScriptType ClientScript
 * @NModuleScope SameAccount
 */

/*******************************************************************************
* Trust Bridge
*  
 ******************************************************************************
* Date: 
 
* Author: Jobin & Jismi IT Services LLP
* Script Description:Created for auto populating field in the vendonor name selection.
* Date created :18/06/2019
 
******************************************************************************/

define(['N/record', 'N/currentRecord', 'N/search'], function(record, currentRecord, search) {



    function fieldChanged(context) {
        try {

            var currentRecord = context.currentRecord;
            console.log("currentRecord", currentRecord);

            var FieldName = context.fieldId;

            var currentVendor = currentRecord.getValue({
                'fieldId': 'custpage_name'
            });
            console.log("currentVendor", currentVendor);

            if (FieldName == 'custpage_name') {

                currentRecord.setValue({
                    fieldId: 'custpage_currency',
                    value: ""
                });

                var sourceItem = search.lookupFields({
                    type: search.Type.VENDOR,
                    id: currentVendor,
                    columns: ['cseg6']
                });

                console.log("sourceItem", sourceItem);

                if (sourceItem.cseg6[0])
                    var primaryCharity = sourceItem.cseg6[0].value;

                console.log("primaryCharity", primaryCharity);


                if (primaryCharity != null && primaryCharity != "" && primaryCharity != undefined) {
                    currentRecord.setValue({
                        fieldId: 'custpage_primarychar',
                        value: primaryCharity
                    });
                }

            }


            if (FieldName == 'custpage_currency') {

                var currentVendorCurrency = currentRecord.getValue({
                    'fieldId': 'custpage_currency'
                });

                var vendorSearchObjcurrency = search.create({
                    type: "vendor",
                    filters: [
                        ["internalid", "anyof", currentVendor],
                        "AND",
                        ["vendorcurrencybalance.currency", "anyof", currentVendorCurrency]
                    ],
                    columns: [

                    ]
                });
                var searchResultCount = vendorSearchObjcurrency.runPaged().count;
                console.log("vendorSearchObjcurrency result count", searchResultCount);

                if (searchResultCount == 0) {
                    console.log("innnnn");
                    alert("This currency is not added to the customer. Please add and try again.");
                    currentRecord.setValue({
                        fieldId: 'custpage_currency',
                        value: ""
                    });
                    return false

                }
                return true

            }


        } catch (err) {
            console.log("err", err)
        }
    }




    return {

        fieldChanged: fieldChanged

    };

});


//for creating buttons in vendor bill and editing functionality of button click


/**
 * @NApiVersion 2.x
 * @NScriptType UserEventScript
 * @NModuleScope SameAccount
 */

/*******************************************************************************
* Trust Bridge
*  
 ******************************************************************************
* Date: 
 
* Author: Jobin & Jismi IT Services LLP
* Script Description:Created for button creation and validation.
* Date created :19/06/2019
 
******************************************************************************/
define(['N/record', 'N/search', 'N/runtime'],
    function(record, search, runtime) {
        function beforeLoad(context) {
            try {
                if (context.type == 'view') {
                    var vendorBill = context.newRecord;
                    var vendorBillId = vendorBill.id;
                    log.debug("vendorBillId", vendorBillId);
                    var currentUserRole = runtime.getCurrentUser().role;
                    log.debug("currentUserRole", currentUserRole)




                    var vendorBillBtn = context.form;

                    vendorBillBtn.clientScriptFileId = 644;
                    var mailIdFeld = null;
                    var approvalStatus = null;

                    var vendorbillSearchObj = search.create({
                        type: "vendorbill",
                        filters: [
                            ["type", "anyof", "VendBill"],
                            "AND",
                            ["internalid", "anyof", vendorBillId],
                            "AND",
                            ["mainline", "is", "T"]
                        ],
                        columns: [
                            search.createColumn({ name: "statusref", label: "Status" }),
                            search.createColumn({ name: "custbody_user_mailid", label: "USER MAILID" }),
                            search.createColumn({ name: "internalid", label: "Internal ID" })
                        ]
                    });
                    var searchResultCount = vendorbillSearchObj.runPaged().count;
                    log.debug("vendorbillSearchObj result count", searchResultCount);
                    vendorbillSearchObj.run().each(function(result) {
                        approvalStatus = result.getValue(vendorbillSearchObj.columns[0]);
                        mailIdFeld = result.getValue(vendorbillSearchObj.columns[1]);
                        return true;
                    });





                    if ((mailIdFeld) && (approvalStatus == 'pendingApproval')) {


                        var vendorBillApproveBtn = vendorBillBtn.addButton({
                            id: 'custpage_approve',
                            label: 'Approve',
                            functionName: 'ApproveBtn'
                        });

                        var VendorBillRejectBtn = vendorBillBtn.addButton({
                            id: 'custpage_reject',
                            label: 'Reject',
                            functionName: 'RejectBtn'
                        });
                    }
                    if ((mailIdFeld) && (approvalStatus == 'rejected')) {


                        var VendorBillRejectBtn = vendorBillBtn.addButton({
                            id: 'custpage_resubmit',
                            label: 'Resubmit',
                            functionName: 'ResubmitBtn'
                        });
                    }

                }
            } catch (er) {

                log.debug('er', er);
            }

        }

        function afterSubmit(context) {
            try {

                var vendorBillContent = context.newRecord;
                log.debug("vendorBillContent", vendorBillContent);
                var vendorBillIdAfter = vendorBillContent.id;
                log.debug("vendorBillIdAfter", vendorBillIdAfter);

                var journalEntryFieldAfter = null;
                var currentBillAmount = null;


                var vendorbillSearchObj = search.create({
                    type: "vendorbill",
                    filters: [
                        ["type", "anyof", "VendBill"],
                        "AND",
                        ["internalid", "anyof", vendorBillIdAfter],
                        "AND",
                        ["mainline", "is", "F"],
                        "AND",
                        ["taxline", "is", "F"],
                        "AND",
                        ["shipping", "is", "F"]
                    ],
                    columns: [
                        search.createColumn({ name: "fxamount", label: "Amount (Foreign Currency)" }),
                        search.createColumn({ name: "internalid", label: "Internal ID" }),
                        search.createColumn({ name: "custbody_journal_field", label: "JOURNAL FIELD" })
                    ]
                });
                var searchResultCount = vendorbillSearchObj.runPaged().count;
                log.debug("vendorbillSearchObj result count", searchResultCount);
                vendorbillSearchObj.run().each(function(result) {
                    currentBillAmount = result.getValue(vendorbillSearchObj.columns[0]);
                    journalEntryFieldAfter = result.getValue(vendorbillSearchObj.columns[2]);
                    return true;
                });

                if (journalEntryFieldAfter) {


                    var objRecord = record.load({
                        type: record.Type.JOURNAL_ENTRY,
                        id: journalEntryFieldAfter
                    });

                    objRecord.setSublistValue({
                        sublistId: 'line',
                        fieldId: 'debit',
                        line: 0,
                        value: currentBillAmount
                    })
                    objRecord.setSublistValue({
                        sublistId: 'line',
                        fieldId: 'credit',
                        line: 1,
                        value: currentBillAmount
                    })
                    var recordId = objRecord.save({
                        enableSource: true,
                        ignoreMandatoryFields: true
                    });
                    log.debug("recordId", recordId);
                }

            } catch (err) {
                log.debug("err", err);
            }

        }

        return {
            beforeLoad: beforeLoad,
            afterSubmit: afterSubmit
        };
    });

// create a client script for buttons and button action.
/**
 * @NApiVersion 2.x
 * @NScriptType ClientScript
 * @NModuleScope SameAccount
 */

/*******************************************************************************
* Trust Bridge
*  
 ******************************************************************************
* Date: 
 
* Author: Jobin & Jismi IT Services LLP
* Script Description:Created for journal entry creation and buttons action.
* Date created :20/06/2019
 
******************************************************************************/
define(['N/currentRecord', 'N/url', 'N/https', 'N/search', 'N/runtime', 'N/record', 'N/email'],

    function(currentRecord, url, https, search, runtime, record, email) {

        function pageInit(scriptContext) {
            try {
                console.log("inn");
                document.getElementById("inpt_approvalstatus2").disabled = true;
                jQuery("#inpt_approvalstatus2,#inpt_approvalstatus2_arrow").css('pointer-events', 'none');
            } catch (err) {
                console.log("err", err)
            }

        }



        function ApproveBtn() {
            try {
                console.log("enter")
                document.getElementById("custpage_approve").disabled = true;

                var vendorBillApprove = currentRecord.get();
                console.log("vendorBillApprove", vendorBillApprove)
                var vendorBiilId = vendorBillApprove.id;
                console.log("vendorBiilId", vendorBiilId);


                var billArr = [];

                var vendorbillSearchObj = search.create({
                    type: "vendorbill",
                    filters: [
                        ["type", "anyof", "VendBill"],
                        "AND",
                        ["mainline", "is", "F"],
                        "AND",
                        ["internalid", "anyof", vendorBiilId],
                        "AND",
                        ["taxline", "is", "F"],
                        "AND",
                        ["shipping", "is", "F"]
                    ],
                    columns: [
                        search.createColumn({ name: "memomain", label: "Memo (Main)" }),
                        search.createColumn({ name: "subsidiary", label: "Subsidiary" }),
                        search.createColumn({ name: "currency", label: "Currency" }),
                        search.createColumn({ name: "trandate", label: "Date" }),
                        search.createColumn({ name: "fxamount", label: "Amount (Foreign Currency)" }),
                        search.createColumn({
                            name: "entityid",
                            join: "vendor",
                            label: "Name"
                        }),
                        search.createColumn({ name: "account", label: "Account" }),
                        search.createColumn({ name: "cseg5", label: "Fund Number" })

                    ]
                });
                var searchResultCount = vendorbillSearchObj.runPaged().count;
                console.log("vendorbillSearchObj result count", searchResultCount);

                vendorbillSearchObj.run().each(function(result) {
                    var billObj = {};
                    billObj.memomain = result.getValue(vendorbillSearchObj.columns[0]);
                    billObj.subsidiary = result.getValue(vendorbillSearchObj.columns[1]);
                    billObj.currency = result.getValue(vendorbillSearchObj.columns[2]);
                    billObj.trandate = result.getValue(vendorbillSearchObj.columns[3]);
                    billObj.amount = result.getValue(vendorbillSearchObj.columns[4]);
                    billObj.Name = result.getValue(vendorbillSearchObj.columns[5]);
                    billObj.account = result.getValue(vendorbillSearchObj.columns[6]);
                    billObj.fundnumber = result.getValue(vendorbillSearchObj.columns[7]);
                    billArr.push(billObj);
                    return true
                });
                console.log("billArr", billArr);

                // search for getting virtal currency account equalent for currency type 
                var currencyAccountName = null;
                var currencyAccountId = null;

                var accountSearchObj = search.create({
                    type: "account",
                    filters: [
                        ["custrecord_virtual_currency", "anyof", billArr[0].currency]
                    ],
                    columns: [
                        search.createColumn({
                            name: "name",
                            sort: search.Sort.ASC,
                            label: "Name"
                        }),
                        search.createColumn({ name: "internalid", label: "Internal ID" })
                    ]
                });
                var searchResultCount = accountSearchObj.runPaged().count;
                console.log("accountSearchObj result count", searchResultCount);
                accountSearchObj.run().each(function(result) {
                    currencyAccountName = result.getValue(accountSearchObj.columns[0]);
                    currencyAccountId = result.getValue(accountSearchObj.columns[1]);
                    return true;
                });
                console.log("currencyAccountName", currencyAccountName);
                console.log("currencyAccountId", currencyAccountId);


                var journalRecord = record.create({
                    type: record.Type.JOURNAL_ENTRY
                });
                journalRecord.setValue({
                    fieldId: 'trandate',
                    value: new Date(billArr[0].trandate)
                });
                journalRecord.setValue({
                    fieldId: 'subsidiary',
                    value: billArr[0].subsidiary
                });
                journalRecord.setValue({
                    fieldId: 'currency',
                    value: billArr[0].currency
                });

                journalRecord.setValue({
                    fieldId: 'memo',
                    value: billArr[0].memomain
                });




                journalRecord.setSublistValue({ sublistId: 'line', fieldId: 'account', line: 0, value: currencyAccountId });
                journalRecord.setSublistValue({ sublistId: 'line', fieldId: 'debit', line: 0, value: billArr[0].amount });
                journalRecord.setSublistValue({ sublistId: 'line', fieldId: 'cseg5', line: 0, value: billArr[0].fundnumber });
                journalRecord.setSublistValue({ sublistId: 'line', fieldId: 'account', line: 1, value: currencyAccountId });
                journalRecord.setSublistValue({ sublistId: 'line', fieldId: 'credit', line: 1, value: billArr[0].amount });
                journalRecord.setSublistValue({ sublistId: 'line', fieldId: 'cseg5', line: 1, value: billArr[0].fundnumber });

                var recordId = journalRecord.save({
                    enableSource: false,
                    ignoreMandatoryFields: true
                });
                console.log("recordid", recordId);

                var journalField = record.submitFields({
                    type: record.Type.VENDOR_BILL,
                    id: vendorBiilId,
                    values: {
                        custbody_journal_field: recordId,
                        approvalstatus: 2 // setting approval status to open
                    }

                });
                console.log("journalField", journalField);

                window.location.reload();


            } catch (er) {
                console.log('er', er);
            }

        }

        function RejectBtn() {
            try {
                document.getElementById("custpage_reject").disabled = true;

                var vendorBillReject = currentRecord.get();
                console.log("vendorBillReject", vendorBillReject)

                var vendorBiilIdMail = vendorBillReject.id;
                console.log("vendorBiilIdMail", vendorBiilIdMail);
                var currentUserMail = runtime.getCurrentUser().email;
                console.log("currentUserMail", currentUserMail);

                var mailRecipient = null;

                var journalField = record.submitFields({
                    type: record.Type.VENDOR_BILL,
                    id: vendorBiilIdMail,
                    values: {
                        approvalstatus: 3
                    }

                });

                var vendorbillSearchObj2 = search.create({
                    type: "vendorbill",
                    filters: [
                        ["type", "anyof", "VendBill"],
                        "AND",
                        ["internalid", "anyof", vendorBiilIdMail],
                        "AND",
                        ["mainline", "is", "T"]
                    ],
                    columns: [
                        search.createColumn({ name: "custbody_user_mailid", label: "USER MAILID" })
                    ]
                });
                var searchResultCount = vendorbillSearchObj2.runPaged().count;
                console.log("vendorbillSearchObj2 result count", searchResultCount);

                vendorbillSearchObj2.run().each(function(result) {

                    mailRecipient = result.getValue(vendorbillSearchObj2.columns[0]);
                    return true;
                });
                console.log("mailRecipient", mailRecipient);
                if (mailRecipient) {
                    console.log("innn")
                    email.send({
                        author: -5, //administrator Mail,
                        recipients: mailRecipient,
                        subject: 'Vendor bill id - ' + vendorBiilIdMail + ' : Rejected',
                        body: 'The vendor bill of id = ' + vendorBiilIdMail + ' has been rejected. Please do necessary changes and resubmit.'
                    });
                }

                window.location.reload();


            } catch (err2) {
                console.log('err2', err2);
            }
        }

        function ResubmitBtn() {
            try {

                document.getElementById("custpage_resubmit").disabled = true;
                var vendorBillResubmit = currentRecord.get();
                console.log("vendorBillResubmit", vendorBillResubmit)
                var vendorBiilIdResubmitBtn = vendorBillResubmit.id;
                console.log("vendorBiilIdResubmitBtn", vendorBiilIdResubmitBtn);

                var satusField3 = record.submitFields({
                    type: record.Type.VENDOR_BILL,
                    id: vendorBiilIdResubmitBtn,
                    values: {
                        approvalstatus: 1
                    }

                });
                window.location.reload();

            } catch (err3) {
                console.log('err3', err3);
            }
        }

        return {
            pageInit: pageInit,
            ApproveBtn: ApproveBtn,
            RejectBtn: RejectBtn,
            ResubmitBtn: ResubmitBtn


        };

    });

Leave a comment

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