Add custom address fields to Profile Model

We can add custom address fields to the profile model using the suite let script method

Create a suite let script inside the netsuite account


/**
 * Entry function
 * @param {nlobjRequest} request Request object
 * @param {nlobjResponse} response Response object
 * @returns {Void} Any output is written via response object
 */
function getCustomerAddresses(request, response)
{
	var addresses = [];
	var addressesStr = "";
	
	try
	{
		addresses = searchForAddresses(request);
		addressStr = JSON.stringify(addresses);

		response.setContentType('JAVASCRIPT'); //[1.0.1] MJL
		response.write(addressStr);
    }
	catch(e)
	{
		errorHandler("getCustomerAddresses", e);
	}
}

/**
 * This function loads the customer record using the internal id passed into the suitelet, makes the call to get the addresses and returns them to the entry function
 * @param {nlobjRequest} request Request object
 * @returns {Array} addresses
 */
function searchForAddresses(request)
{
	var customerId = null;
	var addresses = [];
	var customerRecord = null;
	
	try
	{
		customerId = request.getParameter('customerId'); 
		
		if(customerId !== null)
		{
			customerRecord = nlapiLoadRecord('customer', customerId);
			addresses = getAddresses(customerRecord);
		}
	}
	catch(e)
	{
		errorHandler("searchForAddresses", e);
	}
	return addresses;
}

/**
 * This function uses the customer record to get the customer's addresses and store them as objects within an array
 * @param {nlobjRecord} customerRecord
 * @returns {Array} addresses
 */
function getAddresses(customerRecord)
{
	var addressCount = 0;
	var addresses = [];
	var addressObj = {};
	
	try
	{
		addressCount = customerRecord.getLineItemCount('addressbook');
		
		if(addressCount)
		{
			for(var i = 1 ; i <= addressCount; i++)
			{
				addressObj = {};
				
				addressObj.addr1 = customerRecord.getLineItemValue('addressbook', 'addr1', i) || null;
				addressObj.addr2 = customerRecord.getLineItemValue('addressbook', 'addr2', i) || null;
				addressObj.addr3 = customerRecord.getLineItemValue('addressbook', 'addr3', i) || null;
				addressObj.addressee = customerRecord.getLineItemValue('addressbook', 'addressee', i) || null;
				addressObj.attention = customerRecord.getLineItemValue('addressbook', 'attention', i) || null;
				addressObj.city = customerRecord.getLineItemValue('addressbook', 'city', i) || null;
				addressObj.country = customerRecord.getLineItemValue('addressbook', 'country', i) || null;
				addressObj.defaultbilling = customerRecord.getLineItemValue('addressbook', 'defaultbilling', i) || null;
				addressObj.defaultshipping = customerRecord.getLineItemValue('addressbook', 'defaultshipping', i) || null;
				addressObj.internalid = customerRecord.getLineItemValue('addressbook', 'internalid', i) || null;
				addressObj.isresidential = customerRecord.getLineItemValue('addressbook', 'isresidential', i) || null;
				addressObj.isvalid = customerRecord.getLineItemValue('addressbook', 'isvalid', i) || null; 
				addressObj.phone = customerRecord.getLineItemValue('addressbook', 'phone', i) || null; 
				addressObj.state = customerRecord.getLineItemValue('addressbook', 'state', i) || null; //Getting text from state as this is a dropdown field
				addressObj.zip = customerRecord.getLineItemValue('addressbook', 'zip', i) || null;
                addressObj.addrtext = customerRecord.getLineItemValue('addressbook', 'addrtext', i) || null;
				var x = customerRecord.getLineItemValue('addressbook', 'addrtext', i);
				var title = x.substring(x.lastIndexOf(' ') + 1);
				var y = x.split(' ')[0];
				addressObj.loca = title || null;
				addressObj.locb = y || null;

				addressObj.label = (customerRecord.getLineItemValue('addressbook', 'label', i)) || null; //Important difference - reason for script
				
				addresses.push(addressObj);
			}
		}
	}
	catch(e)
	{
		errorHandler("getAddresses", e);
	}
	return addresses; 
}

add the suitesript code to call the suitelet script using extension

// JJ.ProfileExtend.ProfileExtend.js
// Load all your starter dependencies in backend for your extension here
// ----------------

