From 0cb268413008eb1828d4f8904ffb41e2317bc834 Mon Sep 17 00:00:00 2001 From: Ranjith Date: Wed, 30 May 2018 20:51:37 +0530 Subject: [PATCH] Tax Exemption Proof Submission - validations, eligible hra calc --- ...ployee_tax_exemption_proof_submission.json | 192 +++++++++++++++--- ...employee_tax_exemption_proof_submission.py | 54 ++++- 2 files changed, 205 insertions(+), 41 deletions(-) diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json index 9e53a972476..32203d8604e 100644 --- a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json +++ b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.json @@ -209,6 +209,38 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "total_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Total Exemption Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_in_quick_entry": 0, @@ -368,37 +400,6 @@ "translatable": 0, "unique": 0 }, - { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_12", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, { "allow_bulk_edit": 0, "allow_in_quick_entry": 0, @@ -463,6 +464,133 @@ "translatable": 0, "unique": 0 }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_12", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "monthly_house_rent", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Monthly House Rent", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "monthly_hra_exemption", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Monthly Eligible Amount", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "total_eligible_hra_exemption", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Total Eligible HRA Exemption", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "translatable": 0, + "unique": 0 + }, { "allow_bulk_edit": 0, "allow_in_quick_entry": 0, @@ -570,7 +698,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2018-05-29 13:54:55.004847", + "modified": "2018-05-30 20:26:05.714414", "modified_by": "Administrator", "module": "HR", "name": "Employee Tax Exemption Proof Submission", diff --git a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py index a0c003cdc60..2be09ae9b9d 100644 --- a/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py +++ b/erpnext/hr/doctype/employee_tax_exemption_proof_submission/employee_tax_exemption_proof_submission.py @@ -6,16 +6,52 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document from frappe import _ -from erpnext.hr.utils import validate_tax_declaration +from frappe.utils import date_diff, flt, getdate, get_first_day, get_last_day +from erpnext.hr.utils import validate_tax_declaration, calculate_eligible_hra_exemption class EmployeeTaxExemptionProofSubmission(Document): def validate(self): validate_tax_declaration(self.tax_exemption_proofs) - #TODO: allow multiple? - # def before_submit(self): - # if frappe.db.exists({"doctype": "Employee Tax Exemption Proof Submission", - # "employee": self.employee, - # "payroll_period": self.payroll_period, - # "docstatus": 1}): - # frappe.throw(_("Proof Submission of {0} for period {1} already submitted.")\ - # .format(self.employee, self.payroll_period), frappe.DocstatusTransitionError) + if self.house_rent_payment_amount: + self.validate_house_rent_dates() + self.get_monthly_hra() + self.calculate_hra_exemption() + self.calculate_total_exemption() + + def get_monthly_hra(self): + factor = self.get_rented_days_factor() + self.monthly_house_rent = self.house_rent_payment_amount / factor + + def validate_house_rent_dates(self): + if date_diff(self.rented_to_date, self.rented_from_date) < 14: + frappe.throw(_("House Rented dates should be atleast 15 days apart")) + + proofs = frappe.db.sql("""select name from `tabEmployee Tax Exemption Proof Submission` + where docstatus=1 and employee='{0}' and payroll_period='{1}' and + (rented_from_date between '{2}' and '{3}' or rented_to_date between + '{2}' and '{2}')""".format(self.employee, self.payroll_period, + self.rented_from_date, self.rented_to_date)) + if proofs: + frappe.throw(_("House rent paid days overlap with {0}").format(proofs[0][0])) + + def calculate_hra_exemption(self): + exemptions = calculate_eligible_hra_exemption(self.company, self.employee, \ + self.monthly_house_rent, self.rented_in_metro_city) + self.monthly_hra_exemption = exemptions["monthly_exemption"] + if self.monthly_hra_exemption: + factor = self.get_rented_days_factor(rounded=False) + self.total_eligible_hra_exemption = self.monthly_hra_exemption * factor + else: + self.monthly_hra_exemption, self.total_eligible_hra_exemption = 0, 0 + + def get_rented_days_factor(self, rounded=True): + factor = flt(date_diff(self.rented_to_date, self.rented_from_date) + 1)/30 + factor = round(factor * 2)/2 + return factor if factor else 0.5 + + def calculate_total_exemption(self): + self.total_amount = 0 + for proof in self.tax_exemption_proofs: + self.total_amount += proof.amount + if self.monthly_house_rent and self.total_eligible_hra_exemption: + self.total_amount += self.total_eligible_hra_exemption