Suitelet for Creating Quotation

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 + '&quoteId=' + 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
        };

    });

Leave a comment

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