From 4dc5721ba52be327c002ae226ff6db47e406241f Mon Sep 17 00:00:00 2001 From: Ranjith Kurungadam Date: Sun, 1 Jul 2018 16:44:37 +0530 Subject: [PATCH] fix - Benefit Application query (#14767) --- .../employee_benefit_application.py | 21 +++++++++++-------- .../doctype/payroll_period/payroll_period.py | 17 +++++++-------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py index 888484580d..5f8edff117 100644 --- a/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py +++ b/erpnext/hr/doctype/employee_benefit_application/employee_benefit_application.py @@ -165,20 +165,23 @@ def calculate_lwp(employee, start_date, holidays, working_days): return lwp def get_benefit_component_amount(employee, start_date, end_date, struct_row, sal_struct, period_length, frequency): - # Considering there is only one application for an year + payroll_period, period_factor, actual_payroll_days = get_payroll_period_days(start_date, end_date, employee) + + if not payroll_period: + frappe.msgprint(_("Start and end dates not in a valid Payroll Period, cannot calculate {0}.") + .format(struct_row.salary_component)) + return False + + # Considering there is only one application for a year benefit_application_name = frappe.db.sql(""" select name from `tabEmployee Benefit Application` - where employee=%(employee)s + where payroll_period=%(payroll_period)s and employee=%(employee)s and docstatus = 1 - and (date between %(start_date)s and %(end_date)s) """, { 'employee': employee, - 'start_date': start_date, - 'end_date': end_date + 'payroll_period': payroll_period }) - period_factor, actual_payroll_days = get_payroll_period_days(start_date, end_date, employee) - if frappe.db.get_value("Salary Component", struct_row.salary_component, "depends_on_lwp") != 1: if frequency == "Monthly" and actual_payroll_days in range(360, 370): period_length = 1 @@ -186,12 +189,12 @@ def get_benefit_component_amount(employee, start_date, end_date, struct_row, sal if period_factor: # If there is application for benefit then fetch the amount from the application. - # else Split the max benefits to the pro-rata components with the ratio of thier max_benefit_amount + # else Split the max benefits to the pro-rata components with the ratio of their max_benefit_amount if benefit_application_name: benefit_application = frappe.get_doc("Employee Benefit Application", benefit_application_name[0][0]) return get_benefit_amount(benefit_application, struct_row, period_factor, period_length) - # TODO: Check if there is benefit claim for employee then pro-rata devid the rest of amount (Late Benefit Application) + # TODO: Check if there is benefit claim for employee then pro-rata divide the rest of amount (Late Benefit Application) else: component_max = frappe.db.get_value("Salary Component", struct_row.salary_component, "max_benefit_amount") if component_max > 0: diff --git a/erpnext/hr/doctype/payroll_period/payroll_period.py b/erpnext/hr/doctype/payroll_period/payroll_period.py index 8990d754e8..506af99f50 100644 --- a/erpnext/hr/doctype/payroll_period/payroll_period.py +++ b/erpnext/hr/doctype/payroll_period/payroll_period.py @@ -47,24 +47,23 @@ class PayrollPeriod(Document): def get_payroll_period_days(start_date, end_date, employee): company = frappe.db.get_value("Employee", employee, "company") - payroll_period_dates = frappe.db.sql(""" - select start_date, end_date from `tabPayroll Period` + payroll_period = frappe.db.sql(""" + select name, start_date, end_date from `tabPayroll Period` where company=%(company)s and ( (%(start_date)s between start_date and end_date) - or (%(end_date)s between start_date and end_date) - or (start_date between %(start_date)s and %(end_date)s) + and (%(end_date)s between start_date and end_date) )""", { 'company': company, 'start_date': start_date, 'end_date': end_date }) - if len(payroll_period_dates) > 0: - actual_no_of_days = date_diff(getdate(payroll_period_dates[0][1]), getdate(payroll_period_dates[0][0])) + 1 + if len(payroll_period) > 0: + actual_no_of_days = date_diff(getdate(payroll_period[0][2]), getdate(payroll_period[0][1])) + 1 working_days = actual_no_of_days if not cint(frappe.db.get_value("HR Settings", None, "include_holidays_in_total_working_days")): - holidays = get_holidays_for_employee(employee, getdate(payroll_period_dates[0][0]), getdate(payroll_period_dates[0][1])) + holidays = get_holidays_for_employee(employee, getdate(payroll_period[0][1]), getdate(payroll_period[0][2])) working_days -= len(holidays) - return working_days, actual_no_of_days - return False, False + return payroll_period[0][0], working_days, actual_no_of_days + return False, False, False