diff --git a/erpnext/hr/doctype/payroll_entry/payroll_entry.js b/erpnext/hr/doctype/payroll_entry/payroll_entry.js
index cc10d70..7f4769c 100644
--- a/erpnext/hr/doctype/payroll_entry/payroll_entry.js
+++ b/erpnext/hr/doctype/payroll_entry/payroll_entry.js
@@ -104,9 +104,9 @@
 					frm.set_value('end_date', r.message.end_date);
 				}
 			}
-		})
+		});
 	},
-})
+});
 
 // Create salary slips
 
@@ -119,7 +119,7 @@
 let submit_salary_slip = function (frm) {
 	var doc = frm.doc;
 	return $c('runserverobj', { 'method': 'submit_salary_slips', 'docs': doc });
-}
+};
 
 let make_bank_entry = function (frm) {
 	var doc = frm.doc;
@@ -136,4 +136,4 @@
 	} else {
 		frappe.msgprint(__("Company, From Date and To Date is mandatory"));
 	}
-}
+};
diff --git a/erpnext/hr/doctype/payroll_entry/payroll_entry.py b/erpnext/hr/doctype/payroll_entry/payroll_entry.py
index a77df95..b36afa3 100644
--- a/erpnext/hr/doctype/payroll_entry/payroll_entry.py
+++ b/erpnext/hr/doctype/payroll_entry/payroll_entry.py
@@ -47,9 +47,6 @@
 					and t1.name = t2.employee
 			%s """% cond, {"sal_struct": sal_struct})
 			return emp_list
-		else:
-			frappe.msgprint(_("No active or default Salary Structure found for employee {0} for the given dates")
-				.format(self	.employee), title=_('Salary Structure Missing'))
 
 	def get_filter_condition(self):
 		self.check_mandatory()
@@ -107,14 +104,9 @@
 					ss_dict = {}
 					ss_dict["Employee Name"] = ss.employee_name
 					ss_dict["Total Pay"] = fmt_money(ss.rounded_total,currency = frappe.defaults.get_global_default("currency"))
-					ss_dict["Salary Slip"] = self.format_as_links(ss.name)[0]
+					ss_dict["Salary Slip"] = format_as_links(ss.name)[0]
 					ss_list.append(ss_dict)
-		return self.create_log(ss_list)
-
-	def create_log(self, ss_list):
-		if not ss_list or len(ss_list) < 1:
-			frappe.throw(_("No employee for the above selected criteria OR salary slip already created"))
-		return
+		return create_log(ss_list)
 
 	def get_sal_slip_list(self, ss_status, as_dict=False):
 		"""
@@ -146,8 +138,8 @@
 			ss_dict = {}
 			ss_dict["Employee Name"] = ss_obj.employee_name
 			ss_dict["Total Pay"] = fmt_money(ss_obj.net_pay,
-				currency = frappe.defaults.get_global_default("currency"))	
-			ss_dict["Salary Slip"] = self.format_as_links(ss_obj.name)[0]
+				currency = frappe.defaults.get_global_default("currency"))
+			ss_dict["Salary Slip"] = format_as_links(ss_obj.name)[0]
 
 			if ss_obj.net_pay<0:
 				not_submitted_ss.append(ss_dict)
@@ -162,21 +154,7 @@
 			jv_name = self.make_accural_jv_entry()
 			frappe.msgprint(_("Salary Slip submitted from {0} to {1}").format(ss_obj.start_date, ss_obj.end_date))
 
