A custom screen where user can create a sales order and to the corresponding customer without adding items or other mandatory fields. Customer is also created if the corresponding name or email is entered. Scripts check the customer name and then search for the email id if there isn’t any then a customer record is created with details entered. A suitelet script creates the form and client script for doing the validations.
/**
* @NApiVersion 2.x
* @NScriptType ClientScript
* @NModuleScope SameAccount
*/
/**
* Script Description
* Client Script to support Add new SO script
*/
/*******************************************************************************
* Balaji Trading, Inc.
* **************************************************************************
* Date: 24/10/2017
*
* Author: Jobin & Jismi IT Services LLP
*
*
* REVISION HISTORY
*
* Revision 1.0 $ 24/10/2017 edwint, rosemolj : Created
*
******************************************************************************/
define(
['N/http', 'N/https', 'N/url', 'N/ui/message', 'N/search', 'N/record'],
/**
* @param {http}
* http
* @param {https}
* https
* @param {redirect}
* redirect
* @param {url}
* url
*/
function(http, https, url, message, search, record) {
/**
* Validation function to be executed when record is saved.
*
* @param {Object}
* scriptContext
* @param {Record}
* scriptContext.currentRecord - Current form record
* @returns {boolean} Return true if record is valid
*
* @since 2015.2
*/
function saveRecord(scriptContext) {
try {
var record = scriptContext.currentRecord;
var oldcustomer = record.getValue({
fieldId: 'textfield_existingcustomer'
});
var name = record.getValue({
fieldId: 'textfield_customername'
});
var lastname = record.getValue({
fieldId: 'textfield_customerlname'
});
var email = record.getValue({
fieldId: 'textfield_customeremail'
});
var company = record.getValue({
fieldId: 'textfield_customercompany'
});
var Address1 = record.getValue({
fieldId: 'textfield_customeraddr1'
});
var Address2 = record.getValue({
fieldId: 'textfield_customeraddr2'
});
var City = record.getValue({
fieldId: 'textfield_customercity'
});
var State = record.getValue({
fieldId: 'textfield_customerstate'
});
var zip = record.getValue({
fieldId: 'textfield_customerzip'
});
var Phone = record.getValue({
fieldId: 'textfield_customerphone'
});
var Memo = record.getValue({
fieldId: 'textfield_customermemo'
});
if ((name == '' || email == '' || lastname == '') &&
(oldcustomer == '')) {
showError("Please fill all the mandatory fields");
} else {
var Sodetails = {};
var sublistvalues = getItemsTableData(record);
logme('sublistvalues', sublistvalues);
var table_data = JSON.stringify(sublistvalues);
if (sublistvalues == '0' || sublistvalues.length < 1) {
showError('Please add atleast 1 item');
} else {
Sodetails.sublist = Sodetails;
var params = {
oldcustomer: oldcustomer,
name: name,
email: email,
company: company,
lastnames: lastname,
Memo: Memo,
zipcode: zip,
address1: Address1,
address2: Address2,
city: City,
state: State,
phone: Phone,
sodetails: JSON.stringify(sublistvalues)
};
var back_to_form_url = url
.resolveScript({
scriptId: "customscript_btn_76_btn85_jj_sladdnewso",
deploymentId: "customdeploy_btn_76_btn85_jj_sladdnewso",
returnExternalUrl: false
});
var response = https.post({
url: back_to_form_url,
body: params
});
logme('response', response);
var errormsg = message.create({
title: "Error ",
message: (response.body).substring(5),
type: message.Type.ERROR
});
var Success = message
.create({
title: "You have generated a new Sales Order ",
message: " ",
type: message.Type.CONFIRMATION
});
if ((response.body).indexOf('Success') > -1)
{
clearfields(record);
Success.hide();
errormsg.hide();
var recdid = (response.body).substring(7);
var Success = message
.create({
title: "You have generated a new Sales Order ",
message: recdid,
type: message.Type.CONFIRMATION
});
Success.show({
duration: 5000
});
var dashboard_url = url
.resolveScript({
scriptId: "customscript_btn_76_btn85_jj_sldashboard",
deploymentId: "customdeploy_btn_76_btn85_jj_sldashboard",
returnExternalUrl: false
});
console.log(recdid);
window.location = dashboard_url + "&recordid=" +
recdid;
} else {
Success.hide();
errormsg.show();
setTimeout(errormsg.hide, 15000);
}
console.log(response);
}
}
} catch (e) {
logme('TRY1', getError(e));
}
}
/**
* Function to be executed when field is changed.
*
* @param {Object}
* scriptContext
* @param {Record}
* scriptContext.currentRecord - Current form record
* @param {string}
* scriptContext.sublistId - Sublist name
* @param {string}
* scriptContext.fieldId - Field name
* @param {number}
* scriptContext.lineNum - Line number. Will be undefined
* if not a sublist or matrix field
* @param {number}
* scriptContext.columnNum - Line number. Will be
* undefined if not a matrix field
*
* @since 2015.2
*/
function fieldChanged(scriptContext) {
if (scriptContext.fieldId == 'textfield_existingbyemail') {
var records = scriptContext.currentRecord;
var customeremail = records.getValue({
fieldId: 'textfield_existingbyemail'
});
var internal = finduserbymail(search, customeremail);
if (internal == 0) {
showError("No Result Found .Please enter a valid email id");
clearfields(records);
} else {
records.setValue({
fieldId: 'textfield_existingcustomer',
value: internal,
ignoreFieldChange: false
});
}
logme('internals', internal);
}
if (scriptContext.fieldId == 'textfield_existingcustomer') {
try {
var records = scriptContext.currentRecord;
var customer = records.getValue({
fieldId: 'textfield_existingcustomer'
});
var resultrec = record.load({
type: record.Type.CUSTOMER,
id: customer,
isDynamic: true
});
var customer = {};
customer.fname = resultrec.getValue({
fieldId: 'firstname'
});
customer.lname = resultrec.getValue({
fieldId: 'lastname'
});
customer.email = resultrec.getValue({
fieldId: 'email'
});
customer.company = resultrec.getValue({
fieldId: 'companyname'
});
customer.phone = resultrec.getValue({
fieldId: 'phone'
});
var numLines = resultrec.getLineCount({
sublistId: 'addressbook'
});
if (numLines > 0) {
for (var i = 0; i < numLines; i++) {
var defaultshipping = resultrec
.getSublistValue({
sublistId: 'addressbook',
fieldId: 'defaultshipping',
line: i
});
customer.street1 = resultrec.getSublistValue({
sublistId: 'addressbook',
fieldId: 'addr1_initialvalue',
line: i
});
customer.street2 = resultrec.getSublistValue({
sublistId: 'addressbook',
fieldId: 'addr2_initialvalue',
line: i
});
customer.companys = resultrec.getSublistValue({
sublistId: 'addressbook',
fieldId: 'addressee_initialvalue',
line: i
});
customer.city = resultrec.getSublistValue({
sublistId: 'addressbook',
fieldId: 'city_initialvalue',
line: i
});
customer.country = resultrec.getSublistValue({
sublistId: 'addressbook',
fieldId: 'country_initialvalue',
line: i
});
customer.state = resultrec.getSublistValue({
sublistId: 'addressbook',
fieldId: 'dropdownstate_initialvalue',
line: i
});
customer.zip = resultrec.getSublistValue({
sublistId: 'addressbook',
fieldId: 'zip_initialvalue',
line: i
});
}
}
records.setValue({
fieldId: 'textfield_customername',
value: customer.fname,
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customerlname',
value: customer.fname,
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customeremail',
value: customer.email,
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customercompany',
value: customer.company,
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customeraddr1',
value: customer.street1,
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customeraddr2',
value: customer.street2,
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customercity',
value: customer.city,
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customerstate',
value: customer.state,
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customerzip',
value: customer.zip,
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customerphone',
value: customer.phone,
ignoreFieldChange: true
});
console.log(customer);
} catch (err) {
logme("Error@fieldChange", err);
}
}
}
return {
saveRecord: saveRecord,
fieldChanged: fieldChanged
};
/*******************************************************************
* This function will get data from sublist
*/
function getItemsTableData(assistant) {
var array_of_items = [];
try {
var sublistid1 = assistant.getSublist({
sublistId: 'sublistiditemdetails'
});
var numLines = assistant.getLineCount({
sublistId: 'sublistiditemdetails'
});
for (var i = 0; i < numLines; i++) {
var currentItem = {};
currentItem.id = assistant.getSublistValue({
fieldId: 'custpage_item',
sublistId: 'sublistiditemdetails',
line: i
});
currentItem.quantity = assistant.getSublistValue({
fieldId: 'fieldqty',
sublistId: 'sublistiditemdetails',
line: i
});
array_of_items.push(currentItem);
}
return array_of_items;
} catch (e) {
logme('E@getItemsTableData', getError(e));
return 0;
}
}
function clearfields(records) {
records.setValue({
fieldId: 'textfield_existingcustomer',
value: "",
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_existingbyemail',
value: "",
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customername',
value: "",
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customerlname',
value: "",
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customeremail',
value: "",
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customercompany',
value: "",
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customeraddr1',
value: "",
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customeraddr2',
value: "",
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customercity',
value: "",
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customerstate',
value: "",
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customerzip',
value: "",
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customerphone',
value: "",
ignoreFieldChange: true
});
records.setValue({
fieldId: 'textfield_customermemo',
value: "",
ignoreFieldChange: true
});
var numLines = records.getLineCount({
sublistId: 'sublistiditemdetails'
});
console.log('numLines afrr ' + numLines);
for (var i = 0; i < numLines; i++) {
console.log('i in loop' + i);
records.removeLine({
sublistId: 'sublistiditemdetails',
line: 0,
ignoreRecalc: true
});
}
}
function finduserbymail(search, value) {
var usrid = "";
try {
var filter = ['email', 'is', value];
logme("filter", filter);
var result = 'internalid';
// create search
var mySearch = search.create({
type: record.Type.CUSTOMER,
title: 'My Search',
columns: result,
filters: filter
});
// perform search operation
var search_run = mySearch.run().getRange({
start: 0,
end: 1
});
// if email exist
if (search_run.length > 0) {
// get internal id of the record
usrid = search_run[0].getValue({
name: 'internalid',
});
} else {
usrid = 0;
}
} catch (E) {
logme("searchError", E);
}
return usrid;
}
/*******************************************************************
* return error
*
* @param e
* @returns
*
* Created on 09-Aug-2017 by rosemol
*/
function getError(e) {
var stErrMsg = '';
if (e.getDetails != undefined) {
stErrMsg = '_' + e.getCode() + '<br>' + e.getDetails() +
'<br>' + e.getStackTrace();
} else {
stErrMsg = '_' + e.toString();
}
return stErrMsg;
}
/*******************************************************************
* Log these data
*
* @param title
* @param details
* @returns
*
* Created on 09-Aug-2017 by rosemol
*/
function logme(title, details) {
console.log(title + " " + details);
log.debug({
title: title,
details: details
});
}
/*******************************************************************
* Show error module
*/
function showError(message_string) {
var errormsg_mf = message.create({
title: "Error",
message: message_string,
type: message.Type.ERROR
});
errormsg_mf.hide();
errormsg_mf.show();
setTimeout(errormsg_mf.hide, 3000);
}
});
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
* @NModuleScope SameAccount
*/
/**
* Script Description
* This suitelet will display a screen which will allow the user to add new customer and add a sales order
*/
/*******************************************************************************
* Balaji Trading, Inc.
* **************************************************************************
* Date: 24/10/2017
*
* Author: Jobin & Jismi IT Services LLP
*
*
* REVISION HISTORY
*
* Revision 1.0 $ 24/10/2017 edwint, rosemolj : Created
*
******************************************************************************/
define(
['N/http', 'N/https', 'N/record', 'N/search', 'N/ui/serverWidget',
'N/url', 'N/runtime'
],
/**
* @param {http}
* http
* @param {https}
* https
* @param {record}
* record
* @param {search}
* search
* @param {serverWidget}
* serverWidget
* @param {url}
* url
*/
function(http, https, record, search, serverWidget, url, 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 onRequest(context) {
try {
var form;
var sublist;
var newsub;
if (context.request.method === 'GET') {
form = serverWidget.createForm({
title: 'Add New Sales Order '
});
var addnewcustomer = form.addFieldGroup({
id: 'fieldgroupidexisting',
label: 'Choose an Existing Customer'
});
// var inline = form.addField({
// id : 'textfield_inlines',
// type : serverWidget.FieldType.INLINEHTML,
// label : ' D',
// container : 'fieldgroupidexisting'
// });
//
// inline.defaultValue = " To generate a Sales Order,
// you can choose a cutomer using emailid or userid, Or
// if you prefer to choose new customer then add file
// the add new cutomer fields.";
// inline.updateBreakType({
// breakType : serverWidget.FieldBreakType.STARTROW
// });
var name = form.addField({
id: 'textfield_existingcustomer',
type: serverWidget.FieldType.SELECT,
source: 'customer',
label: 'Choose Customer by Name',
container: 'fieldgroupidexisting'
});
name.updateBreakType({
breakType: serverWidget.FieldBreakType.STARTROW
});
var existingbyemail = form.addField({
id: 'textfield_existingbyemail',
type: serverWidget.FieldType.EMAIL,
label: 'Choose Customer by Email',
container: 'fieldgroupidexisting'
});
existingbyemail.updateBreakType({
breakType: serverWidget.FieldBreakType.STARTCOL
});
var inline = form.addField({
id: 'textfield_inlines',
type: serverWidget.FieldType.INLINEHTML,
label: ' D',
container: 'fieldgroupidexisting'
});
inline.defaultValue = " To generate a Sales Order, you can choose a cutomer using emailid or userid, Or if you prefer to choose new customer then add file the add new cutomer fields.";
var addnewcustomer1 = form.addFieldGroup({
id: 'fieldgroupidnewcustomer',
label: 'Customer Details/Add New',
isCollapsible: true
});
addnewcustomer1.isCollapsible = true;
var name = form.addField({
id: 'textfield_customername',
type: serverWidget.FieldType.TEXT,
label: 'Customer First Name',
container: 'fieldgroupidnewcustomer'
});
// name.isMandatory = true;
var laname = form.addField({
id: 'textfield_customerlname',
type: serverWidget.FieldType.TEXT,
label: 'Customer Last Name',
container: 'fieldgroupidnewcustomer'
});
// laname.isMandatory = true;
var email = form.addField({
id: 'textfield_customeremail',
type: serverWidget.FieldType.EMAIL,
label: 'Customer Email Id',
container: 'fieldgroupidnewcustomer'
});
var companyname = form.addField({
id: 'textfield_customercompany',
type: serverWidget.FieldType.TEXT,
label: 'Customer Company Name',
container: 'fieldgroupidnewcustomer'
});
// email.isMandatory = true;
//
// var fieldgroup = form.addFieldGroup({
// id : 'fieldgroupaddress',
// label : 'Address'
// });
var shipaddresstextarea = form.addField({
id: 'textfield_customeraddr1',
type: serverWidget.FieldType.TEXT,
label: 'Address 1',
container: 'fieldgroupidnewcustomer'
});
shipaddresstextarea.updateBreakType({
breakType: serverWidget.FieldBreakType.STARTCOL
});
form.addField({
id: 'textfield_customeraddr2',
type: serverWidget.FieldType.TEXT,
label: 'Address 2 ',
container: 'fieldgroupidnewcustomer'
});
form.addField({
id: 'textfield_customercity',
type: serverWidget.FieldType.TEXT,
label: 'City',
container: 'fieldgroupidnewcustomer'
});
form.addField({
id: 'textfield_customerstate',
type: serverWidget.FieldType.TEXT,
label: 'State',
container: 'fieldgroupidnewcustomer'
});
form.addField({
id: 'textfield_customerzip',
type: serverWidget.FieldType.TEXT,
label: 'Zip',
container: 'fieldgroupidnewcustomer'
});
form.addField({
id: 'textfield_customerphone',
type: serverWidget.FieldType.PHONE,
label: 'Phone',
container: 'fieldgroupidnewcustomer'
});
form.addSubtab({
id: 'subtabsalesorder',
label: 'Sales Order details'
});
form.clientScriptFileId = '257822';
var fillsodetailsgrp = form.addFieldGroup({
id: 'fillsodetailsgrp',
label: 'Fill Sales Order Details'
});
var email = form.addField({
id: 'textfield_customermemo',
type: serverWidget.FieldType.TEXT,
label: 'Memo',
container: 'fillsodetailsgrp'
});
newsub = form.addSublist({
id: 'sublistiditemdetails',
type: serverWidget.SublistType.INLINEEDITOR,
label: 'Item Details',
tab: 'subtabsalesorder'
});
var itemField = newsub.addField({
id: 'custpage_item',
label: 'SKU',
type: serverWidget.FieldType.SELECT,
source: 'inventoryitem'
});
itemField.isMandatory = true;
var qty = newsub.addField({
id: 'fieldqty',
type: serverWidget.FieldType.INTEGER,
label: 'quantity'
});
qty.isMandatory = true;
form.addSubmitButton({
label: 'Generate SO'
});
context.response.writePage(form);
} else {
try {
var existingcustomer = context.request.parameters.oldcustomer;
var firstname = context.request.parameters.name;
var phone = context.request.parameters.phone;
var company = context.request.parameters.company;
var email = context.request.parameters.email;
var lastname = context.request.parameters.lastnames;
var Memo = context.request.parameters.Memo;
var zipcode = context.request.parameters.zipcode;
var address1 = context.request.parameters.address1;
var address2 = context.request.parameters.address2;
var state = context.request.parameters.state;
var city = context.request.parameters.city;
var phone = context.request.parameters.phone;
var sodetails = context.request.parameters.sodetails;
var custLocation = 1;
var Item_details = JSON.parse(sodetails);
var itemId = [];
var itemQuantity = [];
for (var i = 0; i < Item_details.length; i++) {
itemId.push(Item_details[i].id)
itemQuantity.push(Item_details[i].quantity);
}
log.debug({
title: "itemId",
details: itemId
});
log.debug({
title: "itemQuantity",
details: itemQuantity
});
} catch (e) {
logme('e@3', getError(e));
}
try {
if (existingcustomer == '') {
var objRecord = record.create({
type: record.Type.CUSTOMER,
isDynamic: true
});
objRecord.setValue({
fieldId: 'subsidiary',
value: 1
});
objRecord.setValue({
fieldId: 'isperson',
value: 'T'
});
objRecord.setValue({
fieldId: 'email',
value: email
});
objRecord.setValue({
fieldId: 'firstname',
value: firstname
});
objRecord.setValue({
fieldId: 'lastname',
value: lastname
});
objRecord.setValue({
fieldId: 'companyname',
value: company
});
var Xparcel_Expediated = '64955';
objRecord.setValue({
fieldId: 'shipmethod',
value: Xparcel_Expediated,
ignoreFieldChange: true
});
objRecord.setValue({
fieldId: 'category',
value: '4',
ignoreFieldChange: true
});
objRecord.selectNewLine({
sublistId: 'addressbook'
});
var myaddressSubrecord = objRecord
.getCurrentSublistSubrecord({
sublistId: 'addressbook',
fieldId: 'addressbookaddress'
});
myaddressSubrecord.setValue({
fieldId: 'addr1',
value: address1
});
myaddressSubrecord.setValue({
fieldId: 'addr2',
value: address2
});
myaddressSubrecord.setValue({
fieldId: 'city',
value: city
});
myaddressSubrecord.setValue({
fieldId: 'state',
value: state
});
myaddressSubrecord.setValue({
fieldId: 'zip',
value: zipcode
});
objRecord.commitLine({
sublistId: 'addressbook'
});
objRecord.setValue({
fieldId: 'phone',
value: phone
});
var recordId = objRecord.save({
enableSourcing: 'false',
ignoreMandatoryFields: 'false'
});
} else {
var recordId = existingcustomer;
}
} catch (e) {
logme('e@2', getError(e));
context.response.write("ERROR" + e.message);
}
createsales(recordId);
}
} catch (e) {
logme('TRY1', getError(e));
}
/***************************************************************
* This function will create a new SO
*/
function createsales(recordId) {
try {
// Create Sales Order
var objRecord = record.transform({
fromType: record.Type.CUSTOMER,
fromId: recordId,
toType: record.Type.SALES_ORDER,
isDynamic: true,
});
if (Memo != '') {
objRecord.setValue({
fieldId: 'memo',
value: Memo
});
}
var Xparcel_Expediated = '64955';
objRecord.setValue({
fieldId: 'shipmethod',
value: Xparcel_Expediated,
ignoreFieldChange: true
});
objRecord.setValue({
fieldId: 'paymentmethod',
value: 1,
ignoreFieldChange: true
});
objRecord.setValue({
fieldId: 'custbody_bw_ordertype',
value: 2
});
objRecord.setValue({
fieldId: 'department',
value: 35
});
for (var k = 0; k < itemId.length; k++) {
objRecord.selectNewLine({
sublistId: 'item'
});
objRecord.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'item',
value: itemId[k],
ignoreFieldChange: false
});
objRecord.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'quantity',
value: itemQuantity[k],
ignoreFieldChange: false
});
objRecord.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'amount',
value: '0',
ignoreFieldChange: false
});
objRecord.commitLine({
sublistId: 'item'
});
}
var recordId = objRecord.save({
enableSourcing: false,
ignoreMandatoryFields: false
});
logme('SOID recordId', recordId);
var objRecord = record.load({
type: record.Type.SALES_ORDER,
id: recordId,
isDynamic: false,
});
var tranid = objRecord.getValue({
fieldId: 'tranid'
})
objRecord.setValue({
fieldId: 'tranid',
value: tranid + '-M'
});
var tranid = objRecord.getValue({
fieldId: 'tranid'
})
var recordId = objRecord.save({
enableSourcing: false,
ignoreMandatoryFields: false
});
context.response.write("Success" + tranid);
} catch (err) {
logme('Error in sales', getError(err));
context.response.write("ERROR" + err.message);
}
}
var remainingUsage = runtime.getCurrentScript()
.getRemainingUsage();
if (remainingUsage < 200) {
logme("remainingUsage ", remainingUsage);
}
}
return {
onRequest: onRequest
};
});
/*******************************************************************************
* return error
*
* @param e
* @returns
*
* Created on 09-Aug-2017 by rosemol
*/
function getError(e) {
var stErrMsg = '';
if (e.getDetails != undefined) {
stErrMsg = '_' + e.getCode() + '<br>' + e.getDetails() + '<br>' +
e.getStackTrace();
} else {
stErrMsg = '_' + e.toString();
}
return stErrMsg;
}
/*******************************************************************************
* Log these data
*
* @param title
* @param details
* @returns
*
* Created on 09-Aug-2017 by rosemol
*/
function logme(title, details) {
log.debug({
title: title,
details: details
});
}