define('JJ.ProfileExtend.ProfileExtend', [
    'Application',
    'SC.Models.Init',
    'Profile.Model',
    'Utils',
    'underscore'
], function AdditionalFields(
    Application,
    ModelsInit,
    ProfileModel,
    Utils,
    _
) {
    'use strict';

    Application.on('after:Profile.get', function afterProfileGet(Model, response) {
        try {
            //Only can you get the profile information if you are logged in.
            // if (ModelsInit.session.isLoggedIn2() && this.isSecure) // 1.1.3
            if (ModelsInit.session.isLoggedIn2() || (ModelsInit.session.isRecognized() && !ModelsInit.customer.isGuest())) {

                response = ProfileModel.getLoggedInProfile(response); //1.1.0
            }

            if (customer) {
                response = ProfileModel.getCustomCustomerValues(response); //1.1.0 moved into separate function
                //1.0.3 voucher values added //1.1.0 removed unused code
            } else {
                response.hasAccess = false;
            }
        } catch (e) {
            nlapiLogExecution('ERROR', 'Profile.Model: get', e);
        }



    });

    _.extend(ProfileModel, {
        isSecure: Utils.isInCheckout(request),
        getLoggedInProfile: function(response) {

                var addresses = [];

                try {
                    //Define the fields to be returned
                    this.fields = this.fields || [
                        'isperson',
                        'email',
                        'internalid',
                        'name',
                        'overduebalance',
                        'phoneinfo',
                        'companyname',
                        'firstname',
                        'lastname',
                        'middlename',
                        'emailsubscribe',
                        'campaignsubscriptions',
                        'paymentterms',
                        'creditlimit',
                        'balance',
                        'creditholdoverride',
                        'accessrole'
                    ];

                    addresses = this.getCustomerAddresses(); //1.0.2
                    response.addressBook = addresses; //1.0.2

                } catch (e) {
                    nlapiLogExecution('ERROR', 'Profile.Model: getLoggedInProfile', e);
                }
                nlapiLogExecution('DEBUG', 'Profile', JSON.stringify(response));
                return response;
            }

            /**
             * 1.1.0 added and refactored code
             * 1.1.1 now gets isLabOnly and adds it to the profile
             * 1.1.2 removed isLabOnly code
             * This function adds the custom customer field values from the customer record to the profile object
             * @param profile {Profile Object}
             * @returns profile {Profile Object}
             */
            ,
        getCustomCustomerValues: function(profile) {
                var customFieldValues = {}; //1.0.1 MJL
                var isDentistVal = 'F';
                var isDentist = false; //1.0.1 MJL //1.1.0 renamed from hasAccess
                var isApprovedVal = 'F';
                var isApproved = false;
                var isLabOnlyVal = 'F'; //1.1.1
                var isLabOnly = false; //1.1.1
                var isReferaFrndVal = 'F';
                var isReferaFrnd = false;
                var excludeExpresVoucherVal = 'F'
                var excludeExpresVoucher = false;
                var voucherSpecialInstruction = null;

                try {
                    customFieldValues = customer.getCustomFieldValues();
                    // nlapiLogExecution('ERROR', 'customFieldValues', customFieldValues);
                    isDentistVal = _.findWhere(customFieldValues, { name: "custentity_isdentist" });

                    isDentist = (isDentistVal.value == 'T');
                    profile.hasAccess = isDentist;
                    profile.isDentist = isDentist;


                    isApprovedVal = _.findWhere(customFieldValues, { name: "custentity_approveddentist" });
                    isApproved = (isApprovedVal.value == 'T');

                    isReferaFrndVal = _.findWhere(customFieldValues, { name: "custentity_jj_en_107_refer_frnd_prgm" });
                    isReferaFrnd = (isReferaFrndVal.value == 'T');
                    profile.isReferaFrnd = isReferaFrnd;
                    nlapiLogExecution('ERROR', 'isReferaFrnd', isReferaFrnd);
                    //1.1.1 //1.1.2 removed
                    /*isLabOnlyVal = _.findWhere(customFieldValues, {name: "custentity_labonly"}); 
                    isLabOnly = (isLabOnlyVal.value == 'T'); 
                    profile.isLabOnly = isLabOnly;*/

                    if ((isDentist === true && isApproved === true) || isDentist === false) {
                        profile.approvedUser = true;
                    } else {
                        profile.approvedUser = false;
                    }

                    profile.canReferAFriend = _.findWhere(customFieldValues, { name: "custentity_canreferafriend" }); //1.1.4

                    excludeExpresVoucherVal = _.findWhere(customFieldValues, { name: "custentity_jj_exclude_express_voucher" });
                    excludeExpresVoucher = (excludeExpresVoucherVal.value == 'T');
                    profile.excludeExpresVoucher = excludeExpresVoucher;
                    voucherSpecialInstruction = _.findWhere(customFieldValues, { name: "custentity_jj_voucher_special_instuctn" });
                    profile.voucherSpecialInstruction = voucherSpecialInstruction;
                    nlapiLogExecution('ERROR', 'voucherSpecialInstruction', voucherSpecialInstruction);

                } catch (e) {
                    nlapiLogExecution('ERROR', 'Profile.Model: getCustomerValues', e);
                }
                return profile;
            }

            /**
             * 1.0.2 added
             * This function uses the customer id of the current user to get their addresses (including the address labels)
             * @returns addresses {Array}
             */
            ,
        getCustomerAddresses: function() {
                var customerId = null;
                var response = null;
                var url = "";
                var addresses = [];

                try {
                    customerId = nlapiGetUser();

                    url = nlapiResolveURL('SUITELET', 'customscript_getcustomeraddresses', 'customdeploy_getcustomeraddresses', true);
                    url = url + '&customerId=' + customerId;

                    response = nlapiRequestURL(url, null, null, null);

                    addresses = this.processAddresses(response);
                } catch (e) {
                    nlapiLogExecution('ERROR', 'Profile.Model: getCustomerAddresses', e);
                }
                return addresses;
            }

            /**
             * 1.0.2 added
             * This function gets the contents of the response and parses it 
             * @params response {Response Object}
             * @returns addresses {Array}
             */
            ,
        processAddresses: function(response) {
            var addresses = null;
            var responseStr = null;

            try {
                responseStr = response.getBody();

                if (responseStr) {
                    addresses = JSON.parse(responseStr);
                }
            } catch (e) {
                nlapiLogExecution('ERROR', 'Profile.Model: processAddresses', e);
            }
            return addresses;
        }


    })
});

Leave a comment

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