Update additional tracking number field in Purchase order

/**
 * @NApiVersion 2.1
 * @NScriptType MapReduceScript
 */


define(['N/email', 'N/record', 'N/render', 'N/recordContext', 'N/runtime','N/currentRecord', 'N/search','N/file'],
    /**
 * @param{email} email
 * @param{record} record
 * @param{recordContext} recordContext
 * @param{runtime} runtime
 * @param{search} search
 */
    (email, record,render, recordContext, runtime, currentRecord, search, file) => {

        /**
         * @description the function to check whether a value exists in parameter
         * @param parameter -passing parameter
         * @param parameterName - passing parameter name
         * @returns{Boolean}
         */
        function checkForParameter(parameter, parameterName) {
            if (
                parameter != "" &&
                parameter != null &&
                parameter != undefined &&
                parameter != "null" &&
                parameter != "undefined" &&
                parameter != " " &&
                parameter != false
            ) {
                return true;
            } else {
                if (parameterName)
                    log.debug(
                        "Empty Value found",
                        "Empty Value for parameter " + parameterName
                    );
                return false;
            }
        }

        const getInputData = (inputContext) => {
            try {

                var requestBody = runtime.getCurrentScript().getParameter('custscript_jj_poid')
                log.debug("requestBody", requestBody);

                var fileObj = file.load({ id: requestBody });
                var poArray = [];

                var purchaseObj = fileObj.getContents();
                log.debug("purchaseObj", purchaseObj)

                var purchaseOrd = JSON.parse(purchaseObj)
                var purchaseOrder=purchaseOrd.purchaseorder
                log.debug("purchaseOrder",purchaseOrder)

                var objLength = Object.keys(purchaseOrder).length
                log.debug("objLength", objLength);


                    const isEmpty = Object.keys(purchaseOrder).every(x => (x === null || x === ''));
                log.debug("isEmpty",isEmpty)

                // create dynamic filters
                var filteredIDs= [
                    ["type", "anyof", "PurchOrd"],
                    "AND",
                    ["mainline","is","T"],
                    "AND",
                    ["cogs","is","F"],
                    "AND",
                    ["taxline","is","F"],
                    "AND",
                    ["shipping","is","F"],
                    "AND",
                ];

                var filterArray=[];
                var identificationFlag = 0;
                for (let i = 0; i < objLength; i++) {
                    var poNum = Object.keys(purchaseOrder)[i]

                   //check the poNum value is empty or not
                    if(checkForParameter(poNum)){
                        identificationFlag++;
                      filterArray.push([["numbertext", "is", poNum]])
                      filterArray.push('OR');
                    }
                }
                filterArray.pop();
                filteredIDs.push(filterArray)
                log.debug("filteredIDs",filteredIDs)

                if(identificationFlag == 0){
                    return [];
                }

                // search to get the internal id of the PO
                var purchaseorderSearchObj = search.create({
                    type: "purchaseorder",
                    filters:[filteredIDs],
                    columns:
                        [
                            search.createColumn({name: "tranid", label: "Document Number"}),
                            search.createColumn({name: "internalid", label: "Internal ID"})
                        ]
                });
                var docArray = [];
                var searchResultCount = purchaseorderSearchObj.runPaged().count;
                if (searchResultCount > 0) {
                    purchaseorderSearchObj.run().each(function (result) {
                        var docObj={};
                        docObj.poId = result.getValue({ name: "tranid",label: "Document Number"});
                        docObj.internalId = result.getValue({name: "internalid",label: "Internal ID"});
                        docArray.push(docObj);
                        return true;
                    });
                }
                log.debug('docArray',docArray)
                return docArray
            }
            catch (e) {
                log.debug('Error @ GetInputData',e);
                return [];
            }
        }

        const reduce = (reduceContext) => {
            try {

                var requestBody = runtime.getCurrentScript().getParameter('custscript_jj_poid')

                var purchaseObj = file.load({id: requestBody}).getContents();

                var purchaseOrd = JSON.parse(purchaseObj);
                var purchaseOrder = purchaseOrd.purchaseorder;
                var dataObj = JSON.parse(reduceContext.values);

                var docNum = dataObj.poId;

                var inId = dataObj.internalId;

                var addTracknum = search.lookupFields({
                    type: "purchaseorder",
                    id: inId,
                    columns: ["trackingnumbers"]
                }).trackingnumbers

                var trackNo = purchaseOrder[docNum];
                log.debug("trackNo",trackNo);
                if (!addTracknum) {

                    record.submitFields({
                        type: record.Type.PURCHASE_ORDER,
                        id: inId,
                        values: {
                            'trackingnumbers': trackNo.toString()
                        }
                    });

                    // create object for storing po and tracking number
                    var poObject = {
                        ponum: docNum,
                        tracknum: trackNo
                    }

                    log.debug("poObject", poObject)
                    reduceContext.write({
                        key: 'success',
                        value: poObject
                    })
                }

            } catch (e) {
                log.debug('Error@Reduce',e)
            }
        }

        const summarize = (summaryContext) => {
            try{
                var flagCount = 0;
                var poArray= ["PO Number", "Tracking Number"];
                var csvFileData=  poArray.toString() + '\r\n';
                summaryContext.output.iterator().each(function (key,value) {
                    let parseSummary= JSON.parse(value);
                    //csvArray.push(parseSummary)
                    if(key==='success')
                        flagCount++;
                    csvFileData += parseSummary.ponum  +','+parseSummary.tracknum+'\r\n'
                    return true;
                });
                log.debug('flagCount',flagCount);
                if(flagCount > 0){
                    var today= new Date();
                    var csvfileObj = file.create({
                        name: 'Tracking number update:' + today + '.csv',
                        fileType: file.Type.CSV,
                        contents: csvFileData,
                        encoding: file.Encoding.UTF8,
                    });

                    var recEmail= 'jacob@alliedpowerandcontrol.com';
                    var authId=-5

                    //send email to the user
                    email.send({
                        author:authId,
                        recipients:recEmail,
                        body:'Update Tracking Numbers',
                        subject:'Tracking Number Updation',
                        attachments:[csvfileObj]
                    });
                }
            }catch (e) {
                log.debug('Error@summarize',e)
            }
        }
        return {getInputData, reduce,summarize}
    });

Leave a comment

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