Re-occurring Reports

Jira Code : BTN-208

Send an email to every customer about their back ordered items each month.
Send a consolidated email to each sales rep regarding the
back ordered items of their customer.
A CSV file will be attached with each email

/**
 * @NApiVersion 2.x
 * @NScriptType ScheduledScript
 * @NModuleScope SameAccount
 */
/**
 * Script Description
 * To send consolidated email report to sales Rep,Super Admin with details about sales order,invoice, qty ordered,
 * qty back ordered,customer details,item details etc..
 * Created on 08-March-2018
 */
/*******************************************************************************
 * * Balaji Trading Network  | BTN-208 *
 * **************************************************************************
 * 
 * 
 * Author: Jobin & Jismi IT Services LLP
 * 
 * REVISION HISTORY
 * 
 * 
 ******************************************************************************/

/**
 *	SCRIPT ID : { Name :  BTN-208 JJ SS Consolidated Email Re-occu , ID : customscript_btn_208_jj_ss_consolidate_e}
 *
 *	DEPLOYMENT : { Title : BTN-208 JJ SS Consolidated Email Re-occu , ID : customdeploy_btn_208_jj_ss_consolidate_e}
 *
 *
 */
define(['N/email', 'N/file', 'N/http', 'N/https', 'N/record', 'N/runtime', 'N/search', 'N/task', 'N/xml', 'SuiteScripts/customModule/moment'],
    /**
     * @param {email} email
     * @param {file} file
     * @param {http} http
     * @param {https} https
     * @param {record} record
     * @param {runtime} runtime
     * @param {search} search
     * @param {task} task
     * @param {xml} xml
     * @param {moment} moment
     */
    function (email, file, http, https, record, runtime, search, task, xml, moment) {

        /**
         * Definition of the Scheduled script trigger point.
         *
         * @param {Object} scriptContext
         * @param {string} scriptContext.type - The context in which the script is executed. It is one of the values from the scriptContext.InvocationType enum.
         * @Since 2015.2
         */
        function executeConsolidatedReport(scriptContext) {
            var currentDate = new Date();
            logme('EXECUTION STARTS', 'EXECUTION BEGINS AT ' + (currentDate.toUTCString()));
            try {
                var remainingUsage = runtime.getCurrentScript().getRemainingUsage();

                var lineRep = new Object();
                var lineRepID = new Object();
                var lineRepName = new Object();
                var lineCompanyName = new Object();
                var lineOrderDate = new Object();
                var lineOrder_Po = new Object();
                var lineInvoice = new Object();
                var lineBrand = new Object();
                //var lineSku_Upc = new Object();
                var lineSKU = new Object();
                var lineUPC = new Object();
                var lineItemTitle = new Object();
                var lineQtyOrder = new Object();
                var lineQtyBackOrder = new Object();

                var currentRepID;
                var templineCompanyName, templineOrderDate, templineOrder_Po, templineInvoice, templineBrand, templineSKU, templineUPC, templineItemTitle, templineQtyOrder, templineQtyBackOrder;

                var salesorderSearchObj = search.create({
                    type: "salesorder",
                    filters: [
                      ["type", "anyof", "SalesOrd"],
                      "AND",
                      ["formulanumeric: {quantity}-nvl({quantityshiprecv},0)-nvl({quantitycommitted},0)", "greaterthan", "0"],
                      "AND",
                      //["status", "anyof", "SalesOrd:B", "SalesOrd:E", "SalesOrd:D"],
                      ["billingtransaction.status", "anyof", "CustInvc:A", "CustInvc:B", "CustInvc:D", "CustInvc:E", "CustInvc:V"],
                      "AND",
                      ["datecreated","onorafter","startofthisbusinessweek"], 
                      "AND",
                      ["taxline", "is", "F"],
                      "AND",
                      ["shipping", "is", "F"]
                    ],
                    columns: [
                      search.createColumn({
                            name: "salesrep",
                            join: "customer",
                            sort: search.Sort.ASC
                        }),
                      "internalid",
                      "line",
                      search.createColumn({
                            name: "internalid",
                            join: "customer",
                            sort: search.Sort.ASC
                        }),
                      search.createColumn({
                            name: "entityid",
                            join: "customer"
                        }),
                      "datecreated",
                      "tranid",
                      "otherrefnum",
                      "billingtransaction",
                      "custcol4",
                      search.createColumn({
                            name: "upccode",
                            join: "item"
                        }),
                      "custcol1",
                      search.createColumn({
                            name: "custitem6",
                            join: "item"
                        }),
                      "quantity",
                      search.createColumn({
                            name: "formulanumeric",
                            formula: "{quantity}-nvl({quantityshiprecv},0)-nvl({quantitycommitted},0)"
                        }),
                        search.createColumn({
                            name: "companyname",
                            join: "customer"
                        })
                    ]
                }).run().each(function (result) {
                    currentRepID = result.getValue({
                        name: "salesrep",
                        join: "customer"
                    });
                    currentRepID = (currentRepID.toString()).trim();
                    currentRepID = parseInt(currentRepID);
                    if (!checkForParameter(currentRepID, 'currentRepID')) {
                        //currentRepID is key to the objects, if there is no currentRepID,then skip this(current) iteration
                        return true;
                    }

                    if (typeof (lineRep[currentRepID]) == 'undefined' || lineRep[currentRepID] !== true) {
                        //if objects with key currentRepID doesn't exist -> first entry
                        lineRep[currentRepID] = true;
                        lineRepID[currentRepID] = currentRepID;

                        lineRepName[currentRepID] = [result.getText({
                            name: "salesrep",
                            join: "customer"
                        })];
                        (lineRepName[currentRepID])[0] = (checkForParameter((lineRepName[currentRepID])[0], '(lineRepName[currentRepID])[0]') ? (lineRepName[currentRepID])[0] : ' ');

                        lineCompanyName[currentRepID] = [result.getValue({
                            name: "companyname",
                            join: "customer"
                        })];
                        (lineCompanyName[currentRepID])[0] = (checkForParameter((lineCompanyName[currentRepID])[0], '(lineCompanyName[currentRepID])[0]') ? (lineCompanyName[currentRepID])[0] : ' ');

                        lineOrderDate[currentRepID] = [result.getValue({
                            name: "datecreated"
                        })];
                        (lineOrderDate[currentRepID])[0] = (checkForParameter((lineOrderDate[currentRepID])[0], '(lineOrderDate[currentRepID])[0]') ? (lineOrderDate[currentRepID])[0] : ' ');

                        lineOrder_Po[currentRepID] = [result.getValue({
                            name: "tranid"
                        }) + '/' + result.getValue({
                            name: "otherrefnum"
                        })];
                        (lineOrder_Po[currentRepID])[0] = (checkForParameter((lineOrder_Po[currentRepID])[0], '(lineOrder_Po[currentRepID])[0]') ? (lineOrder_Po[currentRepID])[0] : ' ');

                        lineInvoice[currentRepID] = [result.getText({
                            name: "billingtransaction"
                        })];
                        (lineInvoice[currentRepID])[0] = (checkForParameter((lineInvoice[currentRepID])[0], '(lineInvoice[currentRepID])[0]') ? ((lineInvoice[currentRepID])[0]).split('#')[1] : ' ');

                        lineBrand[currentRepID] = [result.getValue({
                            name: "custcol4"
                        })];
                        (lineBrand[currentRepID])[0] = (checkForParameter((lineBrand[currentRepID])[0], '(lineBrand[currentRepID])[0]') ? (lineBrand[currentRepID])[0] : ' ');

                        lineSKU[currentRepID] = [result.getValue({
                            name: "custcol1"
                        })];
                        (lineSKU[currentRepID])[0] = (checkForParameter((lineSKU[currentRepID])[0], '(lineSKU[currentRepID])[0]') ? (lineSKU[currentRepID])[0] : ' ');

                        lineUPC[currentRepID] = [result.getValue({
                            name: "upccode",
                            join: "item"
                        })];
                        (lineUPC[currentRepID])[0] = (checkForParameter((lineUPC[currentRepID])[0], '(lineUPC[currentRepID])[0]') ? (lineUPC[currentRepID])[0] : ' ');

                        lineItemTitle[currentRepID] = [result.getValue({
                            name: "custitem6",
                            join: "item"
                        })];
                        (lineItemTitle[currentRepID])[0] = (checkForParameter((lineItemTitle[currentRepID])[0], '(lineItemTitle[currentRepID])[0]') ? (lineItemTitle[currentRepID])[0] : ' ');

                        lineQtyOrder[currentRepID] = [result.getValue({
                            name: "quantity"
                        })];
                        (lineQtyOrder[currentRepID])[0] = (checkForParameter((lineQtyOrder[currentRepID])[0], '(lineQtyOrder[currentRepID])[0]') ? (lineQtyOrder[currentRepID])[0] : ' ');

                        lineQtyBackOrder[currentRepID] = [result.getValue({
                            name: "formulanumeric",
                            formula: "{quantity}-nvl({quantityshiprecv},0)-nvl({quantitycommitted},0)"
                        })];
                        (lineQtyBackOrder[currentRepID])[0] = (checkForParameter((lineQtyBackOrder[currentRepID])[0], '(lineQtyBackOrder[currentRepID])[0]') ? (lineQtyBackOrder[currentRepID])[0] : ' ');

                    } else {
                        //if objects with key currentRepID exist -> Duplicate
                        templineCompanyName = result.getValue({
                            name: "companyname",
                            join: "customer"
                        });
                        templineCompanyName = (checkForParameter(templineCompanyName, 'templineCompanyName') ? templineCompanyName : ' ');

                        templineOrderDate = result.getValue({
                            name: "datecreated"
                        });
                        templineOrderDate = (checkForParameter(templineOrderDate, 'templineOrderDate') ? templineOrderDate : ' ');

                        templineOrder_Po = result.getValue({
                            name: "tranid"
                        }) + '/' + result.getValue({
                            name: "otherrefnum"
                        });
                        templineOrder_Po = (checkForParameter(templineOrder_Po, 'templineOrder_Po') ? templineOrder_Po : ' ');

                        templineInvoice = result.getText({
                            name: "billingtransaction"
                        });
                        templineInvoice = (checkForParameter(templineInvoice, 'templineInvoice') ? templineInvoice.split('#')[1] : ' ');

                        templineBrand = result.getValue({
                            name: "custcol4"
                        });
                        templineBrand = (checkForParameter(templineBrand, 'templineBrand') ? templineBrand : ' ');

                        templineSKU = result.getValue({
                            name: "custcol1"
                        });
                        templineSKU = (checkForParameter(templineSKU, 'templineSKU') ? templineSKU : ' ');

                        templineUPC = result.getValue({
                            name: "upccode",
                            join: "item"
                        });
                        templineUPC = (checkForParameter(templineUPC, 'templineUPC') ? templineUPC : ' ');

                        templineItemTitle = result.getValue({
                            name: "custitem6",
                            join: "item"
                        });
                        templineItemTitle = (checkForParameter(templineItemTitle, 'templineItemTitle') ? templineItemTitle : ' ');

                        templineQtyOrder = result.getValue({
                            name: "quantity"
                        });
                        templineQtyOrder = (checkForParameter(templineQtyOrder, 'templineQtyOrder') ? templineQtyOrder : ' ');

                        templineQtyBackOrder = result.getValue({
                            name: "formulanumeric",
                            formula: "{quantity}-nvl({quantityshiprecv},0)-nvl({quantitycommitted},0)"
                        });
                        templineQtyBackOrder = (checkForParameter(templineQtyBackOrder, 'templineQtyBackOrder') ? templineQtyBackOrder : ' ');

                        (lineCompanyName[currentRepID]).push(templineCompanyName);
                        (lineOrderDate[currentRepID]).push(templineOrderDate);
                        (lineOrder_Po[currentRepID]).push(templineOrder_Po);
                        (lineInvoice[currentRepID]).push(templineInvoice);
                        (lineBrand[currentRepID]).push(templineBrand);
                        (lineSKU[currentRepID]).push(templineSKU);
                        (lineUPC[currentRepID]).push(templineUPC);
                        (lineItemTitle[currentRepID]).push(templineItemTitle);
                        (lineQtyOrder[currentRepID]).push(templineQtyOrder);
                        (lineQtyBackOrder[currentRepID]).push(templineQtyBackOrder);
                    }
                    return true;
                });

                var SCRIPT_RERUN_FLAG = false;
                var arrayIndex = 0;
                var waitForResponse;
                var currentLimitJSON, currentLimitFile, fileID, FILE_EXISTS = false;
                try {
                    //If file exists,then arrayIndex exits
                    currentLimitFile = file.load({
                        id: 'BTN-208 Re-occurring Reports/Sales Rep/currentLimit.json'
                    });
                    currentLimitJSON = currentLimitFile.getContents();
                    currentLimitJSON = JSON.parse(currentLimitJSON);
                    arrayIndex = parseInt(currentLimitJSON.arrayIndex);
                    FILE_EXISTS = true;
                    logme('EXISTS currentLimit.json', 'Executing the remiander');
                } catch (err) {
                    //If file doesn't exists,then arrayIndex is 0
                    arrayIndex = 0;
                    FILE_EXISTS = false;
                    logme('NO currentLimit.json', 'Executing for first time');
                }


                /*
                Creating JSON object so that we can convert it to CSV
                */
                // headers for csv
                var headers = {
                    header_1: 'Company Name',
                    header_2: 'Order Date',
                    header_3: 'Order/PO',
                    header_4: 'Invoice #',
                    header_5: 'Brand',
                    header_6: 'SKU',
                    header_7: 'UPC',
                    header_8: 'Item Title',
                    header_9: 'Qty Ordered',
                    header_10: 'Qty Backordered'
                };
                var itemsFormatted_Array = new Array();
                var itemsFormatted_Object = new Object();
                var fileTitle_Object = new Object();
                var fileObj;
                var currentAgent, currentLine;
                var BACK_ORDERED_FLAG = false;

                //to send email to sales rep, create JSON content for each sales rep
                for (currentAgent = 0; currentAgent < Object.keys(lineRepID).length; currentAgent++) {
                    itemsFormatted_Array.push(headers);
                    for (currentLine = 0; currentLine < lineOrderDate[Object.keys(lineRepID)[currentAgent]].length; currentLine++) {
                        BACK_ORDERED_FLAG = true;
                        itemsFormatted_Array.push({
                            header_1: ((lineCompanyName[Object.keys(lineRepID)[currentAgent]])[currentLine]).replace(/,/g, '%2C').replace(/"/g, '%22').replace(/'/g, '%27').replace(/\n/g, '%0A'),
                            header_2: ((lineOrderDate[Object.keys(lineRepID)[currentAgent]])[currentLine]).replace(/,/g, '%2C').replace(/"/g, '%22').replace(/'/g, '%27').replace(/\n/g, '%0A'),
                            header_3: (lineOrder_Po[Object.keys(lineRepID)[currentAgent]])[currentLine],
                            header_4: (lineInvoice[Object.keys(lineRepID)[currentAgent]])[currentLine],
                            header_5: (lineBrand[Object.keys(lineRepID)[currentAgent]])[currentLine],
                            header_6: (lineSKU[Object.keys(lineRepID)[currentAgent]])[currentLine],
                            header_7: (lineUPC[Object.keys(lineRepID)[currentAgent]])[currentLine],
                            header_8: (((lineItemTitle[Object.keys(lineRepID)[currentAgent]])[currentLine]).replace(/,/g, '%2C').replace(/"/g, '%22').replace(/'/g, '%27').replace(/\n/g, '%0A')).toString(),
                            header_9: (lineQtyOrder[Object.keys(lineRepID)[currentAgent]])[currentLine],
                            header_10: (lineQtyBackOrder[Object.keys(lineRepID)[currentAgent]])[currentLine]
                        });
                    }
                    itemsFormatted_Object[Object.keys(lineRepID)[currentAgent]] = itemsFormatted_Array;
                    fileTitle_Object[Object.keys(lineRepID)[currentAgent]] = lineRepName[Object.keys(lineRepID)[currentAgent]];
                    itemsFormatted_Array = undefined;
                    itemsFormatted_Array = new Array();
                }

                //to send email for each Sales Rep
                for (var i = arrayIndex; i < Object.keys(lineRepID).length; i++) {
                    remainingUsage = runtime.getCurrentScript().getRemainingUsage();
                    if (parseInt(remainingUsage) < 1200) {
                        //to reschedule
                        SCRIPT_RERUN_FLAG = true;
                        arrayIndex = i;
                        currentLimitJSON = {
                            arrayIndex: arrayIndex
                        };
                        // save a json file to file cabinet with the current arrayIndex (so that we know where to begin when script reschedules)
                        currentLimitFile = file.create({
                            name: 'currentLimit.json',
                            fileType: file.Type.JSON,
                            contents: JSON.stringify(currentLimitJSON),
                            encoding: file.Encoding.UTF8,
                            isInactive: true,
                            folder: 9335 // 9335 : BTN-208 Re-occurring Reports > Sales Rep
                        });
                        fileID = currentLimitFile.save();
                        FILE_EXISTS = true;
                        break;
                    }
                    fileObj = exportCSVFile(headers, itemsFormatted_Object[lineRepID[Object.keys(lineRepID)[i]]], fileTitle_Object[lineRepID[Object.keys(lineRepID)[i]]]);

                    waitForResponse = createEmailTemplate_SalesRep(lineRepID[Object.keys(lineRepID)[i]], lineRepName[Object.keys(lineRepID)[i]], lineCompanyName[Object.keys(lineRepID)[i]], lineOrderDate[Object.keys(lineRepID)[i]], lineOrder_Po[Object.keys(lineRepID)[i]], lineInvoice[Object.keys(lineRepID)[i]], lineBrand[Object.keys(lineRepID)[i]], lineSKU[Object.keys(lineRepID)[i]], lineUPC[Object.keys(lineRepID)[i]], lineItemTitle[Object.keys(lineRepID)[i]], lineQtyOrder[Object.keys(lineRepID)[i]], lineQtyBackOrder[Object.keys(lineRepID)[i]], fileObj);

                    logme("SEND Sales Rep EMAIL : index,salesRep,waitForResponse", i + "," + lineRepName[Object.keys(lineRepName)[i]] + "," + waitForResponse);

                    if (FILE_EXISTS && (i == ((Object.keys(lineQtyBackOrder).length) - 1))) {
                        //to delete file in file cabibet
                        file.delete({
                            id: currentLimitFile.id
                        });
                    }
                }

                //to send email for super admin, create the JSON content
                itemsFormatted_Array = undefined;
                itemsFormatted_Array = new Array();
                itemsFormatted_Array.push(headers);
                for (currentAgent = 0; currentAgent < Object.keys(lineRepID).length; currentAgent++) {
                    for (currentLine = 0; currentLine < lineOrderDate[Object.keys(lineRepID)[currentAgent]].length; currentLine++) {
                        BACK_ORDERED_FLAG = true;
                        itemsFormatted_Array.push({
                            header_1: ((lineCompanyName[Object.keys(lineRepID)[currentAgent]])[currentLine]).replace(/,/g, '%2C').replace(/"/g, '%22').replace(/'/g, '%27').replace(/\n/g, '%0A'),
                            header_2: ((lineOrderDate[Object.keys(lineRepID)[currentAgent]])[currentLine]).replace(/,/g, '%2C').replace(/"/g, '%22').replace(/'/g, '%27').replace(/\n/g, '%0A'),
                            header_3: (lineOrder_Po[Object.keys(lineRepID)[currentAgent]])[currentLine],
                            header_4: (lineInvoice[Object.keys(lineRepID)[currentAgent]])[currentLine],
                            header_5: (lineBrand[Object.keys(lineRepID)[currentAgent]])[currentLine],
                            header_6: (lineSKU[Object.keys(lineRepID)[currentAgent]])[currentLine],
                            header_7: (lineUPC[Object.keys(lineRepID)[currentAgent]])[currentLine],
                            header_8: (((lineItemTitle[Object.keys(lineRepID)[currentAgent]])[currentLine]).replace(/,/g, '%2C').replace(/"/g, '%22').replace(/'/g, '%27').replace(/\n/g, '%0A')).toString(),
                            header_9: (lineQtyOrder[Object.keys(lineRepID)[currentAgent]])[currentLine],
                            header_10: (lineQtyBackOrder[Object.keys(lineRepID)[currentAgent]])[currentLine]
                        });
                    }
                }

                if (BACK_ORDERED_FLAG) {
                    fileObj = exportCSVFile(headers, itemsFormatted_Array, '-5_SuperAdmin');
                    //to send email for super admin
                    waitForResponse = createEmailTemplate_Admin(lineRepID['-5'], lineRepName['-5'], itemsFormatted_Array, fileObj);
                    logme("SEND Super Admin EMAIL : superAdmin,waitForResponse", lineRepName['-5'] + "," + waitForResponse);
                }

                //to reschedule(rerun) script again
                if (SCRIPT_RERUN_FLAG) {
                    remainingUsage = runtime.getCurrentScript().getRemainingUsage();
                    logme('remainingUsage', remainingUsage);
                    currentDate = new Date();
                    logme('EXECUTION RESCHEDULED AT ARRAYINDEX ' + arrayIndex, 'EXECUTION RESCHEDULED ON ' + (currentDate.toUTCString()));
                    rescheduleScriptandReturn(arrayIndex);
                }

                currentDate = new Date();
                logme('EXECUTION ENDS', 'EXECUTION ENDS AT ' + (currentDate.toUTCString()));
            } catch (err) {
                currentDate = new Date();
                logme('EXECUTION FAILED', 'EXECUTION THROWS ERROR AT ' + (currentDate.toUTCString()));
                handleTryCatchError(err, 'function executeConsolidatedReport()');
            }
        }

        /* convert json to csv*/
        function convertToCSV(objArray) {
            try {
                var array = ((typeof (objArray) != 'object') ? (JSON.parse(objArray)) : (objArray));
                var str = '';

                for (var i = 0; i < array.length; i++) {
                    var line = '';
                    for (var index in array[i]) {
                        if (line != '') {
                            line += ',';
                        }
                        line += array[i][index];
                    }
                    str += line + '\r\n';
                }
                return str;
            } catch (err) {
                handleTryCatchError(err, 'function convertToCSV()');
            }
        }

        /* Save file in file cabinet as CSV*/
        function exportCSVFile(headers, items, fileTitle) {
            try {
                /* if (headers) {
                     items.unshift(headers);
                 }*/

                // Convert Object to JSON
                var jsonObject = JSON.stringify(items);

                var csvFile = convertToCSV(jsonObject);

                var exportedFilename = (checkForParameter(fileTitle, 'fileTitle') ? (fileTitle + '.csv') : ('export.csv'));

                var fileObj = file.create({
                    name: exportedFilename,
                    fileType: file.Type.CSV,
                    //contents: (csvFile).replace(/%2C/g, '/'),
                    contents: csvFile,
                    encoding: file.Encoding.UTF8,
                    isInactive: true,
                    folder: 9335 // 9335 : BTN-208 Re-occurring Reports > Sales Rep
                });
                //var fileID = fileObj.save();
                return fileObj;
            } catch (err) {
                handleTryCatchError(err, 'function exportCSVFile()');
                return false;
            }
        }

        /*to create email template for Sales Rep*/
        function createEmailTemplate_SalesRep(CUSTOMER_INTERNAL_ID, lineRepName, lineCompanyName, lineOrderDate, lineOrder_Po, lineInvoice, lineBrand, lineSKU, lineUPC, lineItemTitle, lineQtyOrder, lineQtyBackOrder, fileObj) {
            try {
                //var SUBJECT = 'MyCoolCell Back Order Report - ' + (getCurrentDate());
                var SUBJECT = 'Re-occurring Reports Week(' + (moment().startOf('isoWeek').format('L')) + ') for salesRep ' + CUSTOMER_INTERNAL_ID + ' : ' + lineRepName;
                var tableBGFlag = true;
                var waitForResponse;
                var EMAIL_BODY = "";
                EMAIL_BODY += "<br>";
                EMAIL_BODY += "<div><div style=\"overflow-x: auto;\"><div>";
                EMAIL_BODY += "        <table style=\"font-family:arial, sans-serif;border-collapse:collapse;width:100%;\">";
                EMAIL_BODY += "            <thead>";
                EMAIL_BODY += "                <tr>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Company Name<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Order Date<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Order \/ PO #<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Invoice #<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Brand<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">SKU <\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">UPC <\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Item Title<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Qty Ordered<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Qty Backordered<\/th>";
                EMAIL_BODY += "                <\/tr>";
                EMAIL_BODY += "            <\/thead>";
                EMAIL_BODY += "            <tbody>";
                for (var i = 0; i < lineOrderDate.length; i++) {
                    if (tableBGFlag) {
                        EMAIL_BODY += "                <!--FIRST-->";
                        EMAIL_BODY += "                <tr>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineCompanyName[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineOrderDate[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineOrder_Po[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineInvoice[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineBrand[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineSKU[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineUPC[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineItemTitle[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineQtyOrder[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineQtyBackOrder[i] + "<\/td>";
                        EMAIL_BODY += "                <\/tr>";
                        tableBGFlag = false;
                    } else {
                        EMAIL_BODY += "                <!--SECOND-->";
                        EMAIL_BODY += "                <tr>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineCompanyName[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineOrderDate[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineOrder_Po[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineInvoice[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineBrand[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineSKU[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineUPC[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineItemTitle[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineQtyOrder[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineQtyBackOrder[i] + "<\/td>";
                        EMAIL_BODY += "                <\/tr>";
                        tableBGFlag = true;
                    }
                }
                EMAIL_BODY += "            <\/tbody>";
                EMAIL_BODY += "        <\/table>";
                EMAIL_BODY += "<\/div><\/div><\/div>";
                waitForResponse = sendConsolidatedEmailReport(CUSTOMER_INTERNAL_ID, SUBJECT, EMAIL_BODY, fileObj);
                return waitForResponse;
            } catch (err) {
                handleTryCatchError(err, 'function createEmailTemplate_SalesRep()');
                return false;
            }
        }

        /*to create email template for super admin*/
        function createEmailTemplate_Admin(CUSTOMER_INTERNAL_ID, lineRepName, itemsFormatted_Array, fileObj) {
            try {
                var SUBJECT = 'Re-occurring Reports Week(' + (moment().startOf('isoWeek').format('L')) + ') for SuperAdmin ' + CUSTOMER_INTERNAL_ID + ' : ' + lineRepName;
                var tableBGFlag = true;
                var waitForResponse;
                var EMAIL_BODY = "";
                EMAIL_BODY += "<br>";
                EMAIL_BODY += "<div><div style=\"overflow-x: auto;\"><div>";
                EMAIL_BODY += "        <table style=\"font-family:arial, sans-serif;border-collapse:collapse;width:100%;\">";
                EMAIL_BODY += "            <thead>";
                EMAIL_BODY += "                <tr>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Company Name<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Order Date<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Order \/ PO #<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Invoice #<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Brand<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">SKU<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">UPC <\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Item Title<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Qty Ordered<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Qty Backordered<\/th>";
                EMAIL_BODY += "                <\/tr>";
                EMAIL_BODY += "            <\/thead>";
                EMAIL_BODY += "            <tbody>";
                for (var i = 1; i < itemsFormatted_Array.length; i++) {
                    if (tableBGFlag) {
                        EMAIL_BODY += "                <!--FIRST-->";
                        EMAIL_BODY += "                <tr>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + itemsFormatted_Array[i].header_1 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + itemsFormatted_Array[i].header_2 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + itemsFormatted_Array[i].header_3 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + itemsFormatted_Array[i].header_4 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + itemsFormatted_Array[i].header_5 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + itemsFormatted_Array[i].header_6 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + itemsFormatted_Array[i].header_7 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + itemsFormatted_Array[i].header_8 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + itemsFormatted_Array[i].header_9 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + itemsFormatted_Array[i].header_10 + "<\/td>";
                        EMAIL_BODY += "                <\/tr>";
                        tableBGFlag = false;
                    } else {
                        EMAIL_BODY += "                <!--SECOND-->";
                        EMAIL_BODY += "                <tr>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + itemsFormatted_Array[i].header_1 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + itemsFormatted_Array[i].header_2 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + itemsFormatted_Array[i].header_3 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + itemsFormatted_Array[i].header_4 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + itemsFormatted_Array[i].header_5 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + itemsFormatted_Array[i].header_6 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + itemsFormatted_Array[i].header_7 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + itemsFormatted_Array[i].header_8 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + itemsFormatted_Array[i].header_9 + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + itemsFormatted_Array[i].header_10 + "<\/td>";
                        EMAIL_BODY += "                <\/tr>";
                        tableBGFlag = true;
                    }
                }
                EMAIL_BODY += "            <\/tbody>";
                EMAIL_BODY += "        <\/table>";
                EMAIL_BODY += "<\/div><\/div><\/div>";
                waitForResponse = sendConsolidatedEmailReport(CUSTOMER_INTERNAL_ID, SUBJECT, EMAIL_BODY, fileObj);
                return waitForResponse;
            } catch (err) {
                handleTryCatchError(err, 'function createEmailTemplate_Admin()');
                return false;
            }
        }

        /*to send email to the customer*/
        function sendConsolidatedEmailReport(CUSTOMER_INTERNAL_ID, SUBJECT, EMAIL_BODY, fileObj) {
            try {
                var senderId = -5; // -5 : albert@mycoolcell.net
                var recipientId = CUSTOMER_INTERNAL_ID;
                email.send({
                    author: senderId,
                    recipients: recipientId,
                    subject: SUBJECT,
                    body: EMAIL_BODY,
                    attachments: [fileObj],
                    relatedRecords: {
                        entityId: recipientId
                    }
                });
                return true;
            } catch (err) {
                handleTryCatchError(err, 'function sendConsolidatedEmailReport()');
                return false;
            }
        }

        /*Try to reschedule script*/
        function rescheduleScriptandReturn(indexParam) {
            try {
                var mrTask = task.create({
                    taskType: task.TaskType.SCHEDULED_SCRIPT,
                    scriptId: "customscript_btn_208_jj_ss_consolidate_e",
                    deploymentId: "customdeploy_btn_208_jj_ss_consolidate_e",
                    params: {
                        arrayIndex: indexParam
                    }
                });
                var scriptTaskId = mrTask.submit();
                logme("rescheduleScriptandReturn_scriptTaskId", scriptTaskId);
            } catch (err) {
                handleTryCatchError(err, 'function rescheduleScriptandReturn()');
            }
        }

        /*To get current Date*/
        function getCurrentDate() {
            //Date format is MM/DD/YYYY
            var currentDate = new Date();
            var currentMonth = currentDate.getMonth() + 1;
            var currentDay = currentDate.getDate();
            var currentYear = currentDate.getFullYear();
            return (currentMonth + '/' + currentDay + '/' + currentYear);
        }

        /*to check for a parameter*/
        function checkForParameter(parameter, parameterName) {
            if (parameter != "" && parameter != null && parameter != undefined && parameter != "undefined" && parameter != " ") {
                return true;
            } else {
                //logme('No ' + parameterName + ' found', 'No ' + parameterName + ' found');
                return false;
            }
        }

        /*to handle 'try' error in try-catch statement*/
        function handleTryCatchError(error, errorLocation) {
            logme('Error on ' + errorLocation, getError(error));
            logme('Error on ' + errorLocation, error.message);
        }

        return {
            execute: executeConsolidatedReport
        };

    });

/*******************************************************************************
 * return error
 * 
 * @param e
 * @returns
 * 
 */
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
 * 
 */
function logme(title, details) {
    log.debug({
        title: title,
        details: details
    });
}
/**
 * @NApiVersion 2.x
 * @NScriptType ScheduledScript
 * @NModuleScope SameAccount
 */
/**
 * Script Description
 * To send consolidated email report to customers with details about sales order,invoice, qty ordered,
 * qty back ordered,item details etc..
 * Created on 08-March-2018
 */
/*******************************************************************************
 * * Balaji Trading Network  | BTN-208 *
 * **************************************************************************
 * 
 * 
 * Author: Jobin & Jismi IT Services LLP
 * 
 * REVISION HISTORY
 * 
 * 
 ******************************************************************************/

/**
 *	SCRIPT ID : { Name :  BTN-208 JJ SS Email Customer Re-occurri , ID : customscript_btn_208_jj_ss_email_custome}
 *
 *	DEPLOYMENT : { Title : BTN-208 JJ SS Email Customer Re-occurri , ID : customdeploy_btn_208_jj_ss_email_custome}
 *
 *
 */
define(['N/email', 'N/file', 'N/http', 'N/https', 'N/record', 'N/runtime', 'N/search', 'N/task', 'N/xml', 'SuiteScripts/customModule/moment'],
    /**
     * @param {email} email
     * @param {file} file
     * @param {http} http
     * @param {https} https
     * @param {record} record
     * @param {runtime} runtime
     * @param {search} search
     * @param {task} task
     * @param {xml} xml
     * @param {moment} moment
     */
    function (email, file, http, https, record, runtime, search, task, xml, moment) {

        /**
         * Definition of the Scheduled script trigger point.
         *
         * @param {Object} scriptContext
         * @param {string} scriptContext.type - The context in which the script is executed. It is one of the values from the scriptContext.InvocationType enum.
         * @Since 2015.2
         */
        function executeCustomerReport(scriptContext) {
            var currentDate = new Date();
            logme('EXECUTION STARTS', 'EXECUTION BEGINS AT ' + (currentDate.toUTCString()));
            try {
                var remainingUsage = runtime.getCurrentScript().getRemainingUsage();

                var lineCustomer = new Object();
                var lineCustomerID = new Object();
                var lineCustomerCCEmailID = new Object();
                var lineCustomerName = new Object();
                var lineCompanyName = new Object();
                var lineOrderDate = new Object();
                var lineOrder_Po = new Object();
                var lineInvoice = new Object();
                var lineBrand = new Object();
                var lineSKU = new Object();
                var lineUPC = new Object();
                var lineItemTitle = new Object();
                var lineQtyOrder = new Object();
                var lineQtyBackOrder = new Object();

                var currentCustomerID;
                var templineCustomerCCEmailID, templineCompanyName, templineOrderDate, templineOrder_Po, templineInvoice, templineBrand, templineSKU, templineUPC, templineItemTitle, templineQtyOrder, templineQtyBackOrder;

                var salesorderSearchObj = search.create({
                    type: "salesorder",
                    filters: [
                      ["type", "anyof", "SalesOrd"],
                      "AND",
                      ["formulanumeric: {quantity}-nvl({quantityshiprecv},0)-nvl({quantitycommitted},0)", "greaterthan", "0"],
                      "AND",
                      //["status", "anyof", "SalesOrd:B", "SalesOrd:E", "SalesOrd:D"],
                      ["billingtransaction.status", "anyof", "CustInvc:A", "CustInvc:B", "CustInvc:D", "CustInvc:E", "CustInvc:V"],
                      "AND",
                      ["datecreated", "onorafter", "startofthisbusinessweek"],
                      "AND",
                      ["taxline", "is", "F"],
                      "AND",
                      ["shipping", "is", "F"]
                    ],
                    columns: [
                      search.createColumn({
                            name: "salesrep",
                            join: "customer",
                            sort: search.Sort.ASC
                        }),
                      "internalid",
                      "line",
                      search.createColumn({
                            name: "internalid",
                            join: "customer",
                            sort: search.Sort.ASC
                        }),
                      search.createColumn({
                            name: "entityid",
                            join: "customer"
                        }),
                      "datecreated",
                      "tranid",
                      "otherrefnum",
                      "billingtransaction",
                      "custcol4",
                      search.createColumn({
                            name: "upccode",
                            join: "item"
                        }),
                      "custcol1",
                      search.createColumn({
                            name: "custitem6",
                            join: "item"
                        }),
                      "quantity",
                      search.createColumn({
                            name: "formulanumeric",
                            formula: "{quantity}-nvl({quantityshiprecv},0)-nvl({quantitycommitted},0)"
                        }),
                        search.createColumn({
                            name: "companyname",
                            join: "customer"
                        }),
                        search.createColumn({
                            name: "email",
                            join: "customer"
                        }),
                        search.createColumn({
                            name: "custentity_bsp_mcc_emailordersto",
                            join: "customer"
                        })
                    ]
                }).run().each(function (result) {
                    currentCustomerID = result.getValue({
                        name: "internalid",
                        join: "customer"
                    });
                    currentCustomerID = (currentCustomerID.toString()).trim();
                    currentCustomerID = parseInt(currentCustomerID);
                    if (!checkForParameter(currentCustomerID, 'currentCustomerID')) {
                        //currentCustomerID is key to the objects, if there is no currentCustomerID,then skip this(current) iteration
                        return true;
                    }

                    if (typeof (lineCustomer[currentCustomerID]) == 'undefined' || lineCustomer[currentCustomerID] != true) {
                        //if objects with key currentCustomerID doesn't exist -> first entry
                        lineCustomer[currentCustomerID] = true;
                        lineCustomerID[currentCustomerID] = currentCustomerID;

                        lineCustomerName[currentCustomerID] = [result.getValue({
                            name: "entityid",
                            join: "customer"
                        })];
                        (lineCustomerName[currentCustomerID])[0] = (checkForParameter((lineCustomerName[currentCustomerID])[0], '(lineCustomerName[currentCustomerID])[0]') ? (lineCustomerName[currentCustomerID])[0] : ' ');

                        lineCompanyName[currentCustomerID] = [result.getValue({
                            name: "companyname",
                            join: "customer"
                        })];
                        (lineCompanyName[currentCustomerID])[0] = (checkForParameter((lineCompanyName[currentCustomerID])[0], '(lineCompanyName[currentCustomerID])[0]') ? (lineCompanyName[currentCustomerID])[0] : ' ');

                        lineOrderDate[currentCustomerID] = [result.getValue({
                            name: "datecreated"
                        })];
                        (lineOrderDate[currentCustomerID])[0] = (checkForParameter((lineOrderDate[currentCustomerID])[0], '(lineOrderDate[currentCustomerID])[0]') ? (lineOrderDate[currentCustomerID])[0] : ' ');

                        lineOrder_Po[currentCustomerID] = [result.getValue({
                            name: "tranid"
                        }) + '/' + result.getValue({
                            name: "otherrefnum"
                        })];
                        (lineOrder_Po[currentCustomerID])[0] = (checkForParameter((lineOrder_Po[currentCustomerID])[0], '(lineOrder_Po[currentCustomerID])[0]') ? (lineOrder_Po[currentCustomerID])[0] : ' ');

                        lineInvoice[currentCustomerID] = [result.getText({
                            name: "billingtransaction"
                        })];
                        (lineInvoice[currentCustomerID])[0] = (checkForParameter((lineInvoice[currentCustomerID])[0], '(lineInvoice[currentCustomerID])[0]') ? ((lineInvoice[currentCustomerID])[0]).split('#')[1] : ' ');

                        lineBrand[currentCustomerID] = [result.getValue({
                            name: "custcol4"
                        })];
                        (lineBrand[currentCustomerID])[0] = (checkForParameter((lineBrand[currentCustomerID])[0], '(lineBrand[currentCustomerID])[0]') ? (lineBrand[currentCustomerID])[0] : ' ');

                        lineSKU[currentCustomerID] = [result.getValue({
                            name: "custcol1"
                        })];
                        (lineSKU[currentCustomerID])[0] = (checkForParameter((lineSKU[currentCustomerID])[0], '(lineSKU[currentCustomerID])[0]') ? (lineSKU[currentCustomerID])[0] : ' ');

                        lineUPC[currentCustomerID] = [result.getValue({
                            name: "upccode",
                            join: "item"
                        })];
                        (lineUPC[currentCustomerID])[0] = (checkForParameter((lineUPC[currentCustomerID])[0], '(lineUPC[currentCustomerID])[0]') ? (lineUPC[currentCustomerID])[0] : ' ');

                        lineItemTitle[currentCustomerID] = [result.getValue({
                            name: "custitem6",
                            join: "item"
                        })];
                        (lineItemTitle[currentCustomerID])[0] = (checkForParameter((lineItemTitle[currentCustomerID])[0], '(lineItemTitle[currentCustomerID])[0]') ? (lineItemTitle[currentCustomerID])[0] : ' ');

                        lineQtyOrder[currentCustomerID] = [result.getValue({
                            name: "quantity"
                        })];
                        (lineQtyOrder[currentCustomerID])[0] = (checkForParameter((lineQtyOrder[currentCustomerID])[0], '(lineQtyOrder[currentCustomerID])[0]') ? (lineQtyOrder[currentCustomerID])[0] : ' ');

                        lineQtyBackOrder[currentCustomerID] = [result.getValue({
                            name: "formulanumeric",
                            formula: "{quantity}-nvl({quantityshiprecv},0)-nvl({quantitycommitted},0)"
                        })];
                        (lineQtyBackOrder[currentCustomerID])[0] = (checkForParameter((lineQtyBackOrder[currentCustomerID])[0], '(lineQtyBackOrder[currentCustomerID])[0]') ? (lineQtyBackOrder[currentCustomerID])[0] : ' ');

                        templineCustomerCCEmailID = result.getValue({
                            name: "custentity_bsp_mcc_emailordersto",
                            join: "customer"
                        });
                        if (checkForParameter(templineCustomerCCEmailID, 'templineCustomerCCEmailID')) {
                            lineCustomerCCEmailID[currentCustomerID] = formatStringtoArray(templineCustomerCCEmailID, ',');
                        } else {
                            lineCustomerCCEmailID[currentCustomerID] = undefined;
                        }
                    } else {
                        //if objects with key currentCustomerID exist -> Duplicate
                        templineCompanyName = result.getValue({
                            name: "companyname",
                            join: "customer"
                        });
                        templineCompanyName = (checkForParameter(templineCompanyName, 'templineCompanyName') ? templineCompanyName : ' ');

                        templineOrderDate = result.getValue({
                            name: "datecreated"
                        });
                        templineOrderDate = (checkForParameter(templineOrderDate, 'templineOrderDate') ? templineOrderDate : ' ');

                        templineOrder_Po = result.getValue({
                            name: "tranid"
                        }) + '/' + result.getValue({
                            name: "otherrefnum"
                        });
                        templineOrder_Po = (checkForParameter(templineOrder_Po, 'templineOrder_Po') ? templineOrder_Po : ' ');

                        templineInvoice = result.getText({
                            name: "billingtransaction"
                        });
                        templineInvoice = (checkForParameter(templineInvoice, 'templineInvoice') ? templineInvoice.split('#')[1] : ' ');

                        templineBrand = result.getValue({
                            name: "custcol4"
                        });
                        templineBrand = (checkForParameter(templineBrand, 'templineBrand') ? templineBrand : ' ');

                        templineSKU = result.getValue({
                            name: "custcol1"
                        });
                        templineSKU = (checkForParameter(templineSKU, 'templineSKU') ? templineSKU : ' ');

                        templineUPC = result.getValue({
                            name: "upccode",
                            join: "item"
                        });
                        templineUPC = (checkForParameter(templineUPC, 'templineUPC') ? templineUPC : ' ');

                        templineItemTitle = result.getValue({
                            name: "custitem6",
                            join: "item"
                        });
                        templineItemTitle = (checkForParameter(templineItemTitle, 'templineItemTitle') ? templineItemTitle : ' ');

                        templineQtyOrder = result.getValue({
                            name: "quantity"
                        });
                        templineQtyOrder = (checkForParameter(templineQtyOrder, 'templineQtyOrder') ? templineQtyOrder : ' ');

                        templineQtyBackOrder = result.getValue({
                            name: "formulanumeric",
                            formula: "{quantity}-nvl({quantityshiprecv},0)-nvl({quantitycommitted},0)"
                        });
                        templineQtyBackOrder = (checkForParameter(templineQtyBackOrder, 'templineQtyBackOrder') ? templineQtyBackOrder : ' ');

                        (lineCompanyName[currentCustomerID]).push(templineCompanyName);
                        (lineOrderDate[currentCustomerID]).push(templineOrderDate);
                        (lineOrder_Po[currentCustomerID]).push(templineOrder_Po);
                        (lineInvoice[currentCustomerID]).push(templineInvoice);
                        (lineBrand[currentCustomerID]).push(templineBrand);
                        (lineSKU[currentCustomerID]).push(templineSKU);
                        (lineUPC[currentCustomerID]).push(templineUPC);
                        (lineItemTitle[currentCustomerID]).push(templineItemTitle);
                        (lineQtyOrder[currentCustomerID]).push(templineQtyOrder);
                        (lineQtyBackOrder[currentCustomerID]).push(templineQtyBackOrder);
                    }
                    return true;
                });

                var SCRIPT_RERUN_FLAG = false;
                var arrayIndex = 0;
                var waitForResponse;
                var currentLimitJSON, currentLimitFile, fileID, FILE_EXISTS = false;
                try {
                    //If file exists,then arrayIndex exits
                    currentLimitFile = file.load({
                        id: 'BTN-208 Re-occurring Reports/Customer/currentLimit.json'
                    });
                    currentLimitJSON = currentLimitFile.getContents();
                    currentLimitJSON = JSON.parse(currentLimitJSON);
                    arrayIndex = parseInt(currentLimitJSON.arrayIndex);
                    FILE_EXISTS = true;
                    logme('EXISTS currentLimit.json', 'Executing the remiander');
                } catch (err) {
                    //If file doesn't exists,then arrayIndex is 0
                    arrayIndex = 0;
                    FILE_EXISTS = false;
                    logme('NO currentLimit.json', 'Executing for first time');
                }

                /*
                Creating JSON object so that we can convert it to CSV
                */
                // headers for csv
                var headers = {
                    header_1: 'Company Name',
                    header_2: 'Order Date',
                    header_3: 'Order/PO',
                    header_4: 'Invoice #',
                    header_5: 'Brand',
                    header_6: 'SKU',
                    header_7: 'UPC',
                    header_8: 'Item Title',
                    header_9: 'Qty Ordered',
                    header_10: 'Qty Backordered'
                };
                var itemsFormatted_Array = new Array();
                var itemsFormatted_Object = new Object();
                var fileTitle_Object = new Object();
                var fileObj;
                var currentCustomer, currentLine;
                var BACK_ORDERED_FLAG = false;

                //to send email to customer, create JSON content for each customer
                for (currentCustomer = 0; currentCustomer < Object.keys(lineCustomerID).length; currentCustomer++) {
                    itemsFormatted_Array.push(headers);
                    for (currentLine = 0; currentLine < lineOrderDate[Object.keys(lineCustomerID)[currentCustomer]].length; currentLine++) {
                        BACK_ORDERED_FLAG = true;
                        itemsFormatted_Array.push({
                            header_1: ((lineCompanyName[Object.keys(lineCustomerID)[currentCustomer]])[currentLine]).replace(/,/g, '%2C').replace(/"/g, '%22').replace(/'/g, '%27').replace(/\n/g, '%0A'),
                            header_2: ((lineOrderDate[Object.keys(lineCustomerID)[currentCustomer]])[currentLine]).replace(/,/g, '%2C').replace(/"/g, '%22').replace(/'/g, '%27').replace(/\n/g, '%0A'),
                            header_3: (lineOrder_Po[Object.keys(lineCustomerID)[currentCustomer]])[currentLine],
                            header_4: (lineInvoice[Object.keys(lineCustomerID)[currentCustomer]])[currentLine],
                            header_5: (lineBrand[Object.keys(lineCustomerID)[currentCustomer]])[currentLine],
                            header_6: (lineSKU[Object.keys(lineCustomerID)[currentCustomer]])[currentLine],
                            header_7: (lineUPC[Object.keys(lineCustomerID)[currentCustomer]])[currentLine],
                            header_8: (((lineItemTitle[Object.keys(lineCustomerID)[currentCustomer]])[currentLine]).replace(/,/g, '%2C').replace(/"/g, '%22').replace(/'/g, '%27').replace(/\n/g, '%0A')).toString(),
                            header_9: (lineQtyOrder[Object.keys(lineCustomerID)[currentCustomer]])[currentLine],
                            header_10: (lineQtyBackOrder[Object.keys(lineCustomerID)[currentCustomer]])[currentLine]
                        });
                    }
                    itemsFormatted_Object[Object.keys(lineCustomerID)[currentCustomer]] = itemsFormatted_Array;
                    fileTitle_Object[Object.keys(lineCustomerID)[currentCustomer]] = lineCustomerName[Object.keys(lineCustomerID)[currentCustomer]];
                    itemsFormatted_Array = undefined;
                    itemsFormatted_Array = new Array();
                }

                //to send email for each Customer
                for (var i = arrayIndex; i < Object.keys(lineCustomerID).length; i++) {
                    remainingUsage = runtime.getCurrentScript().getRemainingUsage();
                    if (parseInt(remainingUsage) < 1000) {
                        //to reschedule
                        SCRIPT_RERUN_FLAG = true;
                        arrayIndex = i;
                        currentLimitJSON = {
                            arrayIndex: arrayIndex
                        };
                        // save a json file to file cabinet with the current arrayIndex (so that we know where to begin when script reschedules)
                        currentLimitFile = file.create({
                            name: 'currentLimit.json',
                            fileType: file.Type.JSON,
                            contents: JSON.stringify(currentLimitJSON),
                            encoding: file.Encoding.UTF8,
                            isInactive: true,
                            folder: 9334 // 9334 : BTN-208 Re-occurring Reports > Customer
                        });
                        fileID = currentLimitFile.save();
                        FILE_EXISTS = true;
                        break;
                    }
                    fileObj = exportCSVFile(headers, itemsFormatted_Object[lineCustomerID[Object.keys(lineCustomerID)[i]]], fileTitle_Object[lineCustomerID[Object.keys(lineCustomerID)[i]]]);

                    waitForResponse = createEmailTemplate(lineCustomerID[Object.keys(lineCustomerID)[i]], lineCustomerCCEmailID[Object.keys(lineCustomerID)[i]], lineCustomerName[Object.keys(lineCustomerID)[i]], lineCompanyName[Object.keys(lineCustomerID)[i]], lineOrderDate[Object.keys(lineCustomerID)[i]], lineOrder_Po[Object.keys(lineCustomerID)[i]], lineInvoice[Object.keys(lineCustomerID)[i]], lineBrand[Object.keys(lineCustomerID)[i]], lineSKU[Object.keys(lineCustomerID)[i]], lineUPC[Object.keys(lineCustomerID)[i]], lineItemTitle[Object.keys(lineCustomerID)[i]], lineQtyOrder[Object.keys(lineCustomerID)[i]], lineQtyBackOrder[Object.keys(lineCustomerID)[i]], fileObj);

                    logme("SEND Customer EMAIL : index,customer,waitForResponse", i + "," + lineCustomerID[Object.keys(lineCustomerID)[i]] + "," + waitForResponse);

                    if (FILE_EXISTS && (i == ((Object.keys(lineQtyBackOrder).length) - 1))) {
                        //to delete file in file cabibet
                        file.delete({
                            id: currentLimitFile.id
                        });
                    }
                }

                //to reschedule(rerun) script again
                if (SCRIPT_RERUN_FLAG) {
                    remainingUsage = runtime.getCurrentScript().getRemainingUsage();
                    logme('remainingUsage', remainingUsage);
                    currentDate = new Date();
                    logme('EXECUTION RESCHEDULED AT ARRAYINDEX ' + arrayIndex, 'EXECUTION RESCHEDULED ON ' + (currentDate.toUTCString()));
                    rescheduleScriptandReturn(arrayIndex);
                }
                currentDate = new Date();
                logme('EXECUTION ENDS', 'EXECUTION ENDS AT ' + (currentDate.toUTCString()));
            } catch (err) {
                currentDate = new Date();
                logme('EXECUTION FAILED', 'EXECUTION THROWS ERROR AT ' + (currentDate.toUTCString()));
                handleTryCatchError(err, 'function executeCustomerReport()');
            }
        }

        /* convert json to csv*/
        function convertToCSV(objArray) {
            try {
                var array = ((typeof (objArray) != 'object') ? (JSON.parse(objArray)) : (objArray));
                var str = '';

                for (var i = 0; i < array.length; i++) {
                    var line = '';
                    for (var index in array[i]) {
                        if (line != '') {
                            line += ',';
                        }
                        line += array[i][index];
                    }
                    str += line + '\r\n';
                }
                return str;
            } catch (err) {
                handleTryCatchError(err, 'function convertToCSV()');
            }
        }

        /* Save file in file cabinet as CSV*/
        function exportCSVFile(headers, items, fileTitle) {
            try {
                /* if (headers) {
                     items.unshift(headers);
                 }*/

                // Convert Object to JSON
                var jsonObject = JSON.stringify(items);

                var csvFile = convertToCSV(jsonObject);

                var exportedFilename = (checkForParameter(fileTitle, 'fileTitle') ? (fileTitle + '.csv') : ('export.csv'));

                var fileObj = file.create({
                    name: exportedFilename,
                    fileType: file.Type.CSV,
                    //contents: (csvFile).replace(/%2C/g, '/'),
                    contents: csvFile,
                    encoding: file.Encoding.UTF8,
                    isInactive: true,
                    folder: 9334 // 9334 : BTN-208 Re-occurring Reports > Customer
                });
                //var fileID = fileObj.save();
                return fileObj;
            } catch (err) {
                handleTryCatchError(err, 'function exportCSVFile()');
                return false;
            }
        }

        /*to create email template for customer*/
        function createEmailTemplate(CUSTOMER_INTERNAL_ID, lineCustomerCCEmailID, lineCustomerName, lineCompanyName, lineOrderDate, lineOrder_Po, lineInvoice, lineBrand, lineSKU, lineUPC, lineItemTitle, lineQtyOrder, lineQtyBackOrder, fileObj) {
            try {
                var SUBJECT = 'MyCoolCell Back Order Report Week of ' + (moment().startOf('isoWeek').format('L'));
                var tableBGFlag = true;
                var waitForResponse;
                var EMAIL_BODY = "";

                EMAIL_BODY += "<br><p><div style='color:black;font-weight:normal;'>Dear " + (checkForParameter(lineCustomerName, 'lineCustomerName') ? (lineCustomerName) : ('Client')) + ",</div></p>";
                EMAIL_BODY += "<br><p><div style='color:black;font-weight:normal;'>This notice is to inform you that the following item(s) from your recent order(s) were not shipped or shipped in full. </div></p>";
                EMAIL_BODY += "<br><p><div style='color:black;font-weight:normal;'>We strive to maintain adequate inventory on all our accessories to meet our valued customer's needs, but due to the extensive product selection and ever-changing demands in the marketplace, the products below are out of stock at this time. We apologize for any inconvenience.</div></p>";
                EMAIL_BODY += "<br><p><div style='color:red;font-weight:normal;'>If you would like to receive these products when they come back in stock, please contact your MyCoolCell Sales Rep at 888-388-8877 or by email or place a new order on our site. Please note that back ordered items will not automatically be shipped to you once they arrive back in stock.</div></p><br>";


                EMAIL_BODY += "<div><div style=\"overflow-x: auto;\"><div>";
                EMAIL_BODY += "        <table style=\"font-family:arial, sans-serif;border-collapse:collapse;width:100%;\">";
                EMAIL_BODY += "            <thead>";
                EMAIL_BODY += "                <tr>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Company Name<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Order Date<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Order \/ PO #<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Invoice #<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Brand<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">SKU <\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">UPC <\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Item Title<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Qty Ordered<\/th>";
                EMAIL_BODY += "                    <th style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;\">Qty Backordered<\/th>";
                EMAIL_BODY += "                <\/tr>";
                EMAIL_BODY += "            <\/thead>";
                EMAIL_BODY += "            <tbody>";
                for (var i = 0; i < lineOrderDate.length; i++) {
                    if (tableBGFlag) {
                        EMAIL_BODY += "                <!--FIRST-->";
                        EMAIL_BODY += "                <tr>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineCompanyName[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineOrderDate[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineOrder_Po[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineInvoice[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineBrand[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineSKU[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineUPC[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineItemTitle[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineQtyOrder[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#dddddd;\">" + lineQtyBackOrder[i] + "<\/td>";
                        EMAIL_BODY += "                <\/tr>";
                        tableBGFlag = false;
                    } else {
                        EMAIL_BODY += "                <!--SECOND-->";
                        EMAIL_BODY += "                <tr>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineCompanyName[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineOrderDate[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineOrder_Po[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineInvoice[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineBrand[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineSKU[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineUPC[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineItemTitle[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineQtyOrder[i] + "<\/td>";
                        EMAIL_BODY += "                    <td style=\"border-width:1px;border-style:solid;border-color:#cecece;text-align:left;padding-top:8px;padding-bottom:8px;padding-right:8px;padding-left:8px;background-color:#ffffff;\">" + lineQtyBackOrder[i] + "<\/td>";
                        EMAIL_BODY += "                <\/tr>";
                        tableBGFlag = true;
                    }
                }
                EMAIL_BODY += "            <\/tbody>";
                EMAIL_BODY += "        <\/table>";
                EMAIL_BODY += "<\/div><\/div><\/div>";

                EMAIL_BODY += "<br><p><div style='color:black;font-weight:bold;'>We appreciate your business and look forward to servicing you in the future.<br>Thank you for choosing MyCoolCell!<br> <a href='http://www.mycoolcell.net/' style='color:blue;font-weight:bold;'>www.mycoolcell.net</a> </div></p><br><br>";

                waitForResponse = sendCustomerEmailReport(CUSTOMER_INTERNAL_ID, lineCustomerCCEmailID, SUBJECT, EMAIL_BODY, fileObj);
                return waitForResponse;
            } catch (err) {
                handleTryCatchError(err, 'function createEmailTemplate()');
                return false;
            }
        }

        /*to send email to the customer*/
        function sendCustomerEmailReport(CUSTOMER_INTERNAL_ID, CustomerCCEmailID, SUBJECT, EMAIL_BODY, fileObj) {
            try {
                var senderId = -5; // -5 : albert@mycoolcell.net
                var recipientId = CUSTOMER_INTERNAL_ID;
                if (checkForParameter(CustomerCCEmailID, 'CustomerCCEmailID')) {
                    email.send({
                        author: senderId,
                        recipients: recipientId,
                        subject: SUBJECT,
                        body: EMAIL_BODY,
                        attachments: [fileObj],
                        cc: CustomerCCEmailID,
                        relatedRecords: {
                            entityId: recipientId,
                        }
                    });
                } else {
                    email.send({
                        author: senderId,
                        recipients: recipientId,
                        subject: SUBJECT,
                        body: EMAIL_BODY,
                        attachments: [fileObj],
                        relatedRecords: {
                            entityId: recipientId,
                        }
                    });
                }

                return true;
            } catch (err) {
                handleTryCatchError(err, 'function sendCustomerEmailReport()');
                return false;
            }
        }

        /*Try to reschedule script*/
        function rescheduleScriptandReturn(indexParam) {
            try {
                var mrTask = task.create({
                    taskType: task.TaskType.SCHEDULED_SCRIPT,
                    scriptId: "customscript_btn_208_jj_ss_email_custome",
                    deploymentId: "customdeploy_btn_208_jj_ss_email_custome",
                    params: {
                        arrayIndex: indexParam
                    }
                });
                var scriptTaskId = mrTask.submit();
                logme("rescheduleScriptandReturn_scriptTaskId", scriptTaskId);
            } catch (err) {
                handleTryCatchError(err, 'function rescheduleScriptandReturn()');
            }
        }

        /*To get current Date for start of the week (Date of Monday)*/
        function getCurrentDate() {
            //Date format is MM/DD/YYYY
            var currentDate = new Date();
            var currentMonth = currentDate.getMonth() + 1;
            var currentDay = currentDate.getDate();
            var currentYear = currentDate.getFullYear();
            return (currentMonth + '/' + currentDay + '/' + currentYear);
        }

        /*to check for a parameter*/
        function checkForParameter(parameter, parameterName) {
            if (parameter != "" && parameter != null && parameter != undefined && parameter != "undefined" && parameter != " ") {
                return true;
            } else {
                //logme('No ' + parameterName + ' found', 'No ' + parameterName + ' found');
                return false;
            }
        }

        /*to handle 'try' error in try-catch statement*/
        function handleTryCatchError(error, errorLocation) {
            logme('Error on ' + errorLocation, getError(error));
            logme('Error on ' + errorLocation, error.message);
        }

        /*to format string to array*/
        function formatStringtoArray(dataStr, delimiter) {
            var result = new Array();
            if (dataStr.indexOf(delimiter) > 0) {
                dataStr = dataStr.split(delimiter);
            }
            if (!Array.isArray(dataStr)) {
                result.push(dataStr);
            } else {
                result = dataStr;
            }
            if (checkForParameter(result, 'formatStringtoArray result')) {
                var index = 0;
                while (index < result.length) {
                    result[index] = (((result[index]).toString()).trim());
                    if (!validateEmail(((checkForParameter(result[index], 'emailSTR')) ? (result[index]) : ('false')))) {
                        result.remove(index);
                        index--;
                    }
                    index++;
                }
            }
            return result;
        }

        /*to format string to array*/
        function validateEmail(emailStr) {
            var reEmail = /^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/;

            if (emailStr.match(reEmail)) {
                return true;
            } else {
                return false;
            }
        }

        return {
            execute: executeCustomerReport
        };

    });

/*******************************************************************************
 * return error
 * 
 * @param e
 * @returns
 * 
 */
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
 * 
 */
function logme(title, details) {
    log.debug({
        title: title,
        details: details
    });
}

/*******************************************************************************/
// to delete an element from an Array
Array.prototype.remove = function (from, to) {
    var rest = this.slice(parseInt(to || from) + 1 || this.length);
    this.length = from < 0 ? this.length + from : from;
    return this.push.apply(this, rest);
};

Leave a comment

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