From 620c3a872cc31d45075cf6f0f782adbd47ad3f49 Mon Sep 17 00:00:00 2001 From: Jamsheer Date: Fri, 25 May 2018 12:07:44 +0530 Subject: [PATCH] Employee Benefit Claim - non pro-rata claim validation updated --- .../employee_benefit_claim.py | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py index b8aef0cf9da..809bf4061bc 100644 --- a/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py +++ b/erpnext/hr/doctype/employee_benefit_claim/employee_benefit_claim.py @@ -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",