Jira code: UMAR-27
The script is for creating the NetSuite Quotation record. This script will trigger on a button click. Once the Quote record created successfully, a response will send back to the triggering point.
Suitelet
/**
* @NApiVersion 2.x
* @NScriptType Suitelet
* @NModuleScope SameAccount
*/
/**
* Script Description: This script for Creating the Quotation From Purchase requisition
*/
/*******************************************************************************
* * UMAR WSR * *
* **************************************************************************
* Date:13/2/18
* Script name: NetU SL Create SQ
* Script id: customscript_netu_sl_create_sq
* Deployment id: customdeploy_netu_sl_create_sq
* REvised on 21/4/18 for setting sales values
* REvised on 26/5/18 for Improving performance
* before changing code for new req of discount
******************************************************************************/
define(['N/record', 'N/search', 'N/url', 'N/https', 'N/error', 'N/currency', 'N/redirect', 'N/format'],
function(record, search, url, https, e, currency, redirect, format) {
/**
* Definition of the Suitelet script trigger point.
*
* @param {Object} context
* @param {ServerRquest} context.request - Encapsulation of the incoming request
* @param {ServerResponse} context.response - Encapsulation of the Suitelet response
* @Since 2015.2
*/
var startTime, endTime;
function StartCalculating() {
startTime = new Date();
}
function EndCalulatingAndPrintElapsedTime(message) {
endTime = new Date();
var timeDiff = endTime - startTime;
// timeDiff /= 1000;
// var seconds = Math.round(timeDiff);
log.debug({
title: message,
details: timeDiff
});
}
function onRequest(context) {
try {
var prId = context.request.parameters.requisitionId;
StartCalculating();
var customrecord_netu_purchase_requisitionSearchObj = search.create({
type: "customrecord_netu_purchase_requisition",
filters: [
["id", "equalto", prId]
],
columns: [
search.createColumn({
name: "name",
sort: search.Sort.ASC,
label: "ID"
}),
search.createColumn({ name: "custrecord_netu_req_customer", label: "Customer" }),
search.createColumn({ name: "custrecord_netu_sub_job_number", label: "Sub-Job Number" }),
search.createColumn({ name: "custrecord_netu_pur_req_main_job", label: "Our Reference (Main Job)" }),
search.createColumn({ name: "custrecord_netu_req_currency_code", label: "Currency" }),
search.createColumn({ name: "custrecord_netu_req_class", label: "Class" }),
search.createColumn({ name: "custrecord_netu_req_vessel", label: "Vessel" }),
search.createColumn({ name: "custrecord_netu_req_department", label: "Department" }),
search.createColumn({ name: "custrecord_netu_req_location", label: "Location" }),
search.createColumn({ name: "custrecord_netu_req_gross_amount", label: "Gross Amount (Txn Currency)" }),
search.createColumn({ name: "custrecord_netu_req_discount_amount", label: "Discount Amount (Txn Currency)" }),
search.createColumn({ name: "custrecord_netu_req_commission_amount", label: "Commission Amount (Txn Currency)" }),
search.createColumn({ name: "custrecord_netu_req_net_amount", label: "Net Amount (Txn Currency)" }),
search.createColumn({ name: "custrecord_netu_req_vendor_discount_perc", label: "Vendor Discount %" }),
search.createColumn({ name: "custrecord_netu_req_vendor_comm_perc", label: "Vendor Commission %" }),
search.createColumn({ name: "custrecord_netu_req_scale_commission", label: "Scale Commission" }),
search.createColumn({ name: "custrecord_netu_req_sub_status", label: "Sub-Job Type" }),
search.createColumn({ name: "custrecord_netu_req_vessel_tba", label: "Vessel TBA" }),
search.createColumn({ name: "custrecord45", label: "ETA"})
]
});
var prResultCount = customrecord_netu_purchase_requisitionSearchObj.runPaged().count;
EndCalulatingAndPrintElapsedTime("Running The Purchase requistion search ");
var mainFieldValue = [];
var calcValue = [];
var sbTypeRQ = null;
if (prResultCount > 0) {
StartCalculating();
var prDetailsResults = customrecord_netu_purchase_requisitionSearchObj.run().getRange({
start: 0,
end: 1
});
EndCalulatingAndPrintElapsedTime("Runinng the get range prurchase requistion 2")
StartCalculating();
var mainField = ['custrecord_netu_req_customer', 'custrecord_netu_req_currency_code',
'custrecord_netu_pur_req_main_job', 'custrecord_netu_sub_job_number',
'custrecord_netu_req_vessel', 'custrecord_netu_req_class',
'custrecord_netu_req_department', 'custrecord_netu_req_location'
];
var mainFieldTitle = ['Customer', 'Currency',
'Main Job', 'Sub Job',
'Vessel', 'Class',
'Department', 'Location'
];
for (var k = 0; k < 8; k++) {
mainFieldValue[k] = prDetailsResults[0].getValue({
name: mainField[k]
})
if ((mainFieldValue[k] == null) || (mainFieldValue[k] == "") || (mainFieldValue[k] == undefined)) {
context.response.write(JSON.stringify('Missing the value for: ' + mainFieldTitle[k]));
return false;
}
}
vesselTba = prDetailsResults[0].getValue({
name: 'custrecord_netu_req_vessel_tba'
})
etaDate = prDetailsResults[0].getValue({
name: 'custrecord45'
})
EndCalulatingAndPrintElapsedTime("Filling the purchase requistion result in mainFieldValue Array");
StartCalculating();
//Creating Quotation Record
var rec = record.create({
type: record.Type.ESTIMATE,
isDynamic: true,
defaultValues: {
//entity: mainFieldValue[0],
}
});
try {
rec.setValue({
fieldId: 'entity',
value: mainFieldValue[0]
});
rec.setValue({
fieldId: 'currency',
value: mainFieldValue[1]
});
} catch (e) {
context.response.write(JSON.stringify('Invalid Currency for the Customer'));
return false;
}
rec.setValue({
fieldId: 'custbody_netu_purchase_requisition',
value: prId
});
rec.setValue({
fieldId: 'custbody_netu_subjob_status',
value: '5'
});
rec.setValue({
fieldId: 'custbody_delivery_terms',
value: '1'
});
rec.setValue({
fieldId: 'custbody_netu_vessel_tba',
value: vesselTba
});
if(etaDate)
{
etaDate = new Date(etaDate);
log.debug('etaDate',etaDate);
rec.setValue({
fieldId: 'custbody_netu_eta_date',
value: etaDate
});
}
//setting the field values in Quotation
var quoteMainField = ['custrecord_netu_req_customer', 'custrecord_netu_req_currency_code',
'custbody_netu_main_job', 'custbody_netu_subjob',
'custbody_netu_vessel', 'class',
'department', 'location'
];
for (var k = 2; k < 8; k++) {
rec.setValue({
fieldId: quoteMainField[k],
value: mainFieldValue[k]
});
}
var calcField = ['custrecord_netu_req_gross_amount', 'custrecord_netu_req_gross_amount',
'custrecord_netu_req_discount_amount', 'custrecord_netu_req_commission_amount',
'custrecord_netu_req_net_amount', 'custrecord_netu_req_net_amount', 'custrecord_netu_req_scale_commission'
];
var quoteCalcField = ['custbody_netu_cost_gross_amount', 'custbody_netu_sales_gross_amount',
'custbody_netu_cost_discount_amount', 'custbody_netu_cost_commission_amount',
'custbody_netu_cost_net_amount', 'custbody_netu_cost_net_amnt_charges', 'custbody_netu_scale_commission'
];
for (var k = 0; k < 7; k++) {
calcValue[k] = prDetailsResults[0].getValue({
name: calcField[k]
})
rec.setValue({
fieldId: quoteCalcField[k],
value: calcValue[k]
});
}
EndCalulatingAndPrintElapsedTime("Creating The Quotation record and setting its value ");
StartCalculating();
var commPer = null,
discPer = null;
var commission1 = prDetailsResults[0].getValue({
name: 'custrecord_netu_req_vendor_comm_perc'
})
if ((commission1 != "") && (commission1 != null) && (commission1 != undefined)) {
var commission2 = commission1.split("%");
commPer = commission2[0];
}
var discount1 = prDetailsResults[0].getValue({
name: 'custrecord_netu_req_vendor_discount_perc'
})
if ((discount1 != "") && (discount1 != null) && (discount1 != undefined)) {
var discount2 = discount1.split("%");
discPer = discount2[0];
}
rec.setValue({
fieldId: 'custbody_netu_v_commission_perc',
value: commPer
});
rec.setValue({
fieldId: 'custbody_netu_v_discount_perc',
value: discPer
});
EndCalulatingAndPrintElapsedTime("Extracting comission and discount percentage and setting its values in Quatation record");
StartCalculating();
//finding the discount percentage from customer record.
var custDis = search.lookupFields({
type: search.Type.CUSTOMER,
id: mainFieldValue[0],
columns: ['custentity_netu_cust_discount_per']
});
var custid = custDis.custentity_netu_cust_discount_per;
if ((custid == "") || (custid == null) || (custid == undefined)) {
custpercentage = 0;
} else {
var custper = custid.split("%");
custpercentage = custper[0];
}
//calculating the sales values
log.debug({
title: "Customer Percentage that is undefined",
details: custpercentage
})
var afterDiscAmnt = (parseFloat(calcValue[0]) * custpercentage) / 100;
var netAmnt = parseFloat(calcValue[0]) - afterDiscAmnt;
var profit = parseFloat(netAmnt) - parseFloat(calcValue[4]);
var profitPer = (profit / parseFloat(netAmnt)) * 100;
//setting sales values
rec.setValue({
fieldId: 'custbody_netu_c_discount_perc',
value: custpercentage
});
rec.setValue({
fieldId: 'custbody_netu_sales_discount_amount',
value: afterDiscAmnt
});
rec.setValue({
fieldId: 'custbody_netu_sales_net_amount',
value: netAmnt
});
rec.setValue({
fieldId: 'custbody_netu_sales_net_amnt_charges',
value: netAmnt
});
rec.setValue({
fieldId: 'custbody_netu_profit_amount',
value: profit
});
rec.setValue({
fieldId: 'custbody_netu_profit_perc',
value: profitPer
});
sbTypeRQ = prDetailsResults[0].getValue({
name: 'custrecord_netu_req_sub_status'
})
EndCalulatingAndPrintElapsedTime("Getting the customer record to look for his/her percentage, Calulating the discount, amount, profit, profit percentage and adding them to quatation record");
}
StartCalculating();
var customrecord_netu_pur_req_item_linesSearchObj = search.create({
type: "customrecord_netu_pur_req_item_lines",
filters: [
["custrecord_netu_pur_req_id", "anyof", prId]
],
columns: [
search.createColumn({
name: "id",
sort: search.Sort.ASC,
label: "ID"
}),
search.createColumn({ name: "custrecord_netu_pur_req_partdescription", label: "Part Description" }),
search.createColumn({ name: "custrecord_netu_pur_req_partnumber", label: "Part Number" }),
search.createColumn({ name: "custrecord_netu_quantity", label: "Quantity" }),
search.createColumn({ name: "custrecord_netu_pur_req_units", label: "Units" }),
search.createColumn({ name: "custrecord_netu_pur_req_price", label: "Price" }),
search.createColumn({ name: "custrecord_netu_pur_req_gross_amount", label: "Gross Amount" }),
search.createColumn({ name: "custrecord_netu_pur_req_item_code", label: "Item Code" })
]
});
var prItemLineResultCount = customrecord_netu_pur_req_item_linesSearchObj.runPaged().count;
EndCalulatingAndPrintElapsedTime("Search for Purchase requisiton item lines")
StartCalculating();
var itemDtls = [];
if (prItemLineResultCount > 0) {
var col = ['custrecord_netu_pur_req_item_code', 'custrecord_netu_pur_req_partdescription', 'custrecord_netu_pur_req_partnumber',
'custrecord_netu_quantity', 'custrecord_netu_pur_req_price',
'custrecord_netu_pur_req_price', 'custrecord_netu_pur_req_price', 'custrecord_netu_pur_req_gross_amount',
'custrecord_netu_pur_req_gross_amount', 'custrecord_netu_pur_req_gross_amount', 'custrecord_netu_pur_req_price'
];
var setCol = ['item', 'description', 'custcol_netu_part_number',
'quantity', 'rate',
'custcol_netu_purch_price', 'custcol_netu_selling_price', 'grossamt',
'custcol_netu_purch_gross_amount', 'custcol_netu_selling_gross', 'custcol_netu_actual_cost_price'
];
var itemLineResults = customrecord_netu_pur_req_item_linesSearchObj.run().getRange({
start: 0,
end: 1000
});
for (var k = 0; k < prItemLineResultCount; k++) {
rec.selectNewLine({
sublistId: 'item'
});
for (var j = 0; j < 11; j++) {
itemDtls[j] = itemLineResults[k].getValue({
name: col[j]
});
if (j == 5) {
if ((itemDtls[5] == null) || (itemDtls[5] == "") || (itemDtls[5] == undefined)) {
context.response.write(JSON.stringify('Please Enter Item Line Price'));
return false;
}
}
rec.setCurrentSublistValue({
sublistId: 'item',
fieldId: setCol[j],
value: itemDtls[j]
});
}
rec.setCurrentSublistValue({
sublistId: 'item',
fieldId: 'custcol_netu_item_id',
value: "" + k + ""
});
rec.setCurrentSublistText({
sublistId: 'item',
fieldId: 'custcol_netu_optional_addi_free',
text: 'Normal'
});
rec.commitLine({
sublistId: 'item'
});
}
}
EndCalulatingAndPrintElapsedTime("Setting all sublist item values and fill them");
StartCalculating();
var recordId = rec.save({
enableSourcing: true,
ignoreMandatoryFields: false
});
log.debug('saved');
record.submitFields({
type: record.Type.ESTIMATE,
id: recordId,
values: {
'custbody_netu_quotation_number': recordId,
'custbody_netu_subjob_status': '5'
}
});
log.debug('submitted');
if (recordId != null) {
//Change the Sub-job status field value to Quotation
var reqRecId = record.submitFields({
type: 'customrecord_netu_purchase_requisition',
id: prId,
values: {
'custrecord_netu_req_sub_job_status': '5'
}
});
//Change the Sub-job status to Quotation in the Sub-job record
record.submitFields({
type: 'customrecord_netu_sub_job',
id: mainFieldValue[3],
values: {
custrecord_netu_subjob_status: '5'
},
options: {
enableSourcing: false,
ignoreMandatoryFields: true
}
});
var subjobSt = search.lookupFields({
type: 'customrecord_netu_sub_job',
id: mainFieldValue[3],
columns: ['custrecord_netu_subjob_type']
});
var sbType = null;
if (subjobSt.custrecord_netu_subjob_type != null) {
sbType = subjobSt.custrecord_netu_subjob_type[0].value;
}
//Checking whether the sub job type changed. If so coping the Items from the main job
if (sbType != sbTypeRQ) {
log.debug("SubJob Type has been changed.")
//Setting the url of the suitelet script that coping items
var output = url.resolveScript({
scriptId: 'customscript_netu_sl_item_copy',
deploymentId: 'customdeploy_netu_sl_item_copy',
returnExternalUrl: true,
}) + '&subJobId=' + mainFieldValue[3] + '&jobType=' + sbTypeRQ + '&subjobType=' + sbType + '"eId=' + recordId + '&prId='
prId;
log.debug({
title: 'SL:',
details: output
});
https.get({
url: output
});
}
}
redirect.toRecord({
type: record.Type.ESTIMATE,
id: recordId,
isEditMode: true
});
EndCalulatingAndPrintElapsedTime("Saving The record");
} catch (e) {
context.response.write(JSON.stringify(e.message));
log.debug({
title: e.name,
details: e.message
});
}
}
return {
onRequest: onRequest
};
});