Recalculate on Save and by button click

Hi All,
I have been struggling to have finished but did not find the right way of doing so… As you can see the below code I have actions performed on Deduction and they work well but not able to have it working when user click on Button “Calcular IRT” and when to VALIDATE.
I need to access doc.earnings and doc.deductions when VALIDATE and when user clicks the button.

HERE IS MY CODE:

frappe.ui.form.on("Salary Structure Deduction","deduction_type", function(frm, cdt, cdn) {
var d =locals[cdt][cdn]
var item=frappe.get_doc(cdt,cdn);

//Get IRT 
var tbl1 = frm.doc.earnings || [];
var tbl2 = frm.doc.deductions || [];

for(var i = 0; i < tbl1.length; i++){
	if (tbl1[i].earning_type=="Salario Base") {
		var a =flt(tbl1[i].modified_value);
		frappe.call({
			method: "erpnext.hr.doctype.salary_structure.irt.get_irt",
			args: {
				"start":a,
			},
			callback: function(r) {
//msgprint(r.message[0]);
if (r.message[0].valor_inicio){
				irt = flt(a)- r.message[0].valor_inicio;
				irt = (irt * r.message[0].valor_percentual /100) + r.message[0].parcela_fixa;
//msgprint(r.message[0].valor_inicio + " " +r.message[0].valor_percentual + " " + r.message[0].parcela_fixa);		
		//inss = flt(a) * inss;	
}
if (r.message[0][0]){
				irt = flt(a)- r.message[0][0];
				irt = (irt * r.message[0][2] /100) + r.message[0][3];
msgprint(r.message[0][0] + " " +r.message[0][1] + " " + r.message[0][2]+ " " + r.message[0][3]);		
		//inss = flt(a) * inss;	

}
			},
		});
	}
}

if(d.deduction_type == "IRT"){
	//call IRT 
	frappe.model.set_value(cdt, cdn, "d_modified_amt", irt);
	cur_frm.refresh_fields();

}

if(d.deduction_type == "INSS"){
	frappe.model.set_value(cdt, cdn, "d_modified_amt", flt(a) * inss /100);
	cur_frm.refresh_fields();

}


});

frappe.ui.form.on("Salary Structure", "validate", function (doc, cdt,cdn) {
    var grid_row = cur_frm.open_grid_row();
//    grid_row.fields_dict.student.set_value("Testing");
//cur_frm.script_manager.trigger("d_modified_amt",, d.name);

msgprint("form Validar " + doc + " " + cdt + " cdn " + cdn);
msgprint("Doc " + cdn);

})



frappe.ui.form.on("Salary Structure", {
	refresh: function(frm, cdt, cdn) {

 cur_frm.add_custom_button(__('Calcular IRT'),function(doc) {
  msgprint("botao"); 

//Get IRT 
var tbl1 = frm.doc.earnings || [];
var tbl2 = frm.doc.deductions || [];

for(var i = 0; i < tbl1.length; i++){
	if (tbl1[i].earning_type=="Salario Base") {
		var a =flt(tbl1[i].modified_value);
		frappe.call({
			method: "erpnext.hr.doctype.salary_structure.irt.get_irt",
			args: {
				"start":a,
			},
			callback: function(r) {
//msgprint(r.message);
if (r.message[0].valor_inicio){
				irt = flt(a)- r.message[0].valor_inicio;
				irt = (irt * r.message[0].valor_percentual /100) + r.message[0].parcela_fixa;
//msgprint(r.message[0].valor_inicio + " " +r.message[0].valor_percentual + " " + r.message[0].parcela_fixa);		
		//inss = flt(a) * inss;	
}
if (r.message[0][0]){
				irt = flt(a)- r.message[0][0];
				irt = (irt * r.message[0][2] /100) + r.message[0][3];
//msgprint("IRT0 " + irt + " " + r.message[0][0] + " " +r.message[0][1] + " " + r.message[0][2]+ " " + r.message[0][3]);		
		//inss = flt(a) * inss;	

}
			},
		});
	}
}

for(var i = 0; i < tbl2.length; i++){
	if (tbl2[i].deduction_type=="IRT") {
//msgprint(frm.doc.deductions + " I " + i);

//msgprint("IRT1 " + irt + frm.doc.deductions[i]);
 }
}



 }); //FIM Botao

}
});

@Helio_Jesus best way to do this is server side validation

@rmehta Thanks for the tip and can you please guide me on how can I reach this and where to start?