Employee Benefit Claim - non pro-rata claim validation updated
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 b8aef0c..809bf40 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 @@
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 @@
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",