Project item list and PO creation

Jira code: DI-2

Description

The user creates a new entry to the “Project Items list”. The user will choose the customer name and project name and saves the entry. Then the user will have used import feature in NetSuite to upload items or/ user can manually choose and enter items to be added in the project. The user can also enter the QTY required next to each item.

Once the items are uploaded, there will be another button “Create POs”, and on it’s click, a pop-up will appear. In the pop-up, user can choose the items and choose the vendor. Clicking the submit button will close the pop-up and create a purchase order against the selected vendor, with the selected items. By default, the quantity will be the QTY entered by the user if needed.

Once the Purchase Order is created, the items will be marked as “Already sent purchase request”, and will be excluded from the pop-up for the next Purchase order.

Client script

/**
 * @NApiVersion 2.x
 * @NScriptType ClientScript
 * @NModuleScope SameAccount
 */
define(['N/currentRecord','N/url'],
/**
 * @param {N} N
 * @param {auth} auth
 * @param {config} config
 * @param {crypto} crypto
 * @param {currency} currency
 * @param {email} email
 * @param {encode} encode
 * @param {error} error
 * @param {file} file
 * @param {format} format
 * @param {http} http
 * @param {https} https
 * @param {plugin} plugin
 * @param {portlet} portlet
 * @param {record} record
 * @param {redirect} redirect
 * @param {render} render
 * @param {runtime} runtime
 * @param {search} search
 * @param {sso} sso
 * @param {task} task
 * @param {transaction} transaction
 * @param {ui} ui
 * @param {dialog} dialog
 * @param {message} message
 * @param {serverWidget} serverWidget
 * @param {url} url
 * @param {workflow} workflow
 * @param {xml} xml
 */
function(currentRecord,resolveurl) {
    
    /**
     * Function to be executed after page is initialized.
     *
     * @param {Object} scriptContext
     * @param {Record} scriptContext.currentRecord - Current form record
     * @param {string} scriptContext.mode - The mode in which the record is being accessed (create, copy, or edit)
     *
     * @since 2015.2
     */
     function openCreatePOPage()
     {
        
          var recordURL=window.location.href;
        
        console.log("emailURL",recordURL);
        var url=new URL(recordURL);
        var recordId=url.searchParams.get("id");
         console.log("recordId",recordId);
         
var outputURL = resolveurl.resolveScript({
    scriptId: 'customscript_jj_sl_popup_for_po',
    deploymentId: 'customdeploy_jj_sl_popup_for_po',
    returnExternalUrl: false
});
window.open(outputURL+"&recid="+recordId,"", "width=1000px, height=700px");


     }
    

    function pageInit(scriptContext) {

    }

    /**
     * Function to be executed when field is changed.
     *
     * @param {Object} scriptContext
     * @param {Record} scriptContext.currentRecord - Current form record
     * @param {string} scriptContext.sublistId - Sublist name
     * @param {string} scriptContext.fieldId - Field name
     * @param {number} scriptContext.lineNum - Line number. Will be undefined if not a sublist or matrix field
     * @param {number} scriptContext.columnNum - Line number. Will be undefined if not a matrix field
     *
     * @since 2015.2
     */
    function fieldChanged(scriptContext) {

    }

    /**
     * Function to be executed when field is slaved.
     *
     * @param {Object} scriptContext
     * @param {Record} scriptContext.currentRecord - Current form record
     * @param {string} scriptContext.sublistId - Sublist name
     * @param {string} scriptContext.fieldId - Field name
     *
     * @since 2015.2
     */
    function postSourcing(scriptContext) {

    }

    /**
     * Function to be executed after sublist is inserted, removed, or edited.
     *
     * @param {Object} scriptContext
     * @param {Record} scriptContext.currentRecord - Current form record
     * @param {string} scriptContext.sublistId - Sublist name
     *
     * @since 2015.2
     */
    function sublistChanged(scriptContext) {

    }

    /**
     * Function to be executed after line is selected.
     *
     * @param {Object} scriptContext
     * @param {Record} scriptContext.currentRecord - Current form record
     * @param {string} scriptContext.sublistId - Sublist name
     *
     * @since 2015.2
     */
    function lineInit(scriptContext) {

    }

    /**
     * Validation function to be executed when field is changed.
     *
     * @param {Object} scriptContext
     * @param {Record} scriptContext.currentRecord - Current form record
     * @param {string} scriptContext.sublistId - Sublist name
     * @param {string} scriptContext.fieldId - Field name
     * @param {number} scriptContext.lineNum - Line number. Will be undefined if not a sublist or matrix field
     * @param {number} scriptContext.columnNum - Line number. Will be undefined if not a matrix field
     *
     * @returns {boolean} Return true if field is valid
     *
     * @since 2015.2
     */
    function validateField(scriptContext) {

    }

    /**
     * Validation function to be executed when sublist line is committed.
     *
     * @param {Object} scriptContext
     * @param {Record} scriptContext.currentRecord - Current form record
     * @param {string} scriptContext.sublistId - Sublist name
     *
     * @returns {boolean} Return true if sublist line is valid
     *
     * @since 2015.2
     */
    function validateLine(scriptContext) {

    }

    /**
     * Validation function to be executed when sublist line is inserted.
     *
     * @param {Object} scriptContext
     * @param {Record} scriptContext.currentRecord - Current form record
     * @param {string} scriptContext.sublistId - Sublist name
     *
     * @returns {boolean} Return true if sublist line is valid
     *
     * @since 2015.2
     */
    function validateInsert(scriptContext) {

    }

    /**
     * Validation function to be executed when record is deleted.
     *
     * @param {Object} scriptContext
     * @param {Record} scriptContext.currentRecord - Current form record
     * @param {string} scriptContext.sublistId - Sublist name
     *
     * @returns {boolean} Return true if sublist line is valid
     *
     * @since 2015.2
     */
    function validateDelete(scriptContext) {

    }

    /**
     * Validation function to be executed when record is saved.
     *
     * @param {Object} scriptContext
     * @param {Record} scriptContext.currentRecord - Current form record
     * @returns {boolean} Return true if record is valid
     *
     * @since 2015.2
     */
    function saveRecord(scriptContext) {

    }

    return {
        pageInit: pageInit,
        fieldChanged: fieldChanged,
        postSourcing: postSourcing,
        sublistChanged: sublistChanged,
        lineInit: lineInit,
        validateField: validateField,
        validateLine: validateLine,
        validateInsert: validateInsert,
        validateDelete: validateDelete,
        saveRecord: saveRecord,
        openCreatePOPage:openCreatePOPage
        
    };
    
});

