Salary Slip calc tax, except for flexi benefits
This commit is contained in:
parent
c6b2575a9c
commit
b485b1ef80
@ -18,4 +18,13 @@ class SalaryComponent(Document):
|
|||||||
|
|
||||||
self.salary_component_abbr = self.salary_component_abbr.strip()
|
self.salary_component_abbr = self.salary_component_abbr.strip()
|
||||||
self.salary_component_abbr = append_number_if_name_exists('Salary Component', self.salary_component_abbr,
|
self.salary_component_abbr = append_number_if_name_exists('Salary Component', self.salary_component_abbr,
|
||||||
'salary_component_abbr', separator='_', filters={"name": ["!=", self.name]})
|
'salary_component_abbr', separator='_', filters={"name": ["!=", self.name]})
|
||||||
|
|
||||||
|
def calculate_tax(self, annual_earning):
|
||||||
|
taxable_amount = 0
|
||||||
|
for slab in self.taxable_salary_slabs:
|
||||||
|
if annual_earning > slab.from_amount and annual_earning < slab.to_amount:
|
||||||
|
taxable_amount += (annual_earning - slab.from_amount) * slab.percent_deduction *.01
|
||||||
|
elif annual_earning > slab.from_amount and annual_earning > slab.to_amount:
|
||||||
|
taxable_amount += (slab.to_amount - slab.from_amount) * slab.percent_deduction * .01
|
||||||
|
return taxable_amount
|
||||||
|
@ -13,6 +13,7 @@ from erpnext.hr.doctype.employee.employee import get_holiday_list_for_employee
|
|||||||
from erpnext.utilities.transaction_base import TransactionBase
|
from erpnext.utilities.transaction_base import TransactionBase
|
||||||
from frappe.utils.background_jobs import enqueue
|
from frappe.utils.background_jobs import enqueue
|
||||||
from erpnext.hr.doctype.additional_salary_component.additional_salary_component import get_additional_salary_component
|
from erpnext.hr.doctype.additional_salary_component.additional_salary_component import get_additional_salary_component
|
||||||
|
from erpnext.hr.utils import get_payroll_period
|
||||||
|
|
||||||
class SalarySlip(TransactionBase):
|
class SalarySlip(TransactionBase):
|
||||||
def autoname(self):
|
def autoname(self):
|
||||||
@ -58,6 +59,10 @@ class SalarySlip(TransactionBase):
|
|||||||
amount = self.eval_condition_and_formula(struct_row, data)
|
amount = self.eval_condition_and_formula(struct_row, data)
|
||||||
if amount and struct_row.statistical_component == 0:
|
if amount and struct_row.statistical_component == 0:
|
||||||
self.update_component_row(struct_row, amount, key)
|
self.update_component_row(struct_row, amount, key)
|
||||||
|
if key=="deductions" and struct_row.variable_based_on_taxable_salary:
|
||||||
|
tax_row, amount = self.calculate_pro_rata_tax(struct_row.salary_component)
|
||||||
|
if tax_row and amount:
|
||||||
|
self.update_component_row(frappe._dict(tax_row), amount, key)
|
||||||
|
|
||||||
additional_components = get_additional_salary_component(self.employee, self.start_date, self.end_date)
|
additional_components = get_additional_salary_component(self.employee, self.start_date, self.end_date)
|
||||||
if additional_components:
|
if additional_components:
|
||||||
@ -464,6 +469,52 @@ class SalarySlip(TransactionBase):
|
|||||||
status = "Cancelled"
|
status = "Cancelled"
|
||||||
return status
|
return status
|
||||||
|
|
||||||
|
def calculate_pro_rata_tax(self, salary_component):
|
||||||
|
# Calculate total tax payable earnings
|
||||||
|
tax_applicable_components = []
|
||||||
|
for earning in self._salary_structure_doc.earnings:
|
||||||
|
#all tax applicable earnings which are not flexi
|
||||||
|
if earning.is_tax_applicable and not earning.is_flexible_benefit:
|
||||||
|
tax_applicable_components.append(earning.salary_component)
|
||||||
|
total_taxable_earning = 0
|
||||||
|
for earning in self.earnings:
|
||||||
|
if earning.salary_component in tax_applicable_components:
|
||||||
|
total_taxable_earning += earning.amount
|
||||||
|
|
||||||
|
# Get payroll period, prorata frequency
|
||||||
|
days = date_diff(self.end_date, self.start_date) + 1
|
||||||
|
payroll_period = get_payroll_period(self.start_date, self.end_date, self.company)
|
||||||
|
if not payroll_period:
|
||||||
|
frappe.throw(_("Start and end dates not in a valid Payroll Period"))
|
||||||
|
total_days = date_diff(payroll_period.end_date, payroll_period.start_date) + 1
|
||||||
|
prorata_frequency = flt(total_days)/flt(days)
|
||||||
|
annual_earning = total_taxable_earning * prorata_frequency
|
||||||
|
|
||||||
|
# Calculate total exemption declaration
|
||||||
|
exemption_amount = 0
|
||||||
|
if frappe.db.exists("Employee Tax Exemption Declaration", {"employee": self.employee,
|
||||||
|
"payroll_period": payroll_period.parent, "docstatus": 1}):
|
||||||
|
exemption_amount = frappe.db.get_value("Employee Tax Exemption Declaration",
|
||||||
|
{"employee": self.employee, "payroll_period": "2018", "docstatus": 1}, #fix period
|
||||||
|
"total_exemption_amount")
|
||||||
|
annual_earning = annual_earning - exemption_amount
|
||||||
|
|
||||||
|
# Get tax calc by component
|
||||||
|
component = frappe.get_doc("Salary Component", salary_component)
|
||||||
|
annual_tax = component.calculate_tax(annual_earning)
|
||||||
|
|
||||||
|
# Calc prorata tax
|
||||||
|
pro_rata_tax = annual_tax/prorata_frequency
|
||||||
|
|
||||||
|
# Data for update_component_row
|
||||||
|
struct_row = {}
|
||||||
|
struct_row['depends_on_lwp'] = 0
|
||||||
|
struct_row['salary_component'] = component.name
|
||||||
|
struct_row['abbr'] = component.salary_component_abbr
|
||||||
|
struct_row['do_not_include_in_total'] = 0
|
||||||
|
|
||||||
|
return struct_row, pro_rata_tax
|
||||||
|
|
||||||
def unlink_ref_doc_from_salary_slip(ref_no):
|
def unlink_ref_doc_from_salary_slip(ref_no):
|
||||||
linked_ss = frappe.db.sql_list("""select name from `tabSalary Slip`
|
linked_ss = frappe.db.sql_list("""select name from `tabSalary Slip`
|
||||||
where journal_entry=%s and docstatus < 2""", (ref_no))
|
where journal_entry=%s and docstatus < 2""", (ref_no))
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
"columns": 0,
|
"columns": 0,
|
||||||
"fieldname": "to_amount",
|
"fieldname": "to_amount",
|
||||||
"fieldtype": "Data",
|
"fieldtype": "Currency",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
"ignore_xss_filter": 0,
|
"ignore_xss_filter": 0,
|
||||||
@ -147,7 +147,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-04-13 20:09:36.675987",
|
"modified": "2018-05-16 18:18:23.802576",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "HR",
|
"module": "HR",
|
||||||
"name": "Taxable Salary Slab",
|
"name": "Taxable Salary Slab",
|
||||||
|
@ -234,3 +234,10 @@ def get_leave_period(from_date, to_date, company):
|
|||||||
|
|
||||||
if leave_period:
|
if leave_period:
|
||||||
return leave_period
|
return leave_period
|
||||||
|
|
||||||
|
def get_payroll_period(from_date, to_date, company):
|
||||||
|
payroll_period = frappe.db.sql("""select pd.parent, pd.start_date, pd.end_date from
|
||||||
|
`tabPayroll Period Date` pd join `tabPayroll Period` pp on
|
||||||
|
pd.parent=pp.name where pd.start_date<=%s and pd.end_date>= %s
|
||||||
|
and pp.company=%s""", (from_date, to_date, company), as_dict=1)
|
||||||
|
return payroll_period[0] if payroll_period else None
|
||||||
|
Loading…
x
Reference in New Issue
Block a user