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;
}
})
});