Suitelet Script:

/**
 * @NApiVersion 2.x
 * @NScriptType Suitelet
 * @NModuleScope SameAccount
 */
define(['N/https', 'N/record', 'N/runtime', 'N/search', 'N/ui/serverWidget', 'N/url', 'N/log','N/redirect','N/error','N/ui/message'],
    /**
     * @param {N} N
     * @param {auth} auth
     * @param {config} config
     * @param {crypto} crypto
     * @param {currency} currency
     * @param {email} email
     * @param {encode} encode
     * @param {error} error
     * @param {file} file
     * @param {format} format
     * @param {http} http
     * @param {https} https
     * @param {plugin} plugin
     * @param {portlet} portlet
     * @param {record} record
     * @param {redirect} redirect
     * @param {render} render
     * @param {runtime} runtime
     * @param {search} search
     * @param {sso} sso
     * @param {task} task
     * @param {transaction} transaction
     * @param {ui} ui
     * @param {dialog} dialog
     * @param {message} message
     * @param {serverWidget} serverWidget
     * @param {url} url
     * @param {workflow} workflow
     * @param {xml} xml
     */
    function(https, record, runtime, search, serverWidget, url, log,redirect,error,message) {

        /**
         * Definition of the Suitelet script trigger point.
         *
         * @param {Object} context
         * @param {ServerRequest} context.request - Encapsulation of the incoming request
         * @param {ServerResponse} context.response - Encapsulation of the Suitelet response
         * @Since 2015.2
         */
   
          
        function onRequest(context) {
            try
            {
                 var form = serverWidget.createForm({
                    title: 'Create PO'
                });


                 if(context.request.method=="GET")
                 {
             var id = context.request.parameters.recid;
             
             
                form.addSubmitButton({id:'custbtn_submit_po',label:'Submit PO'});
var vendorField=form.addField({
                    id: 'custpage_select_vendor',
                    type: serverWidget.FieldType.SELECT,
                    label: 'Vendor',
                    source: 'vendor'});
vendorField.isMandatory = true;

form=createForm(form,id);

context.response.writePage(form);
}
else
{
 var lineCount=context.request.getLineCount({group: 'custpage_itemlist'});
 var vendor=context.request.parameters.custpage_select_vendor;
 log.debug("lineCount",lineCount);
                    var itemIds=[];
                    var qtryArray=[];
                    var qtryArray2=[];
                    var qtyPurchArray=[];
                    var pilIds=[];
                    var pilStatus=[];
                    var tagArray=[];
           var c=0;
           var selectFlag=0;
                    for(var k=0;k<lineCount;k++)
                    {

log.debug("c",c);
                        if( context.request.getSublistValue({
                    group: 'custpage_itemlist',
                    name: 'custpage_col_tc40_check',
                    line: k
                    })=='T')
                        {
                            selectFlag=1;
                            log.debug("qtryArray",qtryArray[0]);
                            itemIds.push(parseInt(context.request.getSublistValue({
                    group: 'custpage_itemlist',
                    name: 'custpage_col_itemid',
                    line: k
                    })));
                          qtryArray.push(parseInt(context.request.getSublistValue({
                    group: 'custpage_itemlist',
                    name: 'custpage_col_quantity',
                    line: k
                    })));
                          qtryArray2.push(parseInt(context.request.getSublistValue({
                    group: 'custpage_itemlist',
                    name: 'custpage_col_dummy_quantity',
                    line: k
                    })));

                          tagArray.push(context.request.getSublistValue({
                    group: 'custpage_itemlist',
                    name: 'custpage_col_tag_number',
                    line: k
                    }));
                      
               
                     pilIds.push(parseInt(context.request.getSublistValue({
                    group: 'custpage_itemlist',
                    name: 'custpage_col_pilid',
                    line: k
                    })));
 qtyPurchArray.push(parseInt(context.request.getSublistValue({
                    group: 'custpage_itemlist',
                    name: 'custpage_col_qty_purchased',
                    line: k
                    })));

                    
var q=qtyPurchArray[c]+ qtryArray[c];

log.debug("q1",context.request.getSublistValue({
                    group: 'custpage_itemlist',
                    name: 'custpage_col_qty_purchased',
                    line: k
                    }));

log.debug("qtryArray[c]",qtryArray[c]);

                    if(qtryArray2[c]==q)
                    {
       
             pilStatus.push("PO fully created.");


                    

                        }
                        else if(qtryArray2[c]>q)
                        {
                            pilStatus.push("PO partially created.");


                        }
                        else if(qtryArray2[c]<q)
                        {
                             pilStatus.push("PO created more than required.");
                        }
                
                c++
                }
                    
}
if(selectFlag==1)
{
log.debug("itemIds",itemIds);

var objRecord = record.create({
    type: record.Type.PURCHASE_ORDER, 
    isDynamic: true,
    defaultValues: {
        entity: vendor
    }
});
objRecord.setValue({
           
            fieldId: 'entity',
            value: vendor
        });
for(var i=0;i<itemIds.length;i++)
{
    objRecord.selectNewLine({
            sublistId: 'item'
        });
        objRecord.setCurrentSublistValue({
            sublistId: 'item',
            fieldId: 'item',
            value: itemIds[i]
        });
        objRecord.setCurrentSublistValue({
            sublistId: 'item',
            fieldId: 'quantity',
            value:qtryArray[i]
        });

        objRecord.setCurrentSublistValue({
            sublistId: 'item',
            fieldId: 'custcol_jj_di1_tag_number',
            value:tagArray[i]
        });
        

objRecord.commitLine({
            sublistId: 'item'
        });
}


var recordId = objRecord.save({
    enableSourcing: true,
   ignoreMandatoryFields: true
});


redirect.toRecord({
    type : record.Type.PURCHASE_ORDER, 
    id : recordId,
    parameters: {} 
});
log.debug("pilIds.length",pilIds.length);
log.debug("pilIds",pilIds);
log.debug("pilStatus",pilStatus);
for(var j=0;j<pilIds.length;j++)
{
var id = record.submitFields({
    type: 'customrecord_jj_di2_item_list',
    id: pilIds[j],
    values: {
        custrecord3: pilStatus[j],
        custrecord_di2_jj_quantity_purchased: qtyPurchArray[j]+qtryArray[j],
        custrecord_di2_jj_itemlist_po: recordId
       

        
    },
    options: {
        enableSourcing: true,
        ignoreMandatoryFields : true
    }

});

}
}
else
{
   
      context.response.write("<html> <body> <h3>No item selected! Please select items.</h3> <button onclick='goBack()'>Go Back</button> <script> function goBack() { window.history.back(); } </script> </body> </html>");                      

}
}
}
catch(err)
{
    log.debug("err",err);
}
        }
        function addValuesToList(itemSublist,id)
        {
var customrecord_jj_di2_item_listSearchObj = search.create({
   type: "customrecord_jj_di2_item_list",
   filters:
   [
      ["custrecord2","anyof",id]
   ],
   columns:
   [
      search.createColumn({ name: "itemid",
         join: "CUSTRECORD_JJ_DI2_ITEMS",
         label: "Name"}),
      search.createColumn({name: "custrecord_jj_di2_quantity", label: "Quantity"}),
      search.createColumn({
         name: "internalid",
         join: "CUSTRECORD_JJ_DI2_ITEMS",
         label: "Internal ID"
      }),
      search.createColumn({name: "internalid", label: "Internal id"}),
       search.createColumn({name: "custrecord_di2_jj_quantity_purchased", label: "Quantity Purchased"}),
       search.createColumn({name: "custrecord_di2_jj_tag_number", label: "Tag number"})
   ]
});
var searchResultCount = customrecord_jj_di2_item_listSearchObj.runPaged().count;
log.debug("customrecord_jj_di2_item_listSearchObj result count",searchResultCount);
var i=0;
customrecord_jj_di2_item_listSearchObj.run().each(function(result){
    log.debug("result.getValue(customrecord_jj_di2_item_listSearchObj.columns[4])",result.getValue(customrecord_jj_di2_item_listSearchObj.columns[4]));
 log.debug("result.getValue(customrecord_jj_di2_item_listSearchObj.columns[5])",result.getValue(customrecord_jj_di2_item_listSearchObj.columns[5]));

            itemSublist.setSublistValue({ id: 'custpage_col_itemid', value: result.getText(customrecord_jj_di2_item_listSearchObj.columns[2]), line: i });
            itemSublist.setSublistValue({ id: 'custpage_col_itemname', value: result.getValue(customrecord_jj_di2_item_listSearchObj.columns[0]), line: i });
            itemSublist.setSublistValue({ id: 'custpage_col_quantity', value: (result.getValue(customrecord_jj_di2_item_listSearchObj.columns[1])-result.getValue(customrecord_jj_di2_item_listSearchObj.columns[4])).toFixed(0), line: i });
            itemSublist.setSublistValue({ id: 'custpage_col_dummy_quantity', value: result.getValue(customrecord_jj_di2_item_listSearchObj.columns[1]), line: i });
            itemSublist.setSublistValue({ id: 'custpage_col_pilid', value: result.getValue(customrecord_jj_di2_item_listSearchObj.columns[3]), line: i });
            itemSublist.setSublistValue({ id: 'custpage_col_qty_purchased', value:result.getValue(customrecord_jj_di2_item_listSearchObj.columns[4]), line: i });
            result.getValue(customrecord_jj_di2_item_listSearchObj.columns[5])!=''?itemSublist.setSublistValue({ id: 'custpage_col_tag_number', value: result.getValue(customrecord_jj_di2_item_listSearchObj.columns[5]), line: i }):{} ;

 i++;
   return true;
});

                    

        }
        function createForm(form,id)
        {
           

 var itemSublist = form.addSublist({
                            id: 'custpage_itemlist',
                            type: serverWidget.SublistType.LIST,
                            label: 'Item List'
                        });
                        itemSublist.addMarkAllButtons();
itemSublist.addField({
                            id: "custpage_col_itemid",
                            label: 'Internal id',
                            type: serverWidget.FieldType.TEXT
                        });
itemSublist.addField({
                            id: "custpage_col_itemname",
                            label: 'Item',
                            type: serverWidget.FieldType.TEXT
                        });
var qtyField=itemSublist.addField({
                            id: "custpage_col_quantity",
                            label: 'Quantity Required',
                            type: serverWidget.FieldType.TEXT
                        });
qtyField.updateDisplayType({
    displayType: serverWidget.FieldDisplayType.ENTRY
});

var tagField=itemSublist.addField({
                            id: "custpage_col_tag_number",
                            label: 'Tag number',
                            type: serverWidget.FieldType.TEXT
                        });


var dummyQtyField=itemSublist.addField({
                            id: "custpage_col_dummy_quantity",
                            label: 'Quantity',
                            type: serverWidget.FieldType.TEXT
                        });
dummyQtyField.updateDisplayType({
    displayType: serverWidget.FieldDisplayType.HIDDEN
});

var pilIdField=itemSublist.addField({
                            id: "custpage_col_pilid",
                            label: 'PILid',
                            type: serverWidget.FieldType.TEXT
                        });
pilIdField.updateDisplayType({
    displayType: serverWidget.FieldDisplayType.HIDDEN
});
itemSublist.addField({
                            id: "custpage_col_qty_purchased",
                            label: 'Quantity Purchased',
                            type: serverWidget.FieldType.TEXT
                        });


                        var checkboxField = itemSublist.addField({
                            id: "custpage_col_tc40_check",
                            label: 'Select',
                            type: serverWidget.FieldType.CHECKBOX
                        });
                        checkboxField.updateDisplayType({ displayType: serverWidget.FieldDisplayType.ENTRY });

                        itemSublist=addValuesToList(itemSublist,id);

            

return form;
        }

        return {
            onRequest: onRequest
        };

    });

