Invoice payment module in portfolio custom record

JIra Code: MBS 5, MBS-7

Add a new sublist field(editable) into the custom record ‘Portfolio’ to store the cheque amount. On selecting the cheque from the list this field should be auto-populated. On the click of the ‘Create Payment’ button, a payment record is to be generated. Once generated an alert message is to be displayed with the record id and also the cheque number and amount must be saved in the sublist. In some case, multiple invoices will be issued a single cheque and that case should also be considered.
If more than one invoices are selected for payment by selecting the cheque, then those invoices are also applied to the payment record by checking the apply checkbox of the payment record. If the payment record is generated an alert message is displayed with the payment record id. Also, display an alert if an error occurs.

User event script
(MBS-3 JJ UE invoice sublist to Portfolio )

/**
 * @NApiVersion 2.x
 * @NScriptType UserEventScript
 * @NModuleScope SameAccount
 */
define(['N/record', 'N/redirect','N/ui/serverWidget','N/search'],
/**
 * @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(record,redirect,serverWidget,search) {
   
    /**
     * 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) {
        try
        {

            if(scriptContext.type!='create')
            {
 scriptContext.form.clientScriptFileId = 4397;
               var form = scriptContext.form;

               //Create the Sublist for invoice
               //Start
               var sublist = form.addSublist({
                    id : 'custpage_invoice_for_check',
                    type : serverWidget.SublistType.LIST,
                    label : 'Invoices',
                    tab : 'custom32'
                });

               sublist.addField({
                    id: 'custpage_invoice_type',
                    type: serverWidget.FieldType.TEXT,
                    label: 'Type'
                   
                });
               sublist.addField({
                   id: 'custpage_invoice_id',
                   type: serverWidget.FieldType.TEXT,
                   label: 'Invoice Id'
                  
               });
                sublist.addField({
                    id: 'custpage_invoice_document_numb',
                    type: serverWidget.FieldType.TEXT,
                    label: 'Document Number'
                   
                })
               sublist.addField({
                    id: 'custpage_invoice_customer',
                    type: serverWidget.FieldType.TEXT,
                    label: 'Customer'
                   
                });

                sublist.addField({
                    id: 'custpage_invoice_date',
                    type: serverWidget.FieldType.TEXT,
                    label: 'Date'
                   
                });
                sublist.addField({
                    id: 'custpage_invoice_due_date',
                    type: serverWidget.FieldType.TEXT,
                    label: 'Due Date'
                   
                });

                 sublist.addField({
                    id: 'custpage_invoice_status',
                    type: serverWidget.FieldType.TEXT,
                    label: 'Status'
                   
                });
                sublist.addField({
                    id: 'custpage_invoice_amount',
                    type: serverWidget.FieldType.TEXT,
                    label: 'Amount'
                   
                });
                sublist.addField({
                    id: 'custpage_invoice_due_amt',
                    type: serverWidget.FieldType.TEXT,
                    label: 'Invoice Due Amount'
                   
                });
                var checkField=sublist.addField({
                            id: "custpage_invoice_check",
                            label: 'Select Check',
                            type: serverWidget.FieldType.SELECT
                        })
                 checkField.updateDisplayType({
                	 displayType: serverWidget.FieldDisplayType.ENTRY
                 });
                var parentID=scriptContext.newRecord.id;
               checkField=  setCheckList(parentID,checkField);
           
               var amntField = sublist.addField({
                   id: 'custpage_cheque_amount',
                   type: serverWidget.FieldType.CURRENCY,
                   label: 'Cheque Amount'
                  
               });
               amntField.updateDisplayType({
              	 displayType: serverWidget.FieldDisplayType.ENTRY
               });
               var chequeId = sublist.addField({
                   id: 'custpage_cheque_id',
                   type: serverWidget.FieldType.TEXT,
                   label: 'Cheque idt'
                  
               });
               chequeId.updateDisplayType({
            	    displayType : serverWidget.FieldDisplayType.HIDDEN
            	});
                sublist.addButton({
                	id : 'custpage_create_payment',
                	label : 'Create Payment',
                	functionName: 'makePayment'
                });
                //END
                var customer=scriptContext.newRecord.getValue({
                fieldId: 'custrecord_jj_customer_name'
            });
           
            sublist=addValueForSublist(sublist,customer);
           
            }

        }
        catch(err)
        {
        	log.debug("err",err);
        }

    }

    function addValueForSublist(sublist,customer) 
    {

       
        try
        {
        	//Create Search for invocie
        	var invoiceSearchObj = search.create({
        		type: "invoice",
        		filters:
        			[
        				["type","anyof","CustInvc"], 
        				"AND", 
        				["status","anyof","CustInvc:A"],
        				"AND",  
        				["name","anyof",customer],
        				"AND", 
        				["mainline","is","T"]
        				],
        				columns:
        					[

        						search.createColumn({name: "type", label: "Type"}),//0
        						search.createColumn({name: "entity", label: "Name"}),//1
        						search.createColumn({
        							name: "trandate",
        							sort: search.Sort.ASC,
        							label: "Date"
        						}),//2
        						search.createColumn({name: "duedate", label: "Due Date/Receive By"}),//3
        						search.createColumn({name: "tranid", label: "Document Number"}),//4
        						search.createColumn({name: "statusref", label: "Status"}),//5
        						search.createColumn({name: "account", label: "Account"}),//6
        						search.createColumn({name: "amount", label: "Amount"}),//7
        						search.createColumn({name: "internalid", label: "Internal ID"}),//8
        						search.createColumn({name: "amountremaining", label: "Amount Remaining"}) //9
        						]
        				});
	var searchResultCount = invoiceSearchObj.runPaged().count;

	var i=0;
	invoiceSearchObj.run().each(function(result){
   
		//Set values for sublist
		//Start

		sublist.setSublistValue({
                        id : "custpage_invoice_type",
                        line : i,
                        value : checkif(result.getValue(invoiceSearchObj.columns[0]))
                    });
		sublist.setSublistValue({
            id : "custpage_invoice_id",
            line : i,
            value :checkif(result.getValue(invoiceSearchObj.columns[8]))
        });
		sublist.setSublistValue({
                        id : "custpage_invoice_document_numb",
                        line : i,
                        value : checkif(result.getValue(invoiceSearchObj.columns[4]))
                    });

		sublist.setSublistValue({
                        id : "custpage_invoice_customer",
                        line : i,
                        value : checkif(result.getText(invoiceSearchObj.columns[1]))
                    });
		sublist.setSublistValue({
                        id : "custpage_invoice_date",
                        line : i,
                        value : checkif(result.getValue(invoiceSearchObj.columns[2]))
                    });
		sublist.setSublistValue({
                        id : "custpage_invoice_due_date",
                        line : i,
                        value :checkif(result.getValue(invoiceSearchObj.columns[3]))
                    });

		sublist.setSublistValue({
                        id : "custpage_invoice_status",
                        line : i,
                        value : checkif(result.getValue(invoiceSearchObj.columns[5]))
                    });
		sublist.setSublistValue({
                        id : "custpage_invoice_amount",
                        line : i,
                        value : checkif(result.getValue(invoiceSearchObj.columns[7]))
                    });
		sublist.setSublistValue({
            id : "custpage_invoice_due_amt",
            line : i,
            value : checkif(result.getValue(invoiceSearchObj.columns[9]))
        });



		i++;
		//End


		return true;
	});

	return sublist;
        }
        catch(err)
        {
        	log.debug("err",err);
        }
    }

    function setCheckList(parentID,checkField)
    {

    	var customrecord83SearchObj = search.create({
    		type: "customrecord_jj_checkordraft",
    		filters:
    			[
    				["custrecord_jj_check_parentportfolio","anyof",parentID],
    				 "AND", 
   			      ["custrecord_mbs7_balance_amt_cust","greaterthan","0.00"]
    				],
    				columns:
    					[
    						search.createColumn({name: "name", label: "Cheque Number"}),
    						search.createColumn({name: "custrecord_jj_check_type", label: "Type"}),
    						search.createColumn({name: "custrecord_jj_check_amount", label: "Amount"})
    						]
    	});
    	var searchResultCount = customrecord83SearchObj.runPaged().count;
    
    	checkField.addSelectOption({
    		value : '',
    		text : ''
    	});
    	var j=0;
    	customrecord83SearchObj.run().each(function(result){
 
    		checkField.addSelectOption({
    			value : checkif(result.getValue(customrecord83SearchObj.columns[0])),
    			text : checkif(result.getValue(customrecord83SearchObj.columns[0]))
    			});
    		
    		j++;

    		return true;
    	});
    	
    	return checkField;
    }

    /**
     * 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) {



    }

    return {
        beforeLoad: beforeLoad,
        beforeSubmit: beforeSubmit,
        afterSubmit: afterSubmit
    };
    
});
//nullcheck
function checkif(singleitem) {

	if (singleitem != "" && singleitem != null && singleitem != undefined && singleitem !='- None -' && singleitem != " " && singleitem != NaN && singleitem != 'NaN') {
		return singleitem;
	} else{

		return "-";
	}
}

MBS-3 JJ UE Update field in Portfolio

/**
 * @NApiVersion 2.x
 * @NScriptType UserEventScript
 * @NModuleScope SameAccount
 */
define(['N/search','N/record','N/format','N/ui/serverWidget'],
/**
 * @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(search,record,format,serverWidget) {
    /**
     * 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 dateFormatOld(date){
		
		var m = date.getMonth();
		var month = m+1;
		
		var year= date.getFullYear();
		
		var day = date.getUTCDate();
	
		return day +"/" + month+ "/" + year;
		
	}
	function dateFormat(date){
		
		var month = date.getMonth();
		
		var year= date.getFullYear();
		
		var day = date.getUTCDate();
		
		return month+1 +"/" + day+ "/" + year;
		
	}
	function checkif(singleitem) {

		if (singleitem != "" && singleitem != null && singleitem != undefined && singleitem !='- None -' && singleitem != " " && singleitem != NaN && singleitem != 'NaN') {
			return singleitem;
		} else{

			return "0";
		}
	}
	
	function formatToString(rawNum2) {
			// Assume number format is 1.000.000,00 and negative format is (100)
		
              return format.format({value:rawNum2, type: format.Type.CURRENCY}) 
              }
	function formatToDate(num) {
		// Assume number format is 1.000.000,00 and negative format is (100)
	
          return format.parse({value:num, type: format.Type.DATE});
          }

	
	 /**
     * 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) {
    	try{
    		var portfolioId = scriptContext.newRecord.getValue({fieldId:'custrecord_jj_check_parentportfolio'});
    	
    		var objRecord = record.load({
    			type:'customrecord_jj_portfolio',
    			id: portfolioId
    		});
    		var owner = objRecord.getValue({
    		    fieldId: 'custrecord_jj_customer_name'
    		});
    	
    		var currency = objRecord.getValue({
    		    fieldId: 'custrecord_jj_portfolio_currency'
    		});
    		
    		
    		var chequeOwner = scriptContext.newRecord.setValue({
    		    fieldId: 'custrecord_jj_check_owner',
    		    value: owner
    		});
    		
    		var chequeCurrency = scriptContext.newRecord.setValue({
    		    fieldId: 'custrecord_jj_check_currency',
    		    value: currency
    		});	
    	}catch(error){
    		log.debug("error",error)
    	}
    	
    }
    
    
 	function afterSubmit(scriptContext) {
        try
        {		//to get the internal id of portfolio record
    			var portfolioId = scriptContext.newRecord.getValue({fieldId:'custrecord_jj_check_parentportfolio'});
    			var objRecord = record.load({
    				type:'customrecord_jj_portfolio',
    				id: portfolioId
    			});
    			var totAmount_portfolio = objRecord.getValue({
    			    fieldId: 'custrecord_jj_portfolio_total_amount'
    			});

        		
        		var checkNumber_portfolio = objRecord.getValue({
    			    fieldId: 'custrecord_jj_portfolio_check_nos'
    			});

        		
        		var avgDuedate_portfolio = objRecord.getValue({
    			    fieldId: 'custrecord_jj_portfolio_avg_due_date'
    			});

        		
        		var dueAmnt_portfolio = objRecord.getValue({
    			    fieldId: 'custrecord_jj_portfolio_amountdue'
    			});

        		
        		if(scriptContext.type=='create'){
        			var totalAmount = parseFloat(checkif(totAmount_portfolio)) + parseFloat(scriptContext.newRecord.getValue({fieldId:'custrecord_jj_check_amount'}));
        		}
        		else
        			if(scriptContext.type=='edit'){
        				var totalAmount = (parseFloat(checkif(totAmount_portfolio)) - parseFloat(scriptContext.oldRecord.getValue({fieldId:'custrecord_jj_check_amount'})))+(parseFloat(scriptContext.newRecord.getValue({fieldId:'custrecord_jj_check_amount'})));
        			}
        			else
        				if(scriptContext.type=='delete'){
        					
        					var totalAmount = parseFloat(checkif(totAmount_portfolio)) - parseFloat(scriptContext.newRecord.getValue({fieldId:'custrecord_jj_check_amount'}));
        				}
        		
        	
        		
        		if(scriptContext.type=='create'){
        			var duedate = parseFloat(checkif(dueAmnt_portfolio))+parseInt(new Date(dateFormat(formatToDate(scriptContext.newRecord.getValue({fieldId:'custrecord_jj_check_due_date'})))).getTime())*parseFloat(scriptContext.newRecord.getValue({fieldId:'custrecord_jj_check_amount'}));
        		}
        		else
        			if(scriptContext.type=='edit'){
        				var duedate = (parseFloat(checkif(dueAmnt_portfolio))-parseInt(new Date(dateFormat(formatToDate(scriptContext.oldRecord.getValue({fieldId:'custrecord_jj_check_due_date'})))).getTime())*parseFloat(scriptContext.oldRecord.getValue({fieldId:'custrecord_jj_check_amount'})))+(parseInt(new Date(dateFormat(formatToDate(scriptContext.newRecord.getValue({fieldId:'custrecord_jj_check_due_date'})))).getTime())*parseFloat(scriptContext.newRecord.getValue({fieldId:'custrecord_jj_check_amount'})));
        			}
        			else 
        				if(scriptContext.type=='delete'){
        					var duedate = parseFloat(checkif(dueAmnt_portfolio))-parseInt(new Date(dateFormat(formatToDate(scriptContext.newRecord.getValue({fieldId:'custrecord_jj_check_due_date'})))).getTime())*parseFloat(scriptContext.newRecord.getValue({fieldId:'custrecord_jj_check_amount'}));
        				}
        		
        	
        		var avrgDueDate=dateFormatOld(new Date(checkif(duedate)/checkif(totalAmount)));

        		
        		var checkNo = objRecord.getValue({
    			    fieldId: 'custrecord_jj_portfolio_check_nos'
    			});

        		if(scriptContext.type=='create'){
        		var numbr_ofChque = parseInt(checkNo+1)
        		}
        		else 
        			if(scriptContext.type=='edit'){
        			var numbr_ofChque = checkNo
        		}
        		else 
        			if(scriptContext.type=='delete'){
        				var numbr_ofChque= parseInt(checkNo-1)
        		}
        		
        		var otherId = record.submitFields({
        			type: 'customrecord_jj_portfolio',
        			id: portfolioId,
        			values: {
        				'custrecord_jj_portfolio_check_nos':  numbr_ofChque,
        				'custrecord_jj_portfolio_total_amount' :totalAmount,
        				'custrecord_jj_portfolio_avg_due_date': avrgDueDate,
        				'custrecord_jj_portfolio_amountdue': duedate
        			}
        		});

        }
        catch(err)
        {
        	log.debug("err",err);
        }
    }

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

Client Script

/**
 * @NApiVersion 2.x
 * @NScriptType ClientScript
 * @NModuleScope SameAccount
 */

define(['N/currentRecord','N/url','N/search','N/record', '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(currentRecord,resolveurl,search,record,message) {
//	var orgChq_amnt;
	var flag;
    /**
     * 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 makePayment(scriptContext)
     {
        try{
        	// to craete an object
        	var chequeObj ={};
        	
        	// to get the no.of lines in current sublist 
        	var rec = currentRecord.get();
        	var numLines = rec.getLineCount({
        		sublistId: 'custpage_invoice_for_check'
        	});
        	console.log("numLines="+numLines)
        	// to get the Cheque name
        	for(var i=0;i<numLines;i++){
        		var cheqAmount = rec.getSublistValue({
        		    sublistId: 'custpage_invoice_for_check',
        		    fieldId: 'custpage_cheque_amount',
        		    line: i
        		});
        		var checkid = rec.getSublistText({
        		    sublistId: 'custpage_invoice_for_check',
        		    fieldId:'custpage_invoice_check', //'custpage_cheque_id',
        		    line: i
        		});
        		console.log("cheqAmount="+cheqAmount+"checkid= "+checkid)
        		if(cheqAmount && checkid)
        			{
        			// to get the invoice
        			if(!(checkid in chequeObj))
        				{
        				chequeObj[checkid]={};
        				// to get the balance amount
        				var balanceAmtAndID = getBalanceAmountFromCheque(checkid);
        				console.log("balanceAmtAndID="+balanceAmtAndID)
        				chequeObj[checkid]["BalanceAmt"]=balanceAmtAndID.balanceAmt;
        				chequeObj[checkid]["ID"]=balanceAmtAndID.ID;
        				chequeObj[checkid]["InvoiceArray"]= [];
        				chequeObj[checkid]["AmountArray"]= [];
        				chequeObj[checkid]["SumAmt"]=0;
        				chequeObj[checkid]["toDeduct"]=0;
        				}
        			// to enter invoice
        			var invIdnum = rec.getSublistValue({
            		    sublistId: 'custpage_invoice_for_check',
            		    fieldId: 'custpage_invoice_id',
            		    line: i
            		});
        			chequeObj[checkid]["InvoiceArray"].push(invIdnum);
        			chequeObj[checkid]["AmountArray"].push(cheqAmount);
        			chequeObj[checkid]["SumAmt"] =  parseFloat(chequeObj[checkid]["SumAmt"])+parseFloat(cheqAmount);
        			}
                else if(cheqAmount!=null && cheqAmount!= undefined && cheqAmount!="" && (checkid==null || checkid== undefined || checkid==""))
                {
                  alert("You have not entered Cheque Id for some invoices");
                }
                else if(checkid!=null && checkid!= undefined && checkid!="" && (cheqAmount==null || cheqAmount== undefined || cheqAmount==""))
                    {
                       alert("You have not entered Cheque amount for some invoices cheque Id ="+checkid);  
                    }
        	}
        	// to show chequeObj
        	console.log("chequeObj="+JSON.stringify(chequeObj))
        	var toReject ={},toPayment={};
        	// loop for checking include or exclude from Payment
        	for(var key in chequeObj)
        		{
        		if(chequeObj[key]["SumAmt"]>chequeObj[key]["BalanceAmt"])
        			{
        			toReject[key] =chequeObj[key];
        			}
        		else
        			{
        			toPayment[key] =chequeObj[key];
        			}
        		}
        	console.log("toReject="+JSON.stringify(toReject))
        	console.log("toPayment="+JSON.stringify(toPayment))
        	
        	if((Object.keys(toPayment)).length)
        		{
        		
        		var keyValues = (Object.values(toPayment))[0]["InvoiceArray"][0];
        		console.log("keyValues="+keyValues);
        		// to craete payment
        		var objRecord = record.transform({
            	    fromType: record.Type.INVOICE,
            	    fromId: keyValues,
            	    toType: record.Type.CUSTOMER_PAYMENT,
            	    isDynamic: true
            	});
        		var numLinesobj = objRecord.getLineCount({
            	    sublistId: 'apply'
            	});
            	console.log('numLinesobj',numLinesobj)
            	objRecord.setValue({
            		fieldId: 'undepfunds',
            		value: 'F'
            	});
            	objRecord.setValue({
            		fieldId: 'account',
            		value: '748'
            	});

        		
        	// to select Invoices
        	var l=0;
        	for(var key in toPayment)
        		{
        		console.log('Object.values(toPayment)[l]',Object.values(toPayment)[l]);
        		console.log('Object.values(toPayment)[l]["InvoiceArray"]',Object.values(toPayment)[l]["InvoiceArray"]);
        		for(var i=0;i<Object.values(toPayment)[l]["InvoiceArray"].length;i++)
        		{
					for(var j=0;j<numLinesobj;j++)
						{
						var invoice = objRecord.getSublistValue({
		            	    sublistId: 'apply',
		            	    fieldId: 'internalid',
		            	    line: j
		            	});
						console.log('Object.values(toPayment)[key]["InvoiceArray"][i]='+Object.values(toPayment)[l]["InvoiceArray"][i])
						if(Object.values(toPayment)[l]["InvoiceArray"][i]==invoice)
						{
							objRecord.selectLine({
	        					sublistId: 'apply',
	        					line: j
	        				});
	        				objRecord.setCurrentSublistValue({
	        				    sublistId: 'apply',
	        				    fieldId: 'apply',
	        				    value: true  
	        				});
	        				var amountToPay =objRecord.getCurrentSublistValue({
	        				    sublistId: 'apply',
	        				    fieldId: 'amount'
	        				}); 
	        				objRecord.setCurrentSublistValue({
	        				    sublistId: 'apply',
	        				    fieldId: 'amount',
	        				    value: Object.values(toPayment)[l]["AmountArray"][i]  
	        				});
//add condition to add the set amount for balance amount in check
	        				
	        				if(amountToPay<Object.values(toPayment)[l]["AmountArray"][i] )
	        					{
	        					
	        					Object.values(toPayment)[l]["toDeduct"] = (parseFloat(Object.values(toPayment)[l]["toDeduct"])+parseFloat(amountToPay)).toFixed(2);
	        					
	        					
	        					}else
	        						{
	        						Object.values(toPayment)[l]["toDeduct"] = (parseFloat(Object.values(toPayment)[l]["toDeduct"])+parseFloat(Object.values(toPayment)[l]["AmountArray"][i])).toFixed(2);
		        					
	        						}
	        			
	        				
	        				objRecord.commitLine({
	        				    sublistId: 'apply'
	        				});
						}
						}						
        		}
        		l++;
        		}
        	// to set "custbody_mbs7_jj_invoice_amt_json"
        	objRecord.setValue({
        		fieldId: 'custbody_mbs7_jj_invoice_amt_json',
        		value: JSON.stringify(toPayment)
        	});
        	
        	var test =  objRecord.getValue({
        		fieldId: 'custbody_mbs7_jj_invoice_amt_json'
        	});
        	console.log('toPayment out of loop',JSON.stringify(toPayment))	
        	console.log("test wthout parsing=",test)
        	console.log("test wth parsing=",JSON.parse(test))
        	
        	var paymentId=objRecord.save();
        	alert("You have successfully created Payment record with ID="+paymentId)
        		}
        	// to set the Cheque to Balance Amount
        	for(var key in toPayment)
    		{
        		try{
        			console.log("ID INN="+toPayment[key]["ID"])
        			console.log("VAlue INN="+toPayment[key]["toDeduct"])
        			// to get the internalID of Cheque
        			var Ids =record.submitFields({
        				type: 'customrecord_jj_checkordraft',
        			    id:toPayment[key]["ID"],
        			    values: {
        			        'custrecord_mbs7_balance_amt_cust': parseFloat(toPayment[key]["BalanceAmt"]-toPayment[key]["toDeduct"])
        			    }
        			});
        			
        		}catch(e)
        		{
        			console.log("Err@ FN =",e.message);
        		}
        	   
    		}
        	console.log('toPayment out of loop',JSON.stringify(toPayment))	
        	setRejectedValues(toReject);
        	
        	
        }catch(err){
        	alert('Payment Record not generated:'+err.message)
        	console.log('error @ makePayment',err)
        }
          


     }
     
     function setRejectedValues(toReject)
     {  console.log("toReject=",toReject);
    		try{
    			  var URL =window.location.href;
    			  console.log("URL=",URL);
    			  // to remove the unwanted rejected Object members
    			  URL = URL.split("&rejectedObj")[0];
    			  console.log("URL=",URL);
    		window.location.href =URL+"&rejectedObj="+JSON.stringify(toReject);
    		
    		}catch(e)
    		{
    			
    			console.log("Err@ FN =",e.message);
    		}
    	   
     }
    
     function getParameterByName(name, url) {
         if (!url)
             url = window.location.href;
         name = name.replace(/[\[\]]/g, "\\$&");
         var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
             results = regex
             .exec(url);
         if (!results)
             return null;
         if (!results[2])
             return ' ';
         return decodeURIComponent(results[2].replace(/\+/g, " "));
     }
    function pageInit(scriptContext) {
	
    	try{
    		//avoid the standard NetSuite warning message when navigating away
    	    if (window.onbeforeunload) {
    	        window.onbeforeunload = function() {
    	            null;
    	        };
    	    }
    		 var URL =window.location.href;
    		 var rejectedObj=getParameterByName("rejectedObj",URL);
    		 console.log('rejectedObj=',rejectedObj);
    		 if(JSON.stringify(rejectedObj)!='"{}"' && rejectedObj!=null && rejectedObj!=undefined && rejectedObj!="" && rejectedObj!=" ")
    			 {
    			 message.create({
                     title: "Message",
                     message: "Some Payment record cannot be created because of Amount entered does not match with Balance amount",
                     type: message.Type.CONFIRMATION
                 }).show({
                     duration: 15000
                 });
    			 }
    		 console.log('JSON.stringify(rejectedObj)=',JSON.stringify(rejectedObj));
    		 console.log('JSON.parse(rejectedObj)=',JSON.parse(rejectedObj));
    		 setValuesInSublist(JSON.parse(rejectedObj));
    		 
    		
    	}catch(e)
    	{
    		console.log("Err@ FN =",e.message);
    	}
       
    	 
    }
    
    function setValuesInSublist(rejectedObj)
    {
    	try{
    		var rec = currentRecord.get();
    		var numLines = rec.getLineCount({
        		sublistId: 'custpage_invoice_for_check'
        	});
        	
        	// to get the Cheque name
        	for(var i=0;i<numLines;i++){
        		var invoiceId = rec.getSublistValue({
        		    sublistId: 'custpage_invoice_for_check',
        		    fieldId: 'custpage_invoice_id',
        		    line: i
        		});
        		console.log("invoiceId="+invoiceId)
        		var l=0;
        			for(var key in rejectedObj)
            		{
        				for(var j=0;j<Object.values(rejectedObj)[l]["InvoiceArray"].length;j++)
                		{
        					console.log('Object.values(rejectedObj)[l]["InvoiceArray"][j]=',Object.values(rejectedObj)[l]["InvoiceArray"][j]);
        					if(invoiceId==Object.values(rejectedObj)[l]["InvoiceArray"][j])
                			{
        						var lineNum = rec.selectLine({
        						    sublistId: 'custpage_invoice_for_check',
        						    line: i
        						});
        						rec.setCurrentSublistValue({
        		        		    sublistId: 'custpage_invoice_for_check',
        		        		    fieldId: 'custpage_cheque_amount',
        		        		    value:Object.values(rejectedObj)[l]["AmountArray"][j]/*,
        		        		    line: i*/
        		        		});
        						console.log('Object.keys(rejectedObj)='+Object.keys(rejectedObj))
        						rec.setCurrentSublistValue({
        		        		    sublistId: 'custpage_invoice_for_check',
        		        		    fieldId: 'custpage_invoice_check',
        		        		    value:Object.keys(rejectedObj)
        		        		});
        						rec.commitLine({
        							sublistId: 'custpage_invoice_for_check'
        						});
        		        		
        						
        						
                		}
        				
            		}
        				l++;
        			}
        	}
    		
    		
    	}catch(e)
    	{
    		//log.debug("Err@ FN ",e.message);
    		//log.error("Err@ onAction FN ",e.message);
    		console.log("Err@ FN setValuesInSublist=",e.message);
    	}
       
    }
    
    /*****
     * Function to get the balance amount from the Cheque 
     */
    function getBalanceAmountFromCheque(checkid)
    {
    	try{
    		var balanceAmt;
    		// craete a search to get the amount
    		var customrecord83SearchObj = search.create({
        		type: "customrecord_jj_checkordraft",
        		filters:
        			[
        				["name","is",checkid]
        				],
        					columns:
        						[
        							search.createColumn({name: "custrecord_mbs7_balance_amt_cust", label: "Amount"}),
        							 search.createColumn({name: "internalid", label: "Internal ID"}),
        							search.createColumn({
        						         name: "name",
        						         sort: search.Sort.ASC,
        						         label: "Name"
        						      })
        							]
        	});
        	 var searchResult = customrecord83SearchObj.run().getRange({
					start: 0,
					end: 1
				});
        	 //console.log("searchResult="+JSON.stringify(searchResult))
        	 if(searchResult.length>0)
        		 {
        		 balanceAmt = searchResult[0].getValue({
    				 name: "custrecord_mbs7_balance_amt_cust"
    				});
        		 ID = searchResult[0].getValue({
    				 name: "internalid"
    				});
        		 }
        	 var obj ={};
        	 obj.balanceAmt=balanceAmt;
        	 obj.ID=ID;
        	 console.log('obj='+JSON.stringify(obj));
        	 return obj;
    		
    	}catch(e)
    		{
    			console.log("Err@ getBalanceAmountFromCheque FN =",e.message);
    		}
    }

    /**
     * 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) {
    	try{
    		//console.log('scriptContext.fieldId',scriptContext.fieldId)
    		if(scriptContext.fieldId=='custpage_invoice_check'){
    			var record = currentRecord.get();
            	console.log('record',record)
            	var field = scriptContext.fieldId 
            	log.debug('field',field)
            	var sblistId = scriptContext.sublistId
            	log.debug('sblistId',sblistId)
            	var chequeId = record.getCurrentSublistText({
            		sublistId: sblistId,
            		fieldId: field
            	});
            	if(chequeId){
            		log.debug('chequeId',chequeId)
                	var customrecord83SearchObj = search.create({
                		type: "customrecord_jj_checkordraft",
                		filters:
                			[
                				["name","is",chequeId]
                				],
                					columns:
                						[
                							search.createColumn({name: "custrecord_mbs7_balance_amt_cust", label: "Amount"}),
                							search.createColumn({
                						         name: "name",
                						         sort: search.Sort.ASC,
                						         label: "Name"
                						      })
                							]
                	});
                	 var searchResult = customrecord83SearchObj.run().getRange({
        					start: 0,
        					end: 100
        				});
                	 log.debug('searchResult',searchResult)
                	 for (var j = 0; j<searchResult.length; j++) {
                		 var amnt = searchResult[j].getValue({
        					 name: "custrecord_mbs7_balance_amt_cust"
        					});
                		 log.debug('amnt',amnt)
                		 var chqName = searchResult[j].getValue({
        					 name: "name"
        					});
                		 log.debug('chqName',chqName)

                		 record.setCurrentSublistValue({
                			    sublistId: sblistId,
                			    fieldId:'custpage_cheque_amount',
                			    value:amnt
                			});
                		 record.setCurrentSublistValue({
             			    sublistId: sblistId,
             			    fieldId:'custpage_cheque_id',
             			    value:chqName
             			});

                	 }
                	
            	}else{
            		 record.setCurrentSublistValue({
         			    sublistId: sblistId,
         			    fieldId:'custpage_cheque_amount',
         			    value:null
         			});
            	}
    		} 
//            	if(changed_chequeAmnt > org_amnt)
            	
    		}catch(er){
        		console.log('error @ fieldChanged',er)
        	}
        	
        	
    	}
    	
    	/**
         * 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) {
        	try{
        		if(scriptContext.fieldId=='custpage_cheque_amount'){
        			
        			var record = scriptContext.currentRecord;
        			console.log('record',record)
                	var field = scriptContext.fieldId 
                	console.log('field',field)
                	var sblistId = scriptContext.sublistId
                	console.log('sblistId',sblistId)
                	var chequeId = record.getCurrentSublistText({
                		sublistId: sblistId,
                		fieldId: 'custpage_invoice_check'
                	});
                	console.log('chequeId',chequeId)
                	var changed_chequeAmnt = record.getCurrentSublistText({
                		sublistId: sblistId,
                		fieldId: field
                	});
                	console.log('changed_chequeAmnt',changed_chequeAmnt)
                	if(chequeId){
                		log.debug('chequeId',chequeId)
                    	var customrecord83SearchObj = search.create({
                    		type: "customrecord_jj_checkordraft",
                    		filters:
                    			[
                    				["name","is",chequeId]
                    				],
                    					columns:
                    						[
                    							search.createColumn({name: "custrecord_jj_check_amount", label: "Amount"}),
                    							
                    							]
                    	});
                    	 var searchResult = customrecord83SearchObj.run().getRange({
            					start: 0,
            					end: 100
            				});
                    	 console.log('searchResult',searchResult)
                    	 for (var j = 0; j<searchResult.length; j++) {
                    		 var org_amnt = searchResult[j].getValue({
            					 name: "custrecord_jj_check_amount"
            					});
                    		 console.log('org_amnt',org_amnt)
                    	 }
                    	
                	
                	}
                	
        		}
        		parsed_changed_chequeAmnt = parseFloat(changed_chequeAmnt)
        		console.log('parsed_changed_chequeAmnt',parsed_changed_chequeAmnt)
        		if(parsed_changed_chequeAmnt > org_amnt){
            		console.log('error')
            		flag=true;
            		alert('The amount entered is not valid.Please enter a lesser amount')
            		flag=false;
            		return false;
            	}
             
        	}catch(err){
        		console.log('error @ validateField',err)
        	}
        	return true;

        }
    	
    

    return {
        pageInit: pageInit,
       makePayment:makePayment,
       fieldChanged:fieldChanged,
       validateField:validateField
        
    };
    
});

When Payment is deleted, amount changes ( Userevent script: MBS 7 UE JJ Delete Customer Payment)

/**
 * @NApiVersion 2.x
 * @NScriptType UserEventScript
 * @NModuleScope SameAccount
 */
