Skip to content

Commit a90a42b

Browse files
authored
Merge pull request #1544 from frappe/version-15-hotfix
chore: release v15
2 parents 966561b + 4ec7033 commit a90a42b

File tree

6 files changed

+112
-120
lines changed

6 files changed

+112
-120
lines changed

hrms/hr/doctype/leave_application/leave_application.py

+52-69
Original file line numberDiff line numberDiff line change
@@ -1182,7 +1182,12 @@ def is_lwp(leave_type):
11821182

11831183
@frappe.whitelist()
11841184
def get_events(start, end, filters=None):
1185-
from frappe.desk.reportview import get_filters_cond
1185+
import json
1186+
1187+
filters = json.loads(filters)
1188+
for idx, filter in enumerate(filters):
1189+
# taking relevant fields from the list [doctype, fieldname, condition, value, hidden]
1190+
filters[idx] = filter[1:-1]
11861191

11871192
events = []
11881193

@@ -1196,91 +1201,67 @@ def get_events(start, end, filters=None):
11961201
employee = ""
11971202
company = frappe.db.get_value("Global Defaults", None, "default_company")
11981203

1199-
conditions = get_filters_cond("Leave Application", filters, [])
12001204
# show department leaves for employee
12011205
if "Employee" in frappe.get_roles():
12021206
add_department_leaves(events, start, end, employee, company)
12031207

1204-
add_leaves(events, start, end, conditions)
1208+
add_leaves(events, start, end, filters)
12051209
add_block_dates(events, start, end, employee, company)
12061210
add_holidays(events, start, end, employee, company)
12071211

12081212
return events
12091213

12101214

