Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: leave balance report #25771

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -37,5 +37,22 @@ frappe.query_reports["Employee Leave Balance"] = {
"fieldtype": "Link",
"options": "Employee",
}
]
],

onload: () => {
frappe.call({
type: "GET",
method: "erpnext.hr.utils.get_leave_period",
args: {
"from_date": frappe.defaults.get_default("year_start_date"),
"to_date": frappe.defaults.get_default("year_end_date"),
"company": frappe.defaults.get_user_default("Company")
},
freeze: true,
callback: (data) => {
frappe.query_report.set_filter_value("from_date", data.message[0].from_date);
frappe.query_report.set_filter_value("to_date", data.message[0].to_date);
}
});
}
}
88 changes: 66 additions & 22 deletions erpnext/hr/report/employee_leave_balance/employee_leave_balance.py
Expand Up @@ -6,15 +6,16 @@
from frappe.utils import flt, add_days
from frappe import _
from erpnext.hr.doctype.leave_application.leave_application import get_leaves_for_period, get_leave_balance_on
from itertools import groupby

def execute(filters=None):
if filters.to_date <= filters.from_date:
frappe.throw(_('"From date" can not be greater than or equal to "To date"'))
frappe.throw(_('"From Date" can not be greater than or equal to "To Date"'))

columns = get_columns()
data = get_data(filters)

return columns, data
charts = get_chart_data(data)
return columns, data, None, charts

def get_columns():
columns = [{
Expand All @@ -31,9 +32,10 @@ def get_columns():
'options': 'Employee'
}, {
'label': _('Employee Name'),
'fieldtype': 'Data',
'fieldtype': 'Dynamic Link',
'fieldname': 'employee_name',
'width': 100,
'options': 'employee'
}, {
'label': _('Opening Balance'),
'fieldtype': 'float',
Expand Down Expand Up @@ -64,8 +66,7 @@ def get_columns():
return columns

def get_data(filters):
leave_types = frappe.db.sql_list("SELECT `name` FROM `tabLeave Type` ORDER BY `name` ASC")

leave_types = frappe.db.get_list('Leave Type', pluck='name', order_by='name')
conditions = get_conditions(filters)

user = frappe.session.user
Expand Down Expand Up @@ -113,12 +114,8 @@ def get_data(filters):

# not be shown on the basis of days left it create in user mind for carry_forward leave
row.closing_balance = (new_allocation + opening - (row.leaves_expired + leaves_taken))


row.indent = 1
data.append(row)
new_leaves_allocated = 0


return data

Expand All @@ -129,27 +126,37 @@ def get_conditions(filters):
if filters.get('employee'):
conditions['name'] = filters.get('employee')

if filters.get('employee'):
conditions['name'] = filters.get('employee')

if filters.get('company'):
conditions['company'] = filters.get('company')

if filters.get('department'):
conditions['department'] = filters.get('department')

return conditions

def get_department_leave_approver_map(department=None):
conditions=''
if department:
conditions="and (department_name = '%(department)s' or parent_department = '%(department)s')"%{'department': department}

# get current department and all its child
department_list = frappe.db.sql_list(""" SELECT name FROM `tabDepartment` WHERE disabled=0 {0}""".format(conditions)) #nosec

department_list = frappe.get_list('Department',
filters={
'disabled': 0
},
or_filters={
'name': department,
'parent_department': department
},
fields=['name'],
pluck='name'
)
# retrieve approvers list from current department and from its subsequent child departments
approver_list = frappe.get_all('Department Approver', filters={
'parentfield': 'leave_approvers',
'parent': ('in', department_list)
}, fields=['parent', 'approver'], as_list=1)
approver_list = frappe.get_all('Department Approver',
filters={
'parentfield': 'leave_approvers',
'parent': ('in', department_list)
},
fields=['parent', 'approver'],
as_list=1
)

approvers = {}

Expand Down Expand Up @@ -190,3 +197,40 @@ def get_allocated_and_expired_leaves(from_date, to_date, employee, leave_type):
new_allocation += record.leaves

return new_allocation, expired_leaves

def get_chart_data(data):
labels = []
datasets = []
employee_data = data

if data and data[0].get('employee_name'):
get_dataset_for_chart(employee_data, datasets, labels)

chart = {
'data': {
'labels': labels,
'datasets': datasets
},
'type': 'bar',
'colors': ['#456789', '#EE8888', '#7E77BF']
}

return chart

def get_dataset_for_chart(employee_data, datasets, labels):
leaves = []
employee_data = sorted(employee_data, key=lambda k: k['employee_name'])

for key, group in groupby(employee_data, lambda x: x['employee_name']):
for grp in group:
if grp.closing_balance:
leaves.append(frappe._dict({
'leave_type': grp.leave_type,
'closing_balance': grp.closing_balance
}))

if leaves:
labels.append(key)

for leave in leaves:
datasets.append({'name': leave.leave_type, 'values': [leave.closing_balance]})
1 change: 1 addition & 0 deletions erpnext/hr/utils.py
Expand Up @@ -269,6 +269,7 @@ def get_total_exemption_amount(declarations):
total_exemption_amount = sum([flt(d.total_exemption_amount) for d in exemptions.values()])
return total_exemption_amount

@frappe.whitelist()
def get_leave_period(from_date, to_date, company):
leave_period = frappe.db.sql("""
select name, from_date, to_date
Expand Down