fix: Consider any kind of exemptions only if tax exemptions are allowed on tax slab (#21474)
diff --git a/erpnext/hr/doctype/income_tax_slab/income_tax_slab.json b/erpnext/hr/doctype/income_tax_slab/income_tax_slab.json
index 6d89b19..bc6bc5e 100644
--- a/erpnext/hr/doctype/income_tax_slab/income_tax_slab.json
+++ b/erpnext/hr/doctype/income_tax_slab/income_tax_slab.json
@@ -93,13 +93,15 @@
],
"is_submittable": 1,
"links": [],
- "modified": "2020-04-24 12:28:36.805904",
+ "modified": "2020-04-27 20:10:42.755762",
"modified_by": "Administrator",
"module": "HR",
"name": "Income Tax Slab",
"owner": "Administrator",
"permissions": [
{
+ "amend": 1,
+ "cancel": 1,
"create": 1,
"delete": 1,
"email": 1,
@@ -109,9 +111,11 @@
"report": 1,
"role": "System Manager",
"share": 1,
+ "submit": 1,
"write": 1
},
{
+ "amend": 1,
"cancel": 1,
"create": 1,
"delete": 1,
@@ -126,6 +130,7 @@
"write": 1
},
{
+ "amend": 1,
"cancel": 1,
"create": 1,
"delete": 1,
@@ -138,20 +143,6 @@
"share": 1,
"submit": 1,
"write": 1
- },
- {
- "cancel": 1,
- "create": 1,
- "delete": 1,
- "email": 1,
- "export": 1,
- "print": 1,
- "read": 1,
- "report": 1,
- "role": "Administrator",
- "share": 1,
- "submit": 1,
- "write": 1
}
],
"sort_field": "modified",
diff --git a/erpnext/hr/doctype/salary_component/salary_component.json b/erpnext/hr/doctype/salary_component/salary_component.json
index 5487e1d..97c46c8 100644
--- a/erpnext/hr/doctype/salary_component/salary_component.json
+++ b/erpnext/hr/doctype/salary_component/salary_component.json
@@ -227,7 +227,7 @@
{
"default": "0",
"depends_on": "eval:doc.type == \"Deduction\" && !doc.variable_based_on_taxable_salary",
- "description": "If checked, the full amount will be deducted from taxable income before calculating income tax. Otherwise, it can be exempted via Employee Tax Exemption Declaration.",
+ "description": "If checked, the full amount will be deducted from taxable income before calculating income tax without any declaration or proof submission.",
"fieldname": "exempted_from_income_tax",
"fieldtype": "Check",
"label": "Exempted from Income Tax"
@@ -235,7 +235,7 @@
],
"icon": "fa fa-flag",
"links": [],
- "modified": "2020-04-24 14:50:28.994054",
+ "modified": "2020-04-28 15:46:45.252945",
"modified_by": "Administrator",
"module": "HR",
"name": "Salary Component",
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py
index 8a4da7e..fc65fb5 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.py
@@ -549,15 +549,16 @@
remaining_sub_periods = get_period_factor(self.employee,
self.start_date, self.end_date, self.payroll_frequency, payroll_period)[1]
# get taxable_earnings, paid_taxes for previous period
- previous_taxable_earnings = self.get_taxable_earnings_for_prev_period(payroll_period.start_date, self.start_date)
+ previous_taxable_earnings = self.get_taxable_earnings_for_prev_period(payroll_period.start_date,
+ self.start_date, tax_slab.allow_tax_exemption)
previous_total_paid_taxes = self.get_tax_paid_in_period(payroll_period.start_date, self.start_date, tax_component)
# get taxable_earnings for current period (all days)
- current_taxable_earnings = self.get_taxable_earnings()
+ current_taxable_earnings = self.get_taxable_earnings(tax_slab.allow_tax_exemption)
future_structured_taxable_earnings = current_taxable_earnings.taxable_earnings * (math.ceil(remaining_sub_periods) - 1)
# get taxable_earnings, addition_earnings for current actual payment days
- current_taxable_earnings_for_payment_days = self.get_taxable_earnings(based_on_payment_days=1)
+ current_taxable_earnings_for_payment_days = self.get_taxable_earnings(tax_slab.allow_tax_exemption, based_on_payment_days=1)
current_structured_taxable_earnings = current_taxable_earnings_for_payment_days.taxable_earnings
current_additional_earnings = current_taxable_earnings_for_payment_days.additional_income
current_additional_earnings_with_full_tax = current_taxable_earnings_for_payment_days.additional_income_with_full_tax
@@ -616,7 +617,7 @@
return income_tax_slab_doc
- def get_taxable_earnings_for_prev_period(self, start_date, end_date):
+ def get_taxable_earnings_for_prev_period(self, start_date, end_date, allow_tax_exemption=False):
taxable_earnings = frappe.db.sql("""
select sum(sd.amount)
from
@@ -636,24 +637,26 @@
})
taxable_earnings = flt(taxable_earnings[0][0]) if taxable_earnings else 0
- exempted_amount = frappe.db.sql("""
- select sum(sd.amount)
- from
- `tabSalary Detail` sd join `tabSalary Slip` ss on sd.parent=ss.name
- where
- sd.parentfield='deductions'
- and sd.exempted_from_income_tax=1
- and is_flexible_benefit=0
- and ss.docstatus=1
- and ss.employee=%(employee)s
- and ss.start_date between %(from_date)s and %(to_date)s
- and ss.end_date between %(from_date)s and %(to_date)s
- """, {
- "employee": self.employee,
- "from_date": start_date,
- "to_date": end_date
- })
- exempted_amount = flt(exempted_amount[0][0]) if exempted_amount else 0
+ exempted_amount = 0
+ if allow_tax_exemption:
+ exempted_amount = frappe.db.sql("""
+ select sum(sd.amount)
+ from
+ `tabSalary Detail` sd join `tabSalary Slip` ss on sd.parent=ss.name
+ where
+ sd.parentfield='deductions'
+ and sd.exempted_from_income_tax=1
+ and is_flexible_benefit=0
+ and ss.docstatus=1
+ and ss.employee=%(employee)s
+ and ss.start_date between %(from_date)s and %(to_date)s
+ and ss.end_date between %(from_date)s and %(to_date)s
+ """, {
+ "employee": self.employee,
+ "from_date": start_date,
+ "to_date": end_date
+ })
+ exempted_amount = flt(exempted_amount[0][0]) if exempted_amount else 0
return taxable_earnings - exempted_amount
@@ -681,7 +684,7 @@
return total_tax_paid
- def get_taxable_earnings(self, based_on_payment_days=0):
+ def get_taxable_earnings(self, allow_tax_exemption=False, based_on_payment_days=0):
joining_date, relieving_date = frappe.get_cached_value("Employee", self.employee,
["date_of_joining", "relieving_date"])
@@ -715,12 +718,13 @@
else:
taxable_earnings += amount
- for ded in self.deductions:
- if ded.exempted_from_income_tax:
- amount = ded.amount
- if based_on_payment_days:
- amount = self.get_amount_based_on_payment_days(ded, joining_date, relieving_date)[0]
- taxable_earnings -= flt(amount)
+ if allow_tax_exemption:
+ for ded in self.deductions:
+ if ded.exempted_from_income_tax:
+ amount = ded.amount
+ if based_on_payment_days:
+ amount = self.get_amount_based_on_payment_days(ded, joining_date, relieving_date)[0]
+ taxable_earnings -= flt(amount)
return frappe._dict({
"taxable_earnings": taxable_earnings,