-		return self.create_submit_log(submitted_ss, not_submitted_ss, jv_name)
-
-	def create_submit_log(self, submitted_ss, not_submitted_ss, jv_name):
-
-		if not submitted_ss and not not_submitted_ss:
-			frappe.msgprint("No salary slip found to submit for the above selected criteria OR salary slip already submitted")
-
-		if not_submitted_ss:
-			frappe.msgprint("Not submitted Salary Slip <br>\
-				Possible reasons: <br>\
-				1. Net pay is less than 0. <br>\
-				2. Company Email Address specified in employee master is not valid. <br>")
-		return
-	def format_as_links(self, salary_slip):
-		return ['<a href="#Form/Salary Slip/{0}">{0}</a>'.format(salary_slip)]
+		return create_submit_log(submitted_ss, not_submitted_ss, jv_name)
 
 	def get_total_salary_and_loan_amounts(self):
 		"""
@@ -229,7 +207,7 @@
 			account = self.get_salary_component_account(s)
 			account_dict[account] = account_dict.get(account, 0) + a
 		return account_dict
-	
+
 	def get_default_payroll_payable_account(self):
 		payroll_payable_account = frappe.db.get_value("Company",
 			{"company_name": self.company}, "default_payroll_payable_account")
@@ -433,4 +411,22 @@
 			'month_days': month_days
 		})
 	else:
-		frappe.throw(_("Fiscal Year {0} not found").format(year))
\ No newline at end of file
+		frappe.throw(_("Fiscal Year {0} not found").format(year))
+
+def create_log(ss_list):
+	if not ss_list or len(ss_list) < 1:
+		frappe.throw(_("No employee for the above selected criteria OR salary slip already created"))
+
+def format_as_links(salary_slip):
+	return ['<a href="#Form/Salary Slip/{0}">{0}</a>'.format(salary_slip)]
+
+def create_submit_log(submitted_ss, not_submitted_ss, jv_name):
+
+	if not submitted_ss and not not_submitted_ss:
+		frappe.msgprint("No salary slip found to submit for the above selected criteria OR salary slip already submitted")
+
+	if not_submitted_ss:
+		frappe.msgprint("Not submitted Salary Slip <br>\
+			Possible reasons: <br>\
+			1. Net pay is less than 0. <br>\
+			2. Company Email Address specified in employee master is not valid. <br>")
\ No newline at end of file
diff --git a/erpnext/hr/doctype/payroll_entry/test_set_salary_components.js b/erpnext/hr/doctype/payroll_entry/test_set_salary_components.js
new file mode 100644
index 0000000..8ff5515
--- /dev/null
+++ b/erpnext/hr/doctype/payroll_entry/test_set_salary_components.js
@@ -0,0 +1,61 @@
+QUnit.module('HR');
+
+QUnit.test("test: Set Salary Components", function (assert) {
+	assert.expect(5);
+	let done = assert.async();
+
+	frappe.run_serially([
+		() => frappe.set_route('Form', 'Salary Component', 'Leave Encashment'),
+		() => {
+			var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
+			row.company = 'For Testing';
+			row.default_account = 'Salary - FT';
+		},
+
+		() => cur_frm.save(),
+		() => frappe.timeout(2),
+		() => assert.equal(cur_frm.doc.accounts[0].default_account, 'Salary - FT'),
+
+		() => frappe.set_route('Form', 'Salary Component', 'Basic'),
+		() => {
+			var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
+			row.company = 'For Testing';
+			row.default_account = 'Salary - FT';
+		},
+
+		() => cur_frm.save(),
+		() => frappe.timeout(2),
+		() => assert.equal(cur_frm.doc.accounts[0].default_account, 'Salary - FT'),
+
+		() => frappe.set_route('Form', 'Salary Component', 'Income Tax'),
+		() => {
+			var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
+			row.company = 'For Testing';
+			row.default_account = 'Salary - FT';
+		},
+
+		() => cur_frm.save(),
+		() => frappe.timeout(2),
+		() => assert.equal(cur_frm.doc.accounts[0].default_account, 'Salary - FT'),
+
+		() => frappe.set_route('Form', 'Salary Component', 'Arrear'),
+		() => {
+			var row = frappe.model.add_child(cur_frm.doc, "Salary Component Account", "accounts");
+			row.company = 'For Testing';
+			row.default_account = 'Salary - FT';
+		},
+
+		() => cur_frm.save(),
+		() => frappe.timeout(2),
+		() => assert.equal(cur_frm.doc.accounts[0].default_account, 'Salary - FT'),
+
+		() => frappe.set_route('Form', 'Company', 'For Testing'),
+		() => cur_frm.set_value('default_payroll_payable_account', 'Payroll Payable - FT'),
+		() => cur_frm.save(),
+		() => frappe.timeout(2),
+		() => assert.equal(cur_frm.doc.default_payroll_payable_account, 'Payroll Payable - FT'),
+
+		() => done()
+
+	]);
+});
diff --git a/erpnext/tests/ui/tests.txt b/erpnext/tests/ui/tests.txt
index a5dcbcb..08fc9c3 100644
--- a/erpnext/tests/ui/tests.txt
+++ b/erpnext/tests/ui/tests.txt
@@ -78,6 +78,7 @@
 erpnext/hr/doctype/loan_type/test_loan_type.js
 erpnext/hr/doctype/employee_loan_application/test_employee_loan_application.js
 erpnext/hr/doctype/employee_loan/test_employee_loan.js
+erpnext/hr/doctype/payroll_entry/test_set_salary_components.js
 erpnext/hr/doctype/payroll_entry/test_payroll_entry.js
 erpnext/buying/doctype/supplier/test_supplier.js
 erpnext/buying/doctype/request_for_quotation/tests/test_request_for_quotation.js