User Event script

/**
 * @NApiVersion 2.x
 * @NScriptType UserEventScript
 * @NModuleScope SameAccount
 */
define(['N/ui/serverWidget', 'N/record'],
    /**
     * @param {N} N
     * @param {auth} auth
     * @param {config} config
     * @param {crypto} crypto
     * @param {currency} currency
     * @param {email} email
     * @param {encode} encode
     * @param {error} error
     * @param {file} file
     * @param {format} format
     * @param {http} http
     * @param {https} https
     * @param {plugin} plugin
     * @param {portlet} portlet
     * @param {record} record
     * @param {redirect} redirect
     * @param {render} render
     * @param {runtime} runtime
     * @param {search} search
     * @param {sso} sso
     * @param {task} task
     * @param {transaction} transaction
     * @param {ui} ui
     * @param {dialog} dialog
     * @param {message} message
     * @param {serverWidget} serverWidget
     * @param {url} url
     * @param {workflow} workflow
     * @param {xml} xml
     */
    function(serverWidget, record) {
        /**
         * Function definition to be triggered before record is loaded.
         *
         * @param {Object} scriptContext
         * @param {Record} scriptContext.newRecord - New record
         * @param {string} scriptContext.type - Trigger type
         * @param {Form} scriptContext.form - Current form
         * @Since 2015.2
         */
        function beforeLoad(scriptContext) {

            if (scriptContext.type != 'create') {
                scriptContext.form.addButton({
                    id: 'custpage_createpo',
                    label: 'Create PO',
                    functionName: 'openCreatePOPage'
                });
                scriptContext.form.clientScriptFileId = 2210;

            }

        }

        /**
         * Function definition to be triggered before record is loaded.
         *
         * @param {Object} scriptContext
         * @param {Record} scriptContext.newRecord - New record
         * @param {Record} scriptContext.oldRecord - Old record
         * @param {string} scriptContext.type - Trigger type
         * @Since 2015.2
         */
        function beforeSubmit(scriptContext) {

        }

        /**
         * Function definition to be triggered before record is loaded.
         *
         * @param {Object} scriptContext
         * @param {Record} scriptContext.newRecord - New record
         * @param {Record} scriptContext.oldRecord - Old record
         * @param {string} scriptContext.type - Trigger type
         * @Since 2015.2
         */
        function afterSubmit(scriptContext) {
            try {
                var prjctId = scriptContext.newRecord.getValue({ fieldId: 'custrecord_jj_di2_projects' });
                log.debug("prjctId", prjctId);
                var recId = scriptContext.newRecord.id;
                log.debug("recId", recId);
                var id = record.submitFields({
                    type: record.Type.CUSTOMER,
                    id: prjctId,
                    values: {
                        custentity_di2_jj_projectitemlist: recId
                    },
                    options: {
                        enableSourcing: false,
                        ignoreMandatoryFields: true
                    }
                });
            } catch (err) {
                log.debug("err", err);
            }
        }

        return {
            beforeLoad: beforeLoad,
            beforeSubmit: beforeSubmit,
            afterSubmit: afterSubmit
        };

    });

Leave a comment

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