Skip to content

Commit 72aa69e

Browse files
authored
Merge pull request #1381 from ruchamahabal/leave-ledger-report
feat: Leave Ledger Report
2 parents d2ab567 + 99e274a commit 72aa69e

File tree

16 files changed

+565
-18
lines changed

16 files changed

+565
-18
lines changed

.github/workflows/linters.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ jobs:
3737
python-version: '3.10'
3838

3939
- name: Install and Run Pre-commit
40-
uses: pre-commit/action@v2.0.3
40+
uses: pre-commit/action@v3.0.0
4141

4242
- name: Download Semgrep rules
4343
run: git clone --depth 1 https://github.com/frappe/semgrep-rules.git frappe-semgrep-rules
4444

4545
- name: Download semgrep
46-
run: pip install semgrep==0.97.0
46+
run: pip install semgrep
4747

4848
- name: Run Semgrep rules
4949
run: semgrep ci --config ./frappe-semgrep-rules/rules --config r/python.lang.correctness

hrms/hr/doctype/leave_allocation/leave_allocation.js

+2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ frappe.ui.form.on("Leave Allocation", {
2525
},
2626

2727
refresh: function(frm) {
28+
hrms.leave_utils.add_view_ledger_button(frm);
29+
2830
if (frm.doc.docstatus === 1 && frm.doc.expired) {
2931
var valid_expiry = moment(frappe.datetime.get_today()).isBetween(frm.doc.from_date, frm.doc.to_date);
3032
if (valid_expiry) {

hrms/hr/doctype/leave_allocation/test_earned_leaves.py

+11-10
Original file line numberDiff line numberDiff line change
@@ -506,21 +506,19 @@ def create_earned_leave_type(leave_type, allocate_on_day="Last Day", rounding=0.
506506
).insert()
507507

508508

509-
def create_leave_period(name, start_date=None):
509+
def create_leave_period(name, start_date=None, end_date=None):
510510
frappe.delete_doc_if_exists("Leave Period", name, force=1)
511511

512512
if not start_date:
513513
start_date = get_first_day(getdate())
514514

515515
return frappe.get_doc(
516-
dict(
517-
name=name,
518-
doctype="Leave Period",
519-
from_date=start_date,
520-
to_date=add_months(start_date, 12),
521-
company="_Test Company",
522-
is_active=1,
523-
)
516+
name=name,
517+
doctype="Leave Period",
518+
from_date=start_date,
519+
to_date=end_date or add_months(start_date, 12),
520+
company="_Test Company",
521+
is_active=1,
524522
).insert()
525523

526524

@@ -530,12 +528,15 @@ def make_policy_assignment(
530528
rounding=0.5,
531529
earned_leave_frequency="Monthly",
532530
start_date=None,
531+
end_date=None,
533532
annual_allocation=12,
534533
carry_forward=0,
535534
assignment_based_on="Leave Period",
536535
):
537536
leave_type = create_earned_leave_type("Test Earned Leave", allocate_on_day, rounding)
538-
leave_period = create_leave_period("Test Earned Leave Period", start_date=start_date)
537+
leave_period = create_leave_period(
538+
"Test Earned Leave Period", start_date=start_date, end_date=end_date
539+
)
539540
leave_policy = frappe.get_doc(
540541
{
541542
"doctype": "Leave Policy",

hrms/hr/doctype/leave_application/leave_application.js

+2
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ frappe.ui.form.on("Leave Application", {
9595
},
9696

9797
refresh: function(frm) {
98+
hrms.leave_utils.add_view_ledger_button(frm);
99+
98100
if (frm.is_new()) {
99101
frm.trigger("calculate_total_days");
100102
}

hrms/hr/doctype/leave_encashment/leave_encashment.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ frappe.ui.form.on('Leave Encashment', {
2424
},
2525
refresh: function(frm) {
2626
cur_frm.set_intro("");
27-
if(frm.doc.__islocal && !in_list(frappe.user_roles, "Employee")) {
27+
if (frm.doc.__islocal && !frappe.user_roles.includes("Employee")) {
2828
frm.set_intro(__("Fill the form and save it"));
2929
}
30+
31+
hrms.leave_utils.add_view_ledger_button(frm);
3032
},
3133
employee: function(frm) {
3234
if (frm.doc.employee) {

hrms/hr/report/leave_ledger/__init__.py

Whitespace-only changes.
+103
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
// Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and contributors
2+
// For license information, please see license.txt
3+
4+
frappe.query_reports["Leave Ledger"] = {
5+
filters: [
6+
{
7+
fieldname: "from_date",
8+
label: __("From Date"),
9+
fieldtype: "Date",
10+
reqd: 1,
11+
default: frappe.defaults.get_default("year_start_date")
12+
},
13+
{
14+
fieldname: "to_date",
15+
label: __("To Date"),
16+
fieldtype: "Date",
17+
reqd: 1,
18+
default: frappe.defaults.get_default("year_end_date")
19+
},
20+
{
21+
fieldname: "leave_type",
22+
label: __("Leave Type"),
23+
fieldtype: "Link",
24+
options: "Leave Type",
25+
},
26+
{
27+
fieldname: "employee",
28+
label: __("Employee"),
29+
fieldtype: "Link",
30+
options: "Employee",
31+
},
32+
{
33+
fieldname: "status",
34+
label: __("Employee Status"),
35+
fieldtype: "Select",
36+
options: [
37+
"",
38+
{ "value": "Active", "label": __("Active") },
39+
{ "value": "Inactive", "label": __("Inactive") },
40+
{ "value": "Suspended", "label": __("Suspended") },
41+
{ "value": "Left", "label": __("Left") },
42+
],
43+
default: "Active",
44+
},
45+
{
46+
label: __("Company"),
47+
fieldname: "company",
48+
fieldtype: "Link",
49+
options: "Company",
50+
default: frappe.defaults.get_user_default("Company")
51+
},
52+
{
53+
fieldname: "department",
54+
label: __("Department"),
55+
fieldtype: "Link",
56+
options: "Department",
57+
},
58+
{
59+
fieldname: "transaction_type",
60+
label: __("Transaction Type"),
61+
fieldtype: "Select",
62+
options: ["", "Leave Allocation", "Leave Application", "Leave Encashment"],
63+
},
64+
{
65+
fieldname: "transaction_name",
66+
label: __("Transaction Name"),
67+
fieldtype: "Data",
68+
}
69+
],
70+
formatter: (value, row, column, data, default_formatter) => {
71+
value = default_formatter(value, row, column, data);
72+
if (column.fieldname === "leaves") {
73+
if (data?.leaves < 0)
74+
value = `<span style='color:red!important'>${value}</span>`;
75+
else
76+
value = `<span style='color:green!important'>${value}</span>`;
77+
}
78+
return value;
79+
},
80+
onload: () => {
81+
if (
82+
frappe.query_report.get_filter_value("from_date") &&
83+
frappe.query_report.get_filter_value("to_date")
84+
) return;
85+
86+
const today = frappe.datetime.now_date();
87+
88+
frappe.call({
89+
type: "GET",
90+
method: "hrms.hr.utils.get_leave_period",
91+
args: {
92+
"from_date": today,
93+
"to_date": today,
94+
"company": frappe.defaults.get_user_default("Company")
95+
},
96+
freeze: true,
97+
callback: (data) => {
98+
frappe.query_report.set_filter_value("from_date", data.message[0].from_date);
99+
frappe.query_report.set_filter_value("to_date", data.message[0].to_date);
100+
}
101+
});
102+
}
103+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{
2+
"add_total_row": 0,
3+
"columns": [],
4+
"creation": "2024-02-03 23:07:59.972957",
5+
"disabled": 0,
6+
"docstatus": 0,
7+
"doctype": "Report",
8+
"filters": [],
9+
"idx": 0,
10+
"is_standard": "Yes",
11+
"letter_head": "Frappe",
12+
"letterhead": null,
13+
"modified": "2024-04-07 14:46:16.056637",
14+
"modified_by": "Administrator",
15+
"module": "HR",
16+
"name": "Leave Ledger",
17+
"owner": "Administrator",
18+
"prepared_report": 0,
19+
"ref_doctype": "Leave Ledger Entry",
20+
"report_name": "Leave Ledger",
21+
"report_type": "Script Report",
22+
"roles": [
23+
{
24+
"role": "System Manager"
25+
},
26+
{
27+
"role": "HR Manager"
28+
},
29+
{
30+
"role": "HR User"
31+
},
32+
{
33+
"role": "Employee"
34+
}
35+
]
36+
}

0 commit comments

Comments
 (0)