/*******************************************************************************
 * Moneta Business Solutions
 * MBS-7 | Delete Payment record
 * **************************************************************************
 * Date : ${30/01/2019}
 * 
 * Author: Jobin & Jismi IT Services LLP
 * Script Description : This triggers when a Customer Payment is deleted
 * Date Created :30-Jan-2019
 *
 * REVISION HISTORY
 * 
 * Revision 1.0 ${30/01/2019} aj : created
 * 
 ******************************************************************************/
define(['N/record', 'N/search'],
/**
 * @param {record} record
 * @param {search} search
 */
function(record, search) {
   
   /**
    * Function to get the current balance amount from cheque
    */
	 function getCurrentBalanceAmtFromCheque(id) {
		 try{
			 // create a search
			 var customrecord_jj_checkordraftSearchObj = search.create({
				   type: "customrecord_jj_checkordraft",
				   filters:
				   [
				      ["internalidnumber","equalto",id]
				   ],
				   columns:
				   [
				      search.createColumn({name: "internalid", label: "Internal ID"}),
				      search.createColumn({name: "custrecord_mbs7_balance_amt_cust", label: "Balance Amount from Customer"})
				   ]
				});
				var searchResultCount = customrecord_jj_checkordraftSearchObj.runPaged().count;
				
				
				var searchResult = customrecord_jj_checkordraftSearchObj.run().getRange({
					start: 0,
					end: 1
				});
        	 //console.log("searchResult="+JSON.stringify(searchResult))
        	 if(searchResult.length>0)
        		 {
        		var balanceAmt = searchResult[0].getValue({
    				 name: "custrecord_mbs7_balance_amt_cust"
    				});
        		
        		 }
        	
        	 return balanceAmt;
			}catch(e)
			{
				log.error("Err@ getCurrentBalanceAmtFromCheque FN ",e.message);
				
			}
		   
	 }

    /**
     * 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
    	{
    		if(scriptContext.type=='delete')
    			{
    			// to get current record
        		var currentRecord = scriptContext.newRecord;
        		// to get the current JSON
        		
        		var deleteObj=currentRecord.getValue({
            		fieldId: 'custbody_mbs7_jj_invoice_amt_json'
            	});
        		
        		// to get the keys
        		
        		// to parse
        		deleteObj = JSON.parse(deleteObj);
        		// for setting the balance Amt
        		for(var key in deleteObj)
        			{
        			
        			var currentBalanceAmt = getCurrentBalanceAmtFromCheque(deleteObj[key]["ID"]);
        			
        			
        			var newAmount = parseFloat(currentBalanceAmt)+parseFloat(deleteObj[key]["toDeduct"]);
        			// to submit cheque balance amount
        			var chequeID = record.submitFields({
        				type: 'customrecord_jj_checkordraft',
        			    id:deleteObj[key]["ID"],
        			    values: {
        			        'custrecord_mbs7_balance_amt_cust':newAmount.toFixed(2)
        			    }
        			});
        			
        			}
        		
    			}
    		
    		
    		
    	}catch(e)
    	{
    		log.error("Err@ FN afterSubmit",e.message);
    		
    		
    	}

    }

    return {
       
        afterSubmit: afterSubmit
    };
    
});

Leave a comment

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