12111215
def add_department_leaves(events, start, end, employee, company):
1212-
department = frappe.db.get_value("Employee", employee, "department")
1213-
1214-
if not department:
1215-
return
1216-
1217-
# department leaves
1218-
department_employees = frappe.db.sql_list(
1219-
"""select name from tabEmployee where department=%s
1220-
and company=%s""",
1221-
(department, company),
1216+
if department := frappe.db.get_value("Employee", employee, "department"):
1217+
department_employees = frappe.get_list(
1218+
"Employee", filters={"department": department, "company": company}, pluck="name"
1219+
)
1220+
filters = [["employee", "in", department_employees]]
1221+
add_leaves(events, start, end, filters=filters)
1222+
1223+
1224+
def add_leaves(events, start, end, filters=None):
1225+
if not filters:
1226+
filters = []
1227+
filters.extend(
1228+
[
1229+
["from_date", "<=", getdate(end)],
1230+
["to_date", ">=", getdate(start)],
1231+
["status", "in", ["Approved", "Open"]],
1232+
["docstatus", "<", 2],
1233+
]
12221234
)
12231235

1224-
filter_conditions = ' and employee in ("%s")' % '", "'.join(department_employees)
1225-
add_leaves(events, start, end, filter_conditions=filter_conditions)
1226-
1227-
1228-
def add_leaves(events, start, end, filter_conditions=None):
1229-
from frappe.desk.reportview import build_match_conditions
1230-
1231-
conditions = []
1232-
1233-
if not cint(
1234-
frappe.db.get_value("HR Settings", None, "show_leaves_of_all_department_members_in_calendar")
1235-
):
1236-
match_conditions = build_match_conditions("Leave Application")
1237-
1238-
if match_conditions:
1239-
conditions.append(match_conditions)
1240-
1241-
query = """SELECT
1242-
docstatus,
1243-
name,
1244-
employee,
1245-
employee_name,
1246-
leave_type,
1247-
from_date,
1248-
to_date,
1249-
half_day,
1250-
status,
1251-
color
1252-
FROM `tabLeave Application`
1253-
WHERE
1254-
from_date <= %(end)s AND to_date >= %(start)s <= to_date
1255-
AND docstatus < 2
1256-
AND status in ('Approved', 'Open')
1257-
"""
1236+
fields = [
1237+
"name",
1238+
"from_date",
1239+
"to_date",
1240+
"color",
1241+
"docstatus",
1242+
"employee_name",
1243+
"leave_type",
1244+
"(1) as allDay",
1245+
"'Leave Application' as doctype",
1246+
]
1247+
1248+
show_leaves_of_all_members = frappe.db.get_single_value(
1249+
"HR Settings", "show_leaves_of_all_department_members_in_calendar"
1250+
)
1251+
if cint(show_leaves_of_all_members):
1252+
leave_applications = frappe.get_all("Leave Application", filters=filters, fields=fields)
1253+
else:
1254+
leave_applications = frappe.get_list("Leave Application", filters=filters, fields=fields)
12581255

1259-
if conditions:
1260-
query += " AND " + " AND ".join(conditions)
1261-
1262-
if filter_conditions:
1263-
query += filter_conditions
1264-
1265-
for d in frappe.db.sql(query, {"start": start, "end": end}, as_dict=True):
1266-
e = {
1267-
"name": d.name,
1268-
"doctype": "Leave Application",
1269-
"from_date": d.from_date,
1270-
"to_date": d.to_date,
1271-
"docstatus": d.docstatus,
1272-
"color": d.color,
1273-
"all_day": int(not d.half_day),
1274-
"title": cstr(d.employee_name)
1275-
+ f" ({cstr(d.leave_type)})"
1276-
+ (" " + _("(Half Day)") if d.half_day else ""),
1277-
}
1278-
if e not in events:
1279-
events.append(e)
1256+
for d in leave_applications:
1257+
d["title"] = f"{d['employee_name']} ({d['leave_type']})"
1258+
del d["employee_name"]
1259+
del d["leave_type"]
1260+
if d not in events:
1261+
events.append(d)
12801262

12811263

12821264
def add_block_dates(events, start, end, employee, company):
1283-
# block days
12841265
cnt = 0
12851266
block_dates = get_applicable_block_dates(start, end, employee, company, all_lists=True)
12861267

@@ -1292,6 +1273,7 @@ def add_block_dates(events, start, end, employee, company):
12921273
"to_date": block_date.block_date,
12931274
"title": _("Leave Blocked") + ": " + block_date.reason,
12941275
"name": "_" + str(cnt),
1276+
"allDay": 1,
12951277
}
12961278
)
12971279
cnt += 1
@@ -1315,6 +1297,7 @@ def add_holidays(events, start, end, employee, company):
13151297
"to_date": holiday.holiday_date,
13161298
"title": _("Holiday") + ": " + cstr(holiday.description),
13171299
"name": holiday.name,
1300+
"allDay": 1,
13181301
}
13191302
)
13201303

hrms/hr/doctype/leave_block_list/leave_block_list.py

+21-21
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,14 @@ def get_block_dates_from_date(self, start_date, end_date, days):
4242
return date_list
4343

4444

45-
@frappe.whitelist()
4645
def get_applicable_block_dates(
4746
from_date, to_date, employee=None, company=None, all_lists=False, leave_type=None
4847
):
4948
return frappe.db.get_all(
5049
"Leave Block List Date",
5150
filters={
5251
"parent": ["IN", get_applicable_block_lists(employee, company, all_lists, leave_type)],
53-
"block_date": ["BETWEEN", [from_date, to_date]],
52+
"block_date": ["BETWEEN", [getdate(from_date), getdate(to_date)]],
5453
},
5554
fields=["block_date", "reason"],
5655
)
@@ -59,33 +58,34 @@ def get_applicable_block_dates(
5958
def get_applicable_block_lists(employee=None, company=None, all_lists=False, leave_type=None):
6059
block_lists = []
6160

61+
def add_block_list(block_list):
62+
for d in block_list:
63+
if all_lists or not is_user_in_allow_list(d):
64+
block_lists.append(d)
65+
6266
if not employee:
6367
employee = frappe.db.get_value("Employee", {"user_id": frappe.session.user})
64-
if not employee:
65-
return []
6668

67-
if not company:
69+
if not company and employee:
6870
company = frappe.db.get_value("Employee", employee, "company")
6971

70-
def add_block_list(block_list):
71-
for d in block_list:
72-
if all_lists or not is_user_in_allow_list(d):
73-
block_lists.append(d)
72+
if company:
73+
# global
74+
conditions = {"applies_to_all_departments": 1, "company": company}
75+
if leave_type:
76+
conditions["leave_type"] = ["IN", (leave_type, "", None)]
7477

75-
# per department
76-
department = frappe.db.get_value("Employee", employee, "department")
77-
if department:
78-
block_list = frappe.db.get_value("Department", department, "leave_block_list")
79-
block_list_leave_type = frappe.db.get_value("Leave Block List", block_list, "leave_type")
80-
if not block_list_leave_type or not leave_type or block_list_leave_type == leave_type:
81-
add_block_list([block_list])
78+
add_block_list(frappe.db.get_all("Leave Block List", filters=conditions, pluck="name"))
8279

83-
# global
84-
conditions = {"applies_to_all_departments": 1, "company": company}
85-
if leave_type:
86-
conditions["leave_type"] = ["IN", (leave_type, "", None)]
80+
if employee:
81+
# per department
82+
department = frappe.db.get_value("Employee", employee, "department")
83+
if department:
84+
block_list = frappe.db.get_value("Department", department, "leave_block_list")
85+
block_list_leave_type = frappe.db.get_value("Leave Block List", block_list, "leave_type")
86+
if not block_list_leave_type or not leave_type or block_list_leave_type == leave_type:
87+
add_block_list([block_list])
8788

88-
add_block_list(frappe.db.get_all("Leave Block List", filters=conditions, pluck="name"))
8989
return list(set(block_lists))
9090

9191

hrms/payroll/doctype/gratuity/gratuity.js

+4-8
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,18 @@ frappe.ui.form.on('Gratuity', {
4848
});
4949
}
5050
},
51+
5152
employee: function (frm) {
5253
frm.events.calculate_work_experience_and_amount(frm);
5354
},
55+
5456
gratuity_rule: function (frm) {
5557
frm.events.calculate_work_experience_and_amount(frm);
5658
},
57-
calculate_work_experience_and_amount: function (frm) {
5859

60+
calculate_work_experience_and_amount: function (frm) {
5961
if (frm.doc.employee && frm.doc.gratuity_rule) {
60-
frappe.call({
61-
method: "hrms.payroll.doctype.gratuity.gratuity.calculate_work_experience_and_amount",
62-
args: {
63-
employee: frm.doc.employee,
64-
gratuity_rule: frm.doc.gratuity_rule
65-
}
66-
}).then((r) => {
62+
frm.call("calculate_work_experience_and_amount").then((r) => {
6763
frm.set_value("current_work_experience", r.message['current_work_experience']);
6864
frm.set_value("amount", r.message['amount']);
6965
});

hrms/payroll/doctype/gratuity/gratuity.json

+2-3
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,7 @@
6060
"default": "0",
6161
"fieldname": "current_work_experience",
6262
"fieldtype": "Int",
63-
"label": "Current Work Experience",
64-
"read_only": 1
63+
"label": "Current Work Experience"
6564
},
6665
{
6766
"default": "0",
@@ -200,7 +199,7 @@
200199
"index_web_pages_for_search": 1,
201200
"is_submittable": 1,
202201
"links": [],
203-
"modified": "2022-11-09 15:47:13.353555",
202+
"modified": "2024-03-15 02:50:10.282517",
204203
"modified_by": "Administrator",
205204
"module": "Payroll",
206205
"name": "Gratuity",

hrms/payroll/doctype/gratuity/gratuity.py

+30-16
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,26 @@
1515

1616
class Gratuity(AccountsController):
1717
def validate(self):
18-
data = calculate_work_experience_and_amount(self.employee, self.gratuity_rule)
18+
data = self.calculate_work_experience_and_amount()
1919
self.current_work_experience = data["current_work_experience"]
2020
self.amount = data["amount"]
2121
self.set_status()
2222

23+
@frappe.whitelist()
24+
def calculate_work_experience_and_amount(self):
25+
rule = get_gratuity_rule_config(self.gratuity_rule)
26+
27+
if rule.method == "Manual":
28+
current_work_experience = flt(self.current_work_experience)
29+
else:
30+
current_work_experience = calculate_work_experience(self.employee, self.gratuity_rule) or 0
31+
32+
gratuity_amount = (
33+
calculate_gratuity_amount(self.employee, self.gratuity_rule, current_work_experience) or 0
34+
)
35+
36+
return {"current_work_experience": current_work_experience, "amount": gratuity_amount}
37+
2338
def set_status(self, update=False):
2439
precision = self.precision("paid_amount")
2540
status = None
@@ -130,19 +145,21 @@ def set_total_advance_paid(self):
130145
self.set_status(update=True)
131146

132147

133-
@frappe.whitelist()
134-
def calculate_work_experience_and_amount(employee, gratuity_rule):
135-
current_work_experience = calculate_work_experience(employee, gratuity_rule) or 0
136-
gratuity_amount = calculate_gratuity_amount(employee, gratuity_rule, current_work_experience) or 0
137-
138-
return {"current_work_experience": current_work_experience, "amount": gratuity_amount}
148+
def get_gratuity_rule_config(gratuity_rule: str) -> dict:
149+
return frappe.db.get_value(
150+
"Gratuity Rule",
151+
gratuity_rule,
152+
[
153+
"work_experience_calculation_function as method",
154+
"total_working_days_per_year",
155+
"minimum_year_for_gratuity",
156+
],
157+
as_dict=True,
158+
)
139159

140160

141161
def calculate_work_experience(employee, gratuity_rule):
142-
143-
total_working_days_per_year, minimum_year_for_gratuity = frappe.db.get_value(
144-
"Gratuity Rule", gratuity_rule, ["total_working_days_per_year", "minimum_year_for_gratuity"]
145-
)
162+
rule = get_gratuity_rule_config(gratuity_rule)
146163

147164
date_of_joining, relieving_date = frappe.db.get_value(
148165
"Employee", employee, ["date_of_joining", "relieving_date"]
@@ -154,16 +171,13 @@ def calculate_work_experience(employee, gratuity_rule):
154171
)
155172
)
156173

157-
method = frappe.db.get_value(
158-
"Gratuity Rule", gratuity_rule, "work_experience_calculation_function"
159-
)
160174
employee_total_workings_days = calculate_employee_total_workings_days(
161175
employee, date_of_joining, relieving_date
162176
)
163177

164-
current_work_experience = employee_total_workings_days / total_working_days_per_year or 1
178+
current_work_experience = employee_total_workings_days / rule.total_working_days_per_year or 1
165179
current_work_experience = get_work_experience_using_method(
166-
method, current_work_experience, minimum_year_for_gratuity, employee
180+
rule.method, current_work_experience, rule.minimum_year_for_gratuity, employee
167181
)
168182
return current_work_experience
169183

hrms/payroll/doctype/gratuity_rule/gratuity_rule.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@
6363
"default": "Round off Work Experience",
6464
"fieldname": "work_experience_calculation_function",
6565
"fieldtype": "Select",
66-
"label": "Work Experience Calculation method",
67-
"options": "Round off Work Experience\nTake Exact Completed Years"
66+
"label": "Work Experience Calculation Method",
67+
"options": "Round off Work Experience\nTake Exact Completed Years\nManual"
6868
},
6969
{
7070
"default": "365",
@@ -93,7 +93,7 @@
9393
],
9494
"index_web_pages_for_search": 1,
9595
"links": [],
96-
"modified": "2023-01-05 12:36:32.412409",
96+
"modified": "2024-03-15 01:48:52.295003",
9797
"modified_by": "Administrator",
9898
"module": "Payroll",
9999
"name": "Gratuity Rule",

0 commit comments

Comments
 (0)