old_contents: # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  # License: GNU General Public License v3. See license.txt
  
  from __future__ import unicode_literals
  import frappe
  
  from frappe.utils import flt, cint
  from frappe import _
  from frappe.model.mapper import get_mapped_doc
  from frappe.model.document import Document
  from erpnext.hr.utils import set_employee_name
  
  class SalaryStructure(Document):
  	
  	def validate(self):
  		self.validate_amount()
  		for e in self.get('employees'):
  			set_employee_name(e)
  
  	def get_ss_values(self,employee):
  		basic_info = frappe.db.sql("""select bank_name, bank_ac_no
  			from `tabEmployee` where name =%s""", employee)
  		ret = {'bank_name': basic_info and basic_info[0][0] or '',
  			'bank_ac_no': basic_info and basic_info[0][1] or ''}
  		return ret
  
  	def validate_amount(self):
  		if flt(self.net_pay) < 0 and self.salary_slip_based_on_timesheet:
  			frappe.throw(_("Net pay cannot be negative"))
  				
  
  @frappe.whitelist()
  def make_salary_slip(source_name, target_doc = None, employee = None, as_print = False, print_format = None):
  	def postprocess(source, target):
  		if employee:
  			target.employee = employee
  		target.run_method('process_salary_structure')
  
  	doc = get_mapped_doc("Salary Structure", source_name, {
  		"Salary Structure": {
  			"doctype": "Salary Slip",
  			"field_map": {
  				"total_earning": "gross_pay",
  				"name": "salary_structure"
  			}
  		}
  	}, target_doc, postprocess, ignore_child_tables=True)
  
  	if cint(as_print):
  		doc.name = 'Preview for {0}'.format(employee)
  		return frappe.get_print(doc.doctype, doc.name, doc = doc, print_format = print_format)
  	else:
  		return doc
  
  
  @frappe.whitelist()
  def get_employees(**args):
  	return frappe.get_list('Employee',filters=args['filters'], fields=['name', 'employee_name'])
  
new_contents: # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  # License: GNU General Public License v3. See license.txt
  
  from __future__ import unicode_literals
  import frappe
  
  from frappe.utils import flt, cint
  from frappe import _
  from frappe.model.mapper import get_mapped_doc
  from frappe.model.document import Document
  from erpnext.hr.utils import set_employee_name
  
  class SalaryStructure(Document):
  	
  	def validate(self):
  		self.validate_amount()
  		self.validate_joining_date()
  		for e in self.get('employees'):
  			set_employee_name(e)
  
  	def get_ss_values(self,employee):
  		basic_info = frappe.db.sql("""select bank_name, bank_ac_no
  			from `tabEmployee` where name =%s""", employee)
  		ret = {'bank_name': basic_info and basic_info[0][0] or '',
  			'bank_ac_no': basic_info and basic_info[0][1] or ''}
  		return ret
  
  	def validate_amount(self):
  		if flt(self.net_pay) < 0 and self.salary_slip_based_on_timesheet:
  			frappe.throw(_("Net pay cannot be negative"))
  			
  	def validate_joining_date(self):
  		for e in self.get('employees'):
  			joining_date = getdate(frappe.db.get_value("Employee", e.employee, "date_of_joining"))
  			if e.from_date and getdate(e.from_date) < joining_date:
  				frappe.throw(_("From Date {0} for Employee {1} cannot be before employee's joining Date {2}")
  					    .format(e.from_date, e.employee, joining_date))	
  
  @frappe.whitelist()
  def make_salary_slip(source_name, target_doc = None, employee = None, as_print = False, print_format = None):
  	def postprocess(source, target):
  		if employee:
  			target.employee = employee
  		target.run_method('process_salary_structure')
  
  	doc = get_mapped_doc("Salary Structure", source_name, {
  		"Salary Structure": {
  			"doctype": "Salary Slip",
  			"field_map": {
  				"total_earning": "gross_pay",
  				"name": "salary_structure"
  			}
  		}
  	}, target_doc, postprocess, ignore_child_tables=True)
  
  	if cint(as_print):
  		doc.name = 'Preview for {0}'.format(employee)
  		return frappe.get_print(doc.doctype, doc.name, doc = doc, print_format = print_format)
  	else:
  		return doc
  
  
  @frappe.whitelist()
  def get_employees(**args):
  	return frappe.get_list('Employee',filters=args['filters'], fields=['name', 'employee_name'])
  
subject: Update salary_structure.py