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