Employee Benefit Claim - non pro-rata claim validation updated

This commit is contained in:
Jamsheer 2018-05-25 12:07:44 +05:30
parent dc698a891d
commit 620c3a872c

View File

@ -6,7 +6,7 @@ from __future__ import unicode_literals
import frappe
from frappe import _
from frappe.model.document import Document
from erpnext.hr.doctype.employee_benefit_application.employee_benefit_application import get_max_benefits
from erpnext.hr.doctype.employee_benefit_application.employee_benefit_application import get_max_benefits, get_assigned_salary_sturecture
from erpnext.hr.utils import get_payroll_period
from frappe.desk.reportview import get_match_cond
@ -41,16 +41,39 @@ class EmployeeBenefitClaim(Document):
claimed_amount = self.claimed_amount
pro_rata_amount = self.get_pro_rata_amount_in_application(payroll_period.name)
if not pro_rata_amount:
pro_rata_amount = 0
# TODO:
# Get pro_rata_amount if there is no application,
# get salary slip for the period and calculate pro-rata amount per day and mulitply with payroll_period_days
# get salary structure for the date and calculate pro-rata amount
pro_rata_amount = self.get_benefit_pro_rata_ratio_amount()
if not pro_rata_amount:
pro_rata_amount = 0
claimed_amount += self.get_previous_claimed_amount(payroll_period, True)
if max_benefits < pro_rata_amount + claimed_amount:
frappe.throw(_("Maximum benefit of employee {0} exceeds {1} by the sum {2} of benefit application pro-rata component\
amount and previous claimed amount").format(self.employee, max_benefits, pro_rata_amount+claimed_amount-max_benefits))
def get_benefit_pro_rata_ratio_amount(self):
sal_struct_name = get_assigned_salary_sturecture(self.employee, self.claim_date)
if len(sal_struct_name) > 0:
sal_struct = frappe.get_doc("Salary Structure", sal_struct_name[0][0])
total_pro_rata_max = 0
benefit_amount_total = 0
for sal_struct_row in sal_struct.get("earnings"):
is_pro_rata_applicable, max_benefit_amount = frappe.db.get_value("Salary Component", sal_struct_row.salary_component, ["is_pro_rata_applicable", "max_benefit_amount"])
if sal_struct_row.is_flexible_benefit == 1 and is_pro_rata_applicable == 1:
total_pro_rata_max += max_benefit_amount
if total_pro_rata_max > 0:
for sal_struct_row in sal_struct.get("earnings"):
is_pro_rata_applicable, max_benefit_amount = frappe.db.get_value("Salary Component", sal_struct_row.salary_component, ["is_pro_rata_applicable", "max_benefit_amount"])
if sal_struct_row.is_flexible_benefit == 1 and is_pro_rata_applicable == 1:
component_max = max_benefit_amount
benefit_amount = component_max * sal_struct.max_benefits / total_pro_rata_max
if benefit_amount > component_max:
benefit_amount = component_max
benefit_amount_total += benefit_amount
return benefit_amount_total
return False
def get_pro_rata_amount_in_application(self, payroll_period):
application = frappe.db.exists(
"Employee Benefit Application",