From b6675bea69a1463d6b0ad346c56fb0ddb8a970ab Mon Sep 17 00:00:00 2001 From: 14987 Date: Tue, 17 Oct 2023 20:12:06 +0530 Subject: [PATCH 01/25] refactor: Employee working on holiday --- .../employees_working_on_a_holiday.py | 61 +++++++++++++------ 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py index f9fec8237b..ff8733f2a6 100644 --- a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py +++ b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py @@ -17,11 +17,33 @@ def execute(filters=None): def get_columns(): return [ - _("Employee") + ":Link/Employee:120", - _("Name") + ":Data:200", - _("Date") + ":Date:100", - _("Status") + ":Data:70", - _("Holiday") + ":Data:200", + { + "label": _("Employee"), + "fieldtype": "Link", + "fieldname": "employee", + "options": "Employee", + "width": 120, + }, + { + "label": _("Name"), + "fieldtype": "Data", + "width": 200, + }, + { + "label": _("Date"), + "fieldtype": "Date", + "width": 100, + }, + { + "label": _("Status"), + "fieldtype": "Data", + "width": 70, + }, + { + "label": _("Holiday"), + "fieldtype": "Data", + "width": 200, + }, ] @@ -45,22 +67,27 @@ def get_employees(filters): holiday_names[holiday.holiday_date] = holiday.description if holidays_list: - cond = " attendance_date in %(holidays_list)s and status not in ('On Leave','Absent') " + attendance_doctype = frappe.qb.DocType("Attendance") + employee_list = ( + frappe.qb.from_(attendance_doctype) + .select( + attendance_doctype.employee, + attendance_doctype.employee_name, + attendance_doctype.attendance_date, + attendance_doctype.status, + ) + .where(attendance_doctype.attendance_date.isin(holidays_list)) + .where(attendance_doctype.status.notin(["Absent", "On Leave"])) + ) if filters.holiday_list: - cond += ( - """ and (employee in (select employee from tabEmployee where holiday_list = %(holidays)s))""" + employee = frappe.qb.DocType("Employee") + employee_based_on_holiday = ( + frappe.qb.from_(employee).select(employee.employee).where(employee.holiday_list == holidays) ) + employee_list.where(attendance_doctype.employee.isin(employee_based_on_holiday)) - employee_list = frappe.db.sql( - """select - employee, employee_name, attendance_date, status - from tabAttendance - where %s""" - % cond.format(", ".join(["%s"] * len(holidays_list))), - {"holidays_list": holidays_list, "holidays": filters.holiday_list}, - as_list=True, - ) + employee_list = employee_list.run(as_list=True) for employee_data in employee_list: employee_data.append(holiday_names[employee_data[2]]) From a74e831bd1ebe0beafd081517cc5f0ccd02d5067 Mon Sep 17 00:00:00 2001 From: 14987 Date: Tue, 17 Oct 2023 20:37:34 +0530 Subject: [PATCH 02/25] fix: Update condition in query builder --- .../employees_working_on_a_holiday.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py index ff8733f2a6..822771000d 100644 --- a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py +++ b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py @@ -83,7 +83,9 @@ def get_employees(filters): if filters.holiday_list: employee = frappe.qb.DocType("Employee") employee_based_on_holiday = ( - frappe.qb.from_(employee).select(employee.employee).where(employee.holiday_list == holidays) + frappe.qb.from_(employee) + .select(employee.employee) + .where(employee.holiday_list == filters.holiday_list) ) employee_list.where(attendance_doctype.employee.isin(employee_based_on_holiday)) From 019b410af28513143314856da6cb770ed4a550e0 Mon Sep 17 00:00:00 2001 From: krantheman Date: Mon, 8 Jan 2024 13:26:18 +0530 Subject: [PATCH 03/25] fix(Leave Policy Assignment): calculation of months passed --- .../leave_policy_assignment/leave_policy_assignment.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py b/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py index b4594d1785..c43c0b82f2 100644 --- a/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py +++ b/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py @@ -188,7 +188,9 @@ def _get_months_passed(current_date, from_date, consider_current_month): months_passed += 1 elif current_date.year > from_date.year: - months_passed = (12 - from_date.month) + current_date.month + months_passed = ( + (12 - from_date.month) + (current_date.year - from_date.year - 1) * 12 + current_date.month + ) if consider_current_month: months_passed += 1 From 7592b446fe9c6d3da6f77286ef8dd383eacf495f Mon Sep 17 00:00:00 2001 From: krantheman Date: Tue, 9 Jan 2024 12:27:37 +0530 Subject: [PATCH 04/25] test: add test for get_leaves_for_passed_months --- .../leave_policy_assignment.py | 25 ++++++----- .../test_leave_policy_assignment.py | 43 +++++++++++++++++++ hrms/hr/doctype/leave_type/test_leave_type.py | 7 +-- 3 files changed, 62 insertions(+), 13 deletions(-) diff --git a/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py b/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py index c43c0b82f2..680ee25e80 100644 --- a/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py +++ b/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py @@ -294,16 +294,7 @@ def create_assignment_for_multiple_employees(employees, data): failed = [] for employee in employees: - assignment = frappe.new_doc("Leave Policy Assignment") - assignment.employee = employee - assignment.assignment_based_on = data.assignment_based_on or None - assignment.leave_policy = data.leave_policy - assignment.effective_from = getdate(data.effective_from) or None - assignment.effective_to = getdate(data.effective_to) or None - assignment.leave_period = data.leave_period or None - assignment.carry_forward = data.carry_forward - assignment.save() - + assignment = create_assignment(employee, data) savepoint = "before_assignment_submission" try: frappe.db.savepoint(savepoint) @@ -321,6 +312,20 @@ def create_assignment_for_multiple_employees(employees, data): return docs_name +@frappe.whitelist() +def create_assignment(employee, data): + assignment = frappe.new_doc("Leave Policy Assignment") + assignment.employee = employee + assignment.assignment_based_on = data.assignment_based_on or None + assignment.leave_policy = data.leave_policy + assignment.effective_from = getdate(data.effective_from) or None + assignment.effective_to = getdate(data.effective_to) or None + assignment.leave_period = data.leave_period or None + assignment.carry_forward = data.carry_forward + assignment.save() + return assignment + + def show_assignment_submission_status(failed): frappe.clear_messages() assignment_list = [get_link_to_form("Leave Policy Assignment", entry) for entry in failed] diff --git a/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py b/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py index 79b4c092ac..72ef288ff9 100644 --- a/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py +++ b/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py @@ -6,10 +6,13 @@ from frappe.utils import add_months, get_first_day, getdate from hrms.hr.doctype.leave_application.test_leave_application import get_employee, get_leave_period +from hrms.hr.doctype.leave_period.test_leave_period import create_leave_period from hrms.hr.doctype.leave_policy.test_leave_policy import create_leave_policy from hrms.hr.doctype.leave_policy_assignment.leave_policy_assignment import ( + create_assignment, create_assignment_for_multiple_employees, ) +from hrms.hr.doctype.leave_type.test_leave_type import create_leave_type test_dependencies = ["Employee"] @@ -117,5 +120,45 @@ def test_pro_rated_leave_allocation(self): # pro-rated leave allocation for 9 months self.assertEqual(allocation, 9) + # tests no of leaves for passed months if assignment is based on Leave Period / Joining Date + def test_get_leaves_for_passed_months(self): + annual_allocation = 10 + leave_type = create_leave_type(is_earned_leave=True) + leave_policy = create_leave_policy(leave_type=leave_type, annual_allocation=annual_allocation) + leave_policy.submit() + + data = { + "assignment_based_on": "Joining Date", + "leave_policy": leave_policy.name, + } + + self.employee.date_of_joining = add_months(getdate(), -6) + self.employee.save() + assignment = create_assignment(self.employee.name, frappe._dict(data)) + new_leaves_allocated = assignment.get_leaves_for_passed_months( + annual_allocation, leave_type, self.employee.date_of_joining + ) + self.assertEqual(new_leaves_allocated, 5) + + self.employee.date_of_joining = add_months(getdate(), -36) + self.employee.save() + assignment = create_assignment(self.employee.name, frappe._dict(data)) + new_leaves_allocated = assignment.get_leaves_for_passed_months( + annual_allocation, leave_type, self.employee.date_of_joining + ) + self.assertEqual(new_leaves_allocated, 30) + + leave_period = create_leave_period(add_months(getdate(), -24), getdate()) + data = { + "assignment_based_on": "Leave Period", + "leave_policy": leave_policy.name, + "leave_period": leave_period.name, + } + assignment = create_assignment(self.employee.name, frappe._dict(data)) + new_leaves_allocated = assignment.get_leaves_for_passed_months( + annual_allocation, leave_type, self.employee.date_of_joining + ) + self.assertEqual(new_leaves_allocated, 20) + def tearDown(self): frappe.db.set_value("Employee", self.employee.name, "date_of_joining", self.original_doj) diff --git a/hrms/hr/doctype/leave_type/test_leave_type.py b/hrms/hr/doctype/leave_type/test_leave_type.py index 39b2c525fc..1dfdea0a33 100644 --- a/hrms/hr/doctype/leave_type/test_leave_type.py +++ b/hrms/hr/doctype/leave_type/test_leave_type.py @@ -8,13 +8,14 @@ def create_leave_type(**args): args = frappe._dict(args) - if frappe.db.exists("Leave Type", args.leave_type_name): - frappe.delete_doc("Leave Type", args.leave_type_name) + leave_type_name = args.leave_type_name or "_Test Leave Type" + if frappe.db.exists("Leave Type", leave_type_name): + frappe.delete_doc("Leave Type", leave_type_name) leave_type = frappe.get_doc( { "doctype": "Leave Type", - "leave_type_name": args.leave_type_name or "_Test Leave Type", + "leave_type_name": leave_type_name, "include_holiday": args.include_holidays or 1, "allow_encashment": args.allow_encashment or 0, "is_earned_leave": args.is_earned_leave or 0, From 031137a413579e29dd7b6123969cafe4c184bb65 Mon Sep 17 00:00:00 2001 From: krantheman Date: Tue, 9 Jan 2024 13:34:32 +0530 Subject: [PATCH 05/25] test: fix setUp --- .../leave_policy_assignment/test_leave_policy_assignment.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py b/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py index 72ef288ff9..c2e0f9a240 100644 --- a/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py +++ b/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py @@ -24,6 +24,7 @@ def setUp(self): "Leave Application", "Leave Allocation", "Leave Policy Assignment", + "Leave Policy", "Leave Ledger Entry", ]: frappe.db.delete(doctype) @@ -123,7 +124,7 @@ def test_pro_rated_leave_allocation(self): # tests no of leaves for passed months if assignment is based on Leave Period / Joining Date def test_get_leaves_for_passed_months(self): annual_allocation = 10 - leave_type = create_leave_type(is_earned_leave=True) + leave_type = create_leave_type(leave_type_name="_Test Earned Leave", is_earned_leave=True) leave_policy = create_leave_policy(leave_type=leave_type, annual_allocation=annual_allocation) leave_policy.submit() From 3b09de48fd4445f8135d665263a8a602d481079f Mon Sep 17 00:00:00 2001 From: krantheman Date: Thu, 4 Jul 2024 12:32:53 +0530 Subject: [PATCH 06/25] feat: create Shift Location doctype --- hrms/hr/doctype/shift_location/__init__.py | 0 .../doctype/shift_location/shift_location.js | 8 ++ .../shift_location/shift_location.json | 114 ++++++++++++++++++ .../doctype/shift_location/shift_location.py | 9 ++ .../shift_location/test_shift_location.py | 9 ++ 5 files changed, 140 insertions(+) create mode 100644 hrms/hr/doctype/shift_location/__init__.py create mode 100644 hrms/hr/doctype/shift_location/shift_location.js create mode 100644 hrms/hr/doctype/shift_location/shift_location.json create mode 100644 hrms/hr/doctype/shift_location/shift_location.py create mode 100644 hrms/hr/doctype/shift_location/test_shift_location.py diff --git a/hrms/hr/doctype/shift_location/__init__.py b/hrms/hr/doctype/shift_location/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/hrms/hr/doctype/shift_location/shift_location.js b/hrms/hr/doctype/shift_location/shift_location.js new file mode 100644 index 0000000000..877c81c0a4 --- /dev/null +++ b/hrms/hr/doctype/shift_location/shift_location.js @@ -0,0 +1,8 @@ +// Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("Shift Location", { +// refresh(frm) { + +// }, +// }); diff --git a/hrms/hr/doctype/shift_location/shift_location.json b/hrms/hr/doctype/shift_location/shift_location.json new file mode 100644 index 0000000000..6df8f26ed9 --- /dev/null +++ b/hrms/hr/doctype/shift_location/shift_location.json @@ -0,0 +1,114 @@ +{ + "actions": [], + "allow_rename": 1, + "autoname": "field:location_name", + "creation": "2024-07-04 12:12:26.894513", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "location_name", + "checkin_radius", + "column_break_dlgd", + "latitude", + "longitude", + "section_break_xxli", + "geolocation" + ], + "fields": [ + { + "fieldname": "location_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Location Name", + "reqd": 1, + "unique": 1 + }, + { + "description": "Radius within which check-in is allowed (in meters)", + "fieldname": "checkin_radius", + "fieldtype": "Int", + "label": "Checkin Radius" + }, + { + "fieldname": "column_break_dlgd", + "fieldtype": "Column Break" + }, + { + "fieldname": "longitude", + "fieldtype": "Float", + "label": "Longitude" + }, + { + "fieldname": "section_break_xxli", + "fieldtype": "Section Break" + }, + { + "fieldname": "geolocation", + "fieldtype": "Geolocation", + "label": "Geolocation" + }, + { + "fieldname": "latitude", + "fieldtype": "Float", + "label": "Latitude" + } + ], + "links": [], + "modified": "2024-07-04 12:31:00.609940", + "modified_by": "Administrator", + "module": "HR", + "name": "Shift Location", + "naming_rule": "By fieldname", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "share": 1, + "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "share": 1, + "write": 1 + }, + { + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Employee", + "share": 1 + } + ], + "quick_entry": 1, + "sort_field": "creation", + "sort_order": "DESC", + "states": [] +} \ No newline at end of file diff --git a/hrms/hr/doctype/shift_location/shift_location.py b/hrms/hr/doctype/shift_location/shift_location.py new file mode 100644 index 0000000000..db41c83498 --- /dev/null +++ b/hrms/hr/doctype/shift_location/shift_location.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +# import frappe +from frappe.model.document import Document + + +class ShiftLocation(Document): + pass diff --git a/hrms/hr/doctype/shift_location/test_shift_location.py b/hrms/hr/doctype/shift_location/test_shift_location.py new file mode 100644 index 0000000000..fb102fc198 --- /dev/null +++ b/hrms/hr/doctype/shift_location/test_shift_location.py @@ -0,0 +1,9 @@ +# Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestShiftLocation(FrappeTestCase): + pass From 36b82b0841696f5eedfc7c6c28373695e018a5dd Mon Sep 17 00:00:00 2001 From: krantheman Date: Thu, 4 Jul 2024 14:20:44 +0530 Subject: [PATCH 07/25] feat(Shift Assignment): add Shift Location field --- .../shift_assignment/shift_assignment.json | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/hrms/hr/doctype/shift_assignment/shift_assignment.json b/hrms/hr/doctype/shift_assignment/shift_assignment.json index 43a00cc394..748c74e595 100644 --- a/hrms/hr/doctype/shift_assignment/shift_assignment.json +++ b/hrms/hr/doctype/shift_assignment/shift_assignment.json @@ -7,16 +7,20 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ + "employee_details_section", "employee", "employee_name", - "shift_type", - "status", "column_break_3", "company", + "department", + "shift_details_section", + "shift_type", + "shift_location", + "status", + "column_break_brkq", "start_date", "end_date", "shift_request", - "department", "amended_from" ], "fields": [ @@ -59,6 +63,7 @@ "fieldtype": "Column Break" }, { + "fetch_from": "employee.company", "fieldname": "company", "fieldtype": "Link", "label": "Company", @@ -101,11 +106,31 @@ "fieldtype": "Select", "label": "Status", "options": "Active\nInactive" + }, + { + "fieldname": "employee_details_section", + "fieldtype": "Section Break", + "label": "Employee Details" + }, + { + "fieldname": "shift_details_section", + "fieldtype": "Section Break", + "label": "Shift Details" + }, + { + "fieldname": "shift_location", + "fieldtype": "Link", + "label": "Shift Location", + "options": "Shift Location" + }, + { + "fieldname": "column_break_brkq", + "fieldtype": "Column Break" } ], "is_submittable": 1, "links": [], - "modified": "2024-04-04 17:13:13.137431", + "modified": "2024-07-04 14:30:40.840689", "modified_by": "Administrator", "module": "HR", "name": "Shift Assignment", From 13d1374af3f6c3360ffa45d2f29369e6f32ef95a Mon Sep 17 00:00:00 2001 From: krantheman Date: Thu, 4 Jul 2024 15:57:27 +0530 Subject: [PATCH 08/25] feat: add geolocation fetching --- .../employee_checkin/employee_checkin.js | 37 +------------------ .../employee_checkin/employee_checkin.py | 30 ++------------- .../doctype/shift_location/shift_location.js | 26 +++++++++++-- .../shift_location/shift_location.json | 8 +++- .../doctype/shift_location/shift_location.py | 7 +++- hrms/hr/utils.py | 23 ++++++++++++ hrms/public/js/utils/index.js | 37 +++++++++++++++++++ 7 files changed, 99 insertions(+), 69 deletions(-) diff --git a/hrms/hr/doctype/employee_checkin/employee_checkin.js b/hrms/hr/doctype/employee_checkin/employee_checkin.js index a57232706e..02e948be16 100644 --- a/hrms/hr/doctype/employee_checkin/employee_checkin.js +++ b/hrms/hr/doctype/employee_checkin/employee_checkin.js @@ -14,40 +14,7 @@ frappe.ui.form.on("Employee Checkin", { } }, - fetch_geolocation: async (frm) => { - if (!navigator.geolocation) { - frappe.msgprint({ - message: __("Geolocation is not supported by your current browser"), - title: __("Geolocation Error"), - indicator: "red", - }); - hide_field(["geolocation"]); - return; - } - - frappe.dom.freeze(__("Fetching your geolocation") + "..."); - - navigator.geolocation.getCurrentPosition( - async (position) => { - frm.set_value("latitude", position.coords.latitude); - frm.set_value("longitude", position.coords.longitude); - - await frm.call("set_geolocation_from_coordinates"); - frappe.dom.unfreeze(); - }, - (error) => { - frappe.dom.unfreeze(); - - let msg = __("Unable to retrieve your location") + "

"; - if (error) { - msg += __("ERROR({0}): {1}", [error.code, error.message]); - } - frappe.msgprint({ - message: msg, - title: __("Geolocation Error"), - indicator: "red", - }); - }, - ); + fetch_geolocation: (frm) => { + hrms.fetch_geolocation(frm); }, }); diff --git a/hrms/hr/doctype/employee_checkin/employee_checkin.py b/hrms/hr/doctype/employee_checkin/employee_checkin.py index aca800de41..8d0acc1c72 100644 --- a/hrms/hr/doctype/employee_checkin/employee_checkin.py +++ b/hrms/hr/doctype/employee_checkin/employee_checkin.py @@ -7,10 +7,8 @@ from frappe.model.document import Document from frappe.utils import cint, get_datetime -from hrms.hr.doctype.shift_assignment.shift_assignment import ( - get_actual_start_end_datetime_of_shift, -) -from hrms.hr.utils import validate_active_employee +from hrms.hr.doctype.shift_assignment.shift_assignment import get_actual_start_end_datetime_of_shift +from hrms.hr.utils import set_geolocation_from_coordinates, validate_active_employee class EmployeeCheckin(Document): @@ -18,7 +16,7 @@ def validate(self): validate_active_employee(self.employee) self.validate_duplicate_log() self.fetch_shift() - self.set_geolocation_from_coordinates() + set_geolocation_from_coordinates(self) def validate_duplicate_log(self): doc = frappe.db.exists( @@ -61,28 +59,6 @@ def fetch_shift(self): else: self.shift = None - @frappe.whitelist() - def set_geolocation_from_coordinates(self): - if not frappe.db.get_single_value("HR Settings", "allow_geolocation_tracking"): - return - - if not (self.latitude and self.longitude): - return - - self.geolocation = frappe.json.dumps( - { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "properties": {}, - # geojson needs coordinates in reverse order: long, lat instead of lat, long - "geometry": {"type": "Point", "coordinates": [self.longitude, self.latitude]}, - } - ], - } - ) - @frappe.whitelist() def add_log_based_on_employee_field( diff --git a/hrms/hr/doctype/shift_location/shift_location.js b/hrms/hr/doctype/shift_location/shift_location.js index 877c81c0a4..8978c25b17 100644 --- a/hrms/hr/doctype/shift_location/shift_location.js +++ b/hrms/hr/doctype/shift_location/shift_location.js @@ -1,8 +1,26 @@ // Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and contributors // For license information, please see license.txt -// frappe.ui.form.on("Shift Location", { -// refresh(frm) { +frappe.ui.form.on("Shift Location", { + refresh: async () => { + const allow_geolocation_tracking = await frappe.db.get_single_value( + "HR Settings", + "allow_geolocation_tracking", + ); -// }, -// }); + if (!allow_geolocation_tracking) { + hide_field([ + "checkin_radius", + "fetch_geolocation", + "latitude", + "longitude", + "geolocation", + ]); + return; + } + }, + + fetch_geolocation: (frm) => { + hrms.fetch_geolocation(frm); + }, +}); diff --git a/hrms/hr/doctype/shift_location/shift_location.json b/hrms/hr/doctype/shift_location/shift_location.json index 6df8f26ed9..39e2f69553 100644 --- a/hrms/hr/doctype/shift_location/shift_location.json +++ b/hrms/hr/doctype/shift_location/shift_location.json @@ -12,6 +12,7 @@ "latitude", "longitude", "section_break_xxli", + "fetch_geolocation", "geolocation" ], "fields": [ @@ -51,10 +52,15 @@ "fieldname": "latitude", "fieldtype": "Float", "label": "Latitude" + }, + { + "fieldname": "fetch_geolocation", + "fieldtype": "Button", + "label": "Fetch Geolocation" } ], "links": [], - "modified": "2024-07-04 12:31:00.609940", + "modified": "2024-07-04 15:11:06.272970", "modified_by": "Administrator", "module": "HR", "name": "Shift Location", diff --git a/hrms/hr/doctype/shift_location/shift_location.py b/hrms/hr/doctype/shift_location/shift_location.py index db41c83498..c9c94627df 100644 --- a/hrms/hr/doctype/shift_location/shift_location.py +++ b/hrms/hr/doctype/shift_location/shift_location.py @@ -1,9 +1,12 @@ # Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt -# import frappe +import frappe from frappe.model.document import Document +from hrms.hr.utils import set_geolocation_from_coordinates + class ShiftLocation(Document): - pass + def validate(self): + set_geolocation_from_coordinates(self) diff --git a/hrms/hr/utils.py b/hrms/hr/utils.py index aaf1080089..1e5945dec5 100644 --- a/hrms/hr/utils.py +++ b/hrms/hr/utils.py @@ -845,3 +845,26 @@ def notify_bulk_action_status(doctype: str, failure: list, success: list) -> Non title=title, is_minimizable=True, ) + + +@frappe.whitelist() +def set_geolocation_from_coordinates(doc): + if not frappe.db.get_single_value("HR Settings", "allow_geolocation_tracking"): + return + + if not (doc.latitude and doc.longitude): + return + + doc.geolocation = frappe.json.dumps( + { + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "properties": {}, + # geojson needs coordinates in reverse order: long, lat instead of lat, long + "geometry": {"type": "Point", "coordinates": [doc.longitude, doc.latitude]}, + } + ], + } + ) diff --git a/hrms/public/js/utils/index.js b/hrms/public/js/utils/index.js index a835910308..b097509c5c 100644 --- a/hrms/public/js/utils/index.js +++ b/hrms/public/js/utils/index.js @@ -178,4 +178,41 @@ $.extend(hrms, { is_minimizable: true, }); }, + + fetch_geolocation: async (frm) => { + if (!navigator.geolocation) { + frappe.msgprint({ + message: __("Geolocation is not supported by your current browser"), + title: __("Geolocation Error"), + indicator: "red", + }); + hide_field(["geolocation"]); + return; + } + + frappe.dom.freeze(__("Fetching your geolocation") + "..."); + + navigator.geolocation.getCurrentPosition( + async (position) => { + frm.set_value("latitude", position.coords.latitude); + frm.set_value("longitude", position.coords.longitude); + + await frm.call("hrms.hr.utils.set_geolocation_from_coordinates"); + frappe.dom.unfreeze(); + }, + (error) => { + frappe.dom.unfreeze(); + + let msg = __("Unable to retrieve your location") + "

"; + if (error) { + msg += __("ERROR({0}): {1}", [error.code, error.message]); + } + frappe.msgprint({ + message: msg, + title: __("Geolocation Error"), + indicator: "red", + }); + }, + ); + }, }); From 89c7341ca473836db7f03a755b6cea42f3dbbd94 Mon Sep 17 00:00:00 2001 From: krantheman Date: Thu, 4 Jul 2024 17:51:31 +0530 Subject: [PATCH 09/25] feat(Employee Checkin): validate distance from shift location --- .../employee_checkin/employee_checkin.py | 34 ++++++++++++++++++- hrms/hr/utils.py | 10 ++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/hrms/hr/doctype/employee_checkin/employee_checkin.py b/hrms/hr/doctype/employee_checkin/employee_checkin.py index 8d0acc1c72..f585c402e1 100644 --- a/hrms/hr/doctype/employee_checkin/employee_checkin.py +++ b/hrms/hr/doctype/employee_checkin/employee_checkin.py @@ -8,7 +8,11 @@ from frappe.utils import cint, get_datetime from hrms.hr.doctype.shift_assignment.shift_assignment import get_actual_start_end_datetime_of_shift -from hrms.hr.utils import set_geolocation_from_coordinates, validate_active_employee +from hrms.hr.utils import ( + get_distance_between_coordinates, + set_geolocation_from_coordinates, + validate_active_employee, +) class EmployeeCheckin(Document): @@ -17,6 +21,7 @@ def validate(self): self.validate_duplicate_log() self.fetch_shift() set_geolocation_from_coordinates(self) + self.validate_distance_from_shift_location() def validate_duplicate_log(self): doc = frappe.db.exists( @@ -59,6 +64,33 @@ def fetch_shift(self): else: self.shift = None + def validate_distance_from_shift_location(self): + assignment_locations = frappe.get_all( + "Shift Assignment", + filters={ + "employee": self.employee, + "shift_type": self.shift, + "start_date": ["<=", self.time], + "shift_location": ["is", "set"], + }, + or_filters=[["end_date", ">=", self.time], ["end_date", "is", "not set"]], + pluck="shift_location", + ) + if not assignment_locations: + return + + checkin_radius, latitude, longitude = frappe.db.get_value( + "Shift Location", assignment_locations[0], ["checkin_radius", "latitude", "longitude"] + ) + if checkin_radius <= 0: + return + + distance = get_distance_between_coordinates(latitude, longitude, self.latitude, self.longitude) + if distance > checkin_radius: + frappe.throw( + _("You must be within {0} meters of your shift location to check in.").format(checkin_radius) + ) + @frappe.whitelist() def add_log_based_on_employee_field( diff --git a/hrms/hr/utils.py b/hrms/hr/utils.py index 1e5945dec5..9b1ec26ef4 100644 --- a/hrms/hr/utils.py +++ b/hrms/hr/utils.py @@ -868,3 +868,13 @@ def set_geolocation_from_coordinates(doc): ], } ) + + +def get_distance_between_coordinates(lat1, long1, lat2, long2): + from math import asin, cos, pi, sqrt + + r = 6371 + p = pi / 180 + + a = 0.5 - cos((lat2 - lat1) * p) / 2 + cos(lat1 * p) * cos(lat2 * p) * (1 - cos((long2 - long1) * p)) / 2 + return 2 * r * asin(sqrt(a)) * 1000 From 6973582a30a3981f8435a751cfc20f34edd250a0 Mon Sep 17 00:00:00 2001 From: krantheman Date: Fri, 12 Jul 2024 14:43:15 +0530 Subject: [PATCH 10/25] fix: consider only submited shift assignments while validating distance --- hrms/hr/doctype/employee_checkin/employee_checkin.py | 1 + hrms/hr/doctype/shift_location/shift_location.js | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/hrms/hr/doctype/employee_checkin/employee_checkin.py b/hrms/hr/doctype/employee_checkin/employee_checkin.py index f585c402e1..cf4bce71e0 100644 --- a/hrms/hr/doctype/employee_checkin/employee_checkin.py +++ b/hrms/hr/doctype/employee_checkin/employee_checkin.py @@ -72,6 +72,7 @@ def validate_distance_from_shift_location(self): "shift_type": self.shift, "start_date": ["<=", self.time], "shift_location": ["is", "set"], + "docstatus": 1, }, or_filters=[["end_date", ">=", self.time], ["end_date", "is", "not set"]], pluck="shift_location", diff --git a/hrms/hr/doctype/shift_location/shift_location.js b/hrms/hr/doctype/shift_location/shift_location.js index 8978c25b17..3439f8d097 100644 --- a/hrms/hr/doctype/shift_location/shift_location.js +++ b/hrms/hr/doctype/shift_location/shift_location.js @@ -8,7 +8,7 @@ frappe.ui.form.on("Shift Location", { "allow_geolocation_tracking", ); - if (!allow_geolocation_tracking) { + if (!allow_geolocation_tracking) hide_field([ "checkin_radius", "fetch_geolocation", @@ -16,8 +16,6 @@ frappe.ui.form.on("Shift Location", { "longitude", "geolocation", ]); - return; - } }, fetch_geolocation: (frm) => { From 8eab7f154e663e99c12b1c7ee30c6e7d650131c9 Mon Sep 17 00:00:00 2001 From: krantheman Date: Fri, 12 Jul 2024 16:35:36 +0530 Subject: [PATCH 11/25] test: add test for geofencing --- .../employee_checkin/employee_checkin.py | 13 ++- .../employee_checkin/test_employee_checkin.py | 86 +++++++++++++++++-- hrms/hr/doctype/shift_type/test_shift_type.py | 5 +- 3 files changed, 96 insertions(+), 8 deletions(-) diff --git a/hrms/hr/doctype/employee_checkin/employee_checkin.py b/hrms/hr/doctype/employee_checkin/employee_checkin.py index cf4bce71e0..461d0832b9 100644 --- a/hrms/hr/doctype/employee_checkin/employee_checkin.py +++ b/hrms/hr/doctype/employee_checkin/employee_checkin.py @@ -15,6 +15,10 @@ ) +class CheckinRadiusExceededError(frappe.ValidationError): + pass + + class EmployeeCheckin(Document): def validate(self): validate_active_employee(self.employee) @@ -65,6 +69,12 @@ def fetch_shift(self): self.shift = None def validate_distance_from_shift_location(self): + if not frappe.db.get_single_value("HR Settings", "allow_geolocation_tracking"): + return + + if not (self.latitude or self.longitude): + frappe.throw(_("Latitude and longitude values are required for checking in.")) + assignment_locations = frappe.get_all( "Shift Assignment", filters={ @@ -89,7 +99,8 @@ def validate_distance_from_shift_location(self): distance = get_distance_between_coordinates(latitude, longitude, self.latitude, self.longitude) if distance > checkin_radius: frappe.throw( - _("You must be within {0} meters of your shift location to check in.").format(checkin_radius) + _("You must be within {0} meters of your shift location to check in.").format(checkin_radius), + exc=CheckinRadiusExceededError, ) diff --git a/hrms/hr/doctype/employee_checkin/test_employee_checkin.py b/hrms/hr/doctype/employee_checkin/test_employee_checkin.py index a5cf25fabe..9b17371a66 100644 --- a/hrms/hr/doctype/employee_checkin/test_employee_checkin.py +++ b/hrms/hr/doctype/employee_checkin/test_employee_checkin.py @@ -16,14 +16,13 @@ ) from erpnext.setup.doctype.employee.test_employee import make_employee -from erpnext.setup.doctype.holiday_list.test_holiday_list import set_holiday_list from hrms.hr.doctype.employee_checkin.employee_checkin import ( + CheckinRadiusExceededError, add_log_based_on_employee_field, calculate_working_hours, mark_attendance_and_link_log, ) -from hrms.hr.doctype.leave_application.test_leave_application import get_first_sunday from hrms.hr.doctype.shift_type.test_shift_type import make_shift_assignment, setup_shift_type from hrms.payroll.doctype.salary_slip.test_salary_slip import make_holiday_list @@ -38,6 +37,8 @@ def setUp(self): to_date = get_year_ending(getdate()) self.holiday_list = make_holiday_list(from_date=from_date, to_date=to_date) + frappe.db.set_single_value("HR Settings", "allow_geolocation_tracking", 0) + def test_geolocation_tracking(self): employee = make_employee("test_add_log_based_on_employee_field@example.com") checkin = make_checkin(employee) @@ -48,9 +49,7 @@ def test_geolocation_tracking(self): # geolocation tracking is disabled self.assertIsNone(checkin.geolocation) - hr_settings = frappe.get_single("HR Settings") - hr_settings.allow_geolocation_tracking = 1 - hr_settings.save() + frappe.db.set_single_value("HR Settings", "allow_geolocation_tracking", 1) checkin.save() self.assertEqual( @@ -490,6 +489,65 @@ def test_consecutive_shift_assignments_overlapping_within_grace_period(self): log = make_checkin(employee, timestamp) self.assertEqual(log.shift, shift2.name) + @change_settings("HR Settings", {"allow_multiple_shift_assignments": 1}) + @change_settings("HR Settings", {"allow_geolocation_tracking": 1}) + def test_geofencing(self): + employee = make_employee("test_shift@example.com", company="_Test Company") + + # 8 - 12 + shift1 = setup_shift_type() + # 15 - 19 + shift2 = setup_shift_type(shift_type="Consecutive Shift", start_time="15:00:00", end_time="19:00:00") + + date = getdate() + location1 = make_shift_location("Loc A", 24, 72) + location2 = make_shift_location("Loc B", 25, 75, checkin_radius=2000) + make_shift_assignment(shift1.name, employee, date, shift_location=location1.name) + make_shift_assignment(shift2.name, employee, date, shift_location=location2.name) + + timestamp = datetime.combine(add_days(date, -1), get_time("11:00:00")) + # allowed as it is before the shift start date + make_checkin(employee, timestamp, 20, 65) + + timestamp = datetime.combine(date, get_time("06:00:00")) + # allowed as it is before the shift start time + make_checkin(employee, timestamp, 20, 65) + + timestamp = datetime.combine(date, get_time("10:00:00")) + # allowed as distance (150m) is within checkin radius (500m) + make_checkin(employee, timestamp, 24.001, 72.001) + + timestamp = datetime.combine(date, get_time("10:30:00")) + log = frappe.get_doc( + { + "doctype": "Employee Checkin", + "employee": employee, + "time": timestamp, + "latitude": 24.01, + "longitude": 72.01, + } + ) + # not allowed as distance (1506m) is not within checkin radius + self.assertRaises(CheckinRadiusExceededError, log.insert) + + # to ensure that the correct shift assignment is considered + timestamp = datetime.combine(date, get_time("16:00:00")) + # allowed as distance (1506m) is within checkin radius (2000m) + make_checkin(employee, timestamp, 25.01, 75.01) + + timestamp = datetime.combine(date, get_time("16:30:00")) + log = frappe.get_doc( + { + "doctype": "Employee Checkin", + "employee": employee, + "time": timestamp, + "latitude": 25.1, + "longitude": 75.1, + } + ) + # not allowed as distance (15004m) is not within checkin radius + self.assertRaises(CheckinRadiusExceededError, log.insert) + def make_n_checkins(employee, n, hours_to_reverse=1): logs = [make_checkin(employee, now_datetime() - timedelta(hours=hours_to_reverse, minutes=n + 1))] @@ -498,7 +556,7 @@ def make_n_checkins(employee, n, hours_to_reverse=1): return logs -def make_checkin(employee, time=None): +def make_checkin(employee, time=None, latitude=None, longitude=None): if not time: time = now_datetime() @@ -509,6 +567,22 @@ def make_checkin(employee, time=None): "time": time, "device_id": "device1", "log_type": "IN", + "latitude": latitude, + "longitude": longitude, } ).insert() return log + + +def make_shift_location(location_name, latitude, longitude, checkin_radius=500): + shift_location = frappe.get_doc( + { + "doctype": "Shift Location", + "location_name": location_name, + "latitude": latitude, + "longitude": longitude, + "checkin_radius": checkin_radius, + } + ).insert() + + return shift_location diff --git a/hrms/hr/doctype/shift_type/test_shift_type.py b/hrms/hr/doctype/shift_type/test_shift_type.py index f961d5218a..997856a52d 100644 --- a/hrms/hr/doctype/shift_type/test_shift_type.py +++ b/hrms/hr/doctype/shift_type/test_shift_type.py @@ -653,7 +653,9 @@ def setup_shift_type(**args): return shift_type -def make_shift_assignment(shift_type, employee, start_date, end_date=None, do_not_submit=False): +def make_shift_assignment( + shift_type, employee, start_date, end_date=None, do_not_submit=False, shift_location=None +): shift_assignment = frappe.get_doc( { "doctype": "Shift Assignment", @@ -662,6 +664,7 @@ def make_shift_assignment(shift_type, employee, start_date, end_date=None, do_no "employee": employee, "start_date": start_date, "end_date": end_date, + "shift_location": shift_location, } ) if not do_not_submit: From 161d81be09845884ac70f9ebfc3b2db185cb6c9d Mon Sep 17 00:00:00 2001 From: krantheman Date: Fri, 12 Jul 2024 17:08:13 +0530 Subject: [PATCH 12/25] fix: formatting --- hrms/public/js/utils/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hrms/public/js/utils/index.js b/hrms/public/js/utils/index.js index 29b740e6e2..e8aacff1c2 100644 --- a/hrms/public/js/utils/index.js +++ b/hrms/public/js/utils/index.js @@ -214,6 +214,8 @@ $.extend(hrms, { }); }, ); + }, + get_doctype_fields_for_autocompletion: (doctype) => { const fields = frappe.get_meta(doctype).fields; const autocompletions = []; From 9b325b749941abe4e98e887f665210e878e39179 Mon Sep 17 00:00:00 2001 From: krantheman Date: Wed, 9 Oct 2024 14:20:37 +0530 Subject: [PATCH 13/25] feat(Expense Claim): allow update of cost centre and project on submit --- hrms/hr/doctype/expense_claim/expense_claim.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/hrms/hr/doctype/expense_claim/expense_claim.json b/hrms/hr/doctype/expense_claim/expense_claim.json index aab00135ce..14268a0eba 100644 --- a/hrms/hr/doctype/expense_claim/expense_claim.json +++ b/hrms/hr/doctype/expense_claim/expense_claim.json @@ -177,6 +177,7 @@ "read_only": 1 }, { + "allow_on_submit": 1, "fieldname": "project", "fieldtype": "Link", "label": "Project", @@ -248,6 +249,7 @@ "options": "Account" }, { + "allow_on_submit": 1, "fetch_from": "company.cost_center", "fetch_if_empty": 1, "fieldname": "cost_center", @@ -388,7 +390,7 @@ "idx": 1, "is_submittable": 1, "links": [], - "modified": "2024-06-12 15:56:45.609119", + "modified": "2024-10-09 14:16:06.715586", "modified_by": "Administrator", "module": "HR", "name": "Expense Claim", From 8d34343e152677dab34f94ba7d4259b91e3e9009 Mon Sep 17 00:00:00 2001 From: krantheman Date: Wed, 9 Oct 2024 15:41:29 +0530 Subject: [PATCH 14/25] feat(Shift & Attendance): add Shift Location link --- .../shift_&_attendance/shift_&_attendance.json | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/hrms/hr/workspace/shift_&_attendance/shift_&_attendance.json b/hrms/hr/workspace/shift_&_attendance/shift_&_attendance.json index 9e0595bde8..c6fb135cea 100644 --- a/hrms/hr/workspace/shift_&_attendance/shift_&_attendance.json +++ b/hrms/hr/workspace/shift_&_attendance/shift_&_attendance.json @@ -1,4 +1,5 @@ { + "app": "hrms", "charts": [ { "chart_name": "Attendance Count", @@ -165,7 +166,7 @@ "hidden": 0, "is_query_report": 0, "label": "Shifts", - "link_count": 5, + "link_count": 6, "link_type": "DocType", "onboard": 0, "type": "Card Break" @@ -180,6 +181,16 @@ "onboard": 0, "type": "Link" }, + { + "hidden": 0, + "is_query_report": 0, + "label": "Shift Location", + "link_count": 0, + "link_to": "Shift Location", + "link_type": "DocType", + "onboard": 0, + "type": "Link" + }, { "hidden": 0, "is_query_report": 0, @@ -221,7 +232,7 @@ "type": "Link" } ], - "modified": "2024-08-07 14:42:16.893494", + "modified": "2024-10-09 15:40:48.672192", "modified_by": "Administrator", "module": "HR", "name": "Shift & Attendance", @@ -272,5 +283,6 @@ "type": "DocType" } ], - "title": "Shift & Attendance" + "title": "Shift & Attendance", + "type": "Workspace" } \ No newline at end of file From 8b452a4939122da77cd638b8f0dc059e045ec233 Mon Sep 17 00:00:00 2001 From: krantheman Date: Wed, 9 Oct 2024 16:19:03 +0530 Subject: [PATCH 15/25] chore: update site urls from frappehr.com to frappe.io/hr --- .github/ISSUE_TEMPLATE/feature_request.yaml | 4 ++-- .github/helper/documentation.py | 2 +- README.md | 2 +- hrms/hr/doctype/leave_type/leave_type.js | 2 +- package.json | 2 +- pyproject.toml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 8953fc6a6d..1ea3aeea8a 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -10,7 +10,7 @@ body: Welcome to Frappe HR issue tracker! Before submitting a request, please consider the following: 1. This tracker should only be used to report bugs and request features / enhancements to Frappe HR - - For questions and general support, checkout the [documentation](https://frappehr.com/docs) or use the [forum](https://discuss.frappe.io) to get inputs from the open source community. + - For questions and general support, checkout the [documentation](https://docs.frappe.io/hr) or use the [forum](https://discuss.frappe.io) to get inputs from the open source community. 2. Use the search function before creating a new issue. Duplicates will be closed and directed to the original discussion. 3. When making a feature request, make sure to be as verbose as possible. The better you convey your message, the greater the drive to make it happen. @@ -47,4 +47,4 @@ body: attributes: label: Additional context description: Add any other context or screenshots about the feature request here. -... \ No newline at end of file +... diff --git a/.github/helper/documentation.py b/.github/helper/documentation.py index fce884e412..2f610aafad 100644 --- a/.github/helper/documentation.py +++ b/.github/helper/documentation.py @@ -17,7 +17,7 @@ def docs_link_exists(body): parts = parsed_url.path.split("/") if len(parts) == 5 and parts[1] == "frappe" and parts[2] == "hrms": return True - elif parsed_url.netloc == "frappehr.com": + elif parsed_url.netloc == "docs.frappe.io": return True diff --git a/README.md b/README.md index a17fdcb25f..c047335375 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ Frappe HR has everything you need to drive excellence within the company. It's a ## Learning and Community -1. [Documentation](https://frappehr.com/docs) - Extensive documentation for Frappe HR. +1. [Documentation](https://docs.frappe.io/hr) - Extensive documentation for Frappe HR. 2. [User Forum](https://discuss.erpnext.com/) - Engage with the community of ERPNext users and service providers. 3. [Telegram Group](https://t.me/frappehr) - Get instant help from the community of users. diff --git a/hrms/hr/doctype/leave_type/leave_type.js b/hrms/hr/doctype/leave_type/leave_type.js index c4cae2afe0..f04ce807e2 100644 --- a/hrms/hr/doctype/leave_type/leave_type.js +++ b/hrms/hr/doctype/leave_type/leave_type.js @@ -30,7 +30,7 @@ frappe.tour["Leave Type"] = [ description: __( "Leaves you can avail against a holiday you worked on. You can claim Compensatory Off Leave using Compensatory Leave Request. Click {0} to know more", [ - `${__( + `${__( "here", )}`, ], diff --git a/package.json b/package.json index 39028b1d25..f986c9864c 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "type": "git", "url": "git+https://github.com/frappe/hrms.git" }, - "homepage": "https://frappehr.com", + "homepage": "https://frappe.io/hr", "author": "Frappe Technologies Pvt. Ltd.", "license": "GPL-3.0", "bugs": { diff --git a/pyproject.toml b/pyproject.toml index 17ec144c80..0b7dffd3c0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,7 +60,7 @@ section-order = [ [project.urls] -Homepage = "https://frappehr.com/" +Homepage = "https://frappe.io/hr" Repository = "https://github.com/frappe/hrms.git" "Bug Reports" = "https://github.com/frappe/hrms/issues" From b3ed579008184233721f4eb277c4c1375f949232 Mon Sep 17 00:00:00 2001 From: krantheman Date: Thu, 10 Oct 2024 12:55:54 +0530 Subject: [PATCH 16/25] feat(Shift Location): add Shift Assignment connection --- hrms/hr/doctype/shift_location/shift_location.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/hrms/hr/doctype/shift_location/shift_location.json b/hrms/hr/doctype/shift_location/shift_location.json index 39e2f69553..a977f60276 100644 --- a/hrms/hr/doctype/shift_location/shift_location.json +++ b/hrms/hr/doctype/shift_location/shift_location.json @@ -59,8 +59,13 @@ "label": "Fetch Geolocation" } ], - "links": [], - "modified": "2024-07-04 15:11:06.272970", + "links": [ + { + "link_doctype": "Shift Assignment", + "link_fieldname": "shift_location" + } + ], + "modified": "2024-10-10 12:54:26.209170", "modified_by": "Administrator", "module": "HR", "name": "Shift Location", From adf089a7d80224df2e74b39d5162945f6b2049be Mon Sep 17 00:00:00 2001 From: krantheman Date: Thu, 10 Oct 2024 17:52:41 +0530 Subject: [PATCH 17/25] refactor: use IntegrationTestCase instead of FrappeTestCase --- hrms/controllers/tests/test_employee_reminders.py | 4 ++-- .../doctype/appointment_letter/test_appointment_letter.py | 4 ++-- .../test_appointment_letter_template.py | 4 ++-- hrms/hr/doctype/appraisal/test_appraisal.py | 4 ++-- hrms/hr/doctype/appraisal_cycle/test_appraisal_cycle.py | 4 ++-- .../doctype/appraisal_template/test_appraisal_template.py | 4 ++-- hrms/hr/doctype/attendance/test_attendance.py | 4 ++-- .../doctype/attendance_request/test_attendance_request.py | 4 ++-- .../test_compensatory_leave_request.py | 4 ++-- .../doctype/daily_work_summary/test_daily_work_summary.py | 4 ++-- hrms/hr/doctype/employee_advance/test_employee_advance.py | 4 ++-- .../test_employee_attendance_tool.py | 4 ++-- hrms/hr/doctype/employee_checkin/test_employee_checkin.py | 4 ++-- .../test_employee_feedback_criteria.py | 4 ++-- hrms/hr/doctype/employee_grade/test_employee_grade.py | 4 ++-- .../doctype/employee_grievance/test_employee_grievance.py | 4 ++-- .../test_employee_health_insurance.py | 4 ++-- .../doctype/employee_onboarding/test_employee_onboarding.py | 4 ++-- .../test_employee_onboarding_template.py | 4 ++-- .../test_employee_performance_feedback.py | 4 ++-- .../doctype/employee_promotion/test_employee_promotion.py | 4 ++-- hrms/hr/doctype/employee_referral/test_employee_referral.py | 4 ++-- .../doctype/employee_separation/test_employee_separation.py | 4 ++-- .../test_employee_separation_template.py | 4 ++-- hrms/hr/doctype/employee_transfer/test_employee_transfer.py | 4 ++-- hrms/hr/doctype/exit_interview/test_exit_interview.py | 4 ++-- hrms/hr/doctype/expense_claim/test_expense_claim.py | 4 ++-- .../doctype/expense_claim_type/test_expense_claim_type.py | 4 ++-- .../full_and_final_asset/test_full_and_final_asset.py | 4 ++-- .../test_full_and_final_statement.py | 4 ++-- hrms/hr/doctype/goal/test_goal.py | 4 ++-- hrms/hr/doctype/grievance_type/test_grievance_type.py | 4 ++-- hrms/hr/doctype/hr_settings/test_hr_settings.py | 4 ++-- .../test_identification_document_type.py | 4 ++-- hrms/hr/doctype/interest/test_interest.py | 4 ++-- hrms/hr/doctype/interview/test_interview.py | 4 ++-- .../doctype/interview_feedback/test_interview_feedback.py | 4 ++-- hrms/hr/doctype/interview_round/test_interview_round.py | 4 ++-- hrms/hr/doctype/interview_type/test_interview_type.py | 4 ++-- hrms/hr/doctype/job_applicant/test_job_applicant.py | 4 ++-- .../job_applicant_source/test_job_applicant_source.py | 4 ++-- hrms/hr/doctype/job_offer/test_job_offer.py | 4 ++-- .../job_offer_term_template/test_job_offer_term_template.py | 4 ++-- hrms/hr/doctype/job_opening/test_job_opening.py | 4 ++-- hrms/hr/doctype/job_requisition/test_job_requisition.py | 4 ++-- hrms/hr/doctype/kra/test_kra.py | 4 ++-- hrms/hr/doctype/leave_allocation/test_earned_leaves.py | 4 ++-- hrms/hr/doctype/leave_allocation/test_leave_allocation.py | 4 ++-- hrms/hr/doctype/leave_application/test_leave_application.py | 4 ++-- hrms/hr/doctype/leave_block_list/test_leave_block_list.py | 4 ++-- .../doctype/leave_control_panel/test_leave_control_panel.py | 4 ++-- hrms/hr/doctype/leave_encashment/test_leave_encashment.py | 4 ++-- .../doctype/leave_ledger_entry/test_leave_ledger_entry.py | 4 ++-- hrms/hr/doctype/leave_period/test_leave_period.py | 4 ++-- hrms/hr/doctype/leave_policy/test_leave_policy.py | 4 ++-- .../leave_policy_assignment/test_leave_policy_assignment.py | 4 ++-- .../doctype/leave_policy_detail/test_leave_policy_detail.py | 4 ++-- hrms/hr/doctype/offer_term/test_offer_term.py | 4 ++-- hrms/hr/doctype/purpose_of_travel/test_purpose_of_travel.py | 4 ++-- hrms/hr/doctype/pwa_notification/test_pwa_notification.py | 4 ++-- hrms/hr/doctype/shift_assignment/test_shift_assignment.py | 4 ++-- .../test_shift_assignment_schedule.py | 4 ++-- .../shift_assignment_tool/test_shift_assignment_tool.py | 4 ++-- hrms/hr/doctype/shift_location/test_shift_location.py | 4 ++-- hrms/hr/doctype/shift_request/test_shift_request.py | 4 ++-- hrms/hr/doctype/shift_type/test_shift_type.py | 4 ++-- hrms/hr/doctype/staffing_plan/test_staffing_plan.py | 4 ++-- hrms/hr/doctype/training_event/test_training_event.py | 4 ++-- hrms/hr/doctype/training_feedback/test_training_feedback.py | 4 ++-- hrms/hr/doctype/training_program/test_training_program.py | 4 ++-- hrms/hr/doctype/training_result/test_training_result.py | 4 ++-- hrms/hr/doctype/travel_request/test_travel_request.py | 4 ++-- hrms/hr/doctype/upload_attendance/test_upload_attendance.py | 4 ++-- hrms/hr/doctype/vehicle_log/test_vehicle_log.py | 4 ++-- .../vehicle_service_item/test_vehicle_service_item.py | 4 ++-- .../page/organizational_chart/test_organizational_chart.py | 4 ++-- .../hr/report/appraisal_overview/test_appraisal_overview.py | 4 ++-- hrms/hr/report/employee_exits/test_employee_exits.py | 4 ++-- .../test_employee_util.py | 4 ++-- .../employee_leave_balance/test_employee_leave_balance.py | 4 ++-- .../test_employee_leave_balance_summary.py | 4 ++-- hrms/hr/report/leave_ledger/test_leave_ledger.py | 4 ++-- .../test_monthly_attendance_sheet.py | 4 ++-- .../project_profitability/test_project_profitability.py | 4 ++-- hrms/hr/report/shift_attendance/test_shift_attendance.py | 4 ++-- hrms/hr/report/vehicle_expenses/test_vehicle_expenses.py | 4 ++-- .../doctype/additional_salary/test_additional_salary.py | 4 ++-- .../test_bulk_salary_structure_assignment.py | 4 ++-- .../test_employee_benefit_application.py | 4 ++-- .../employee_benefit_claim/test_employee_benefit_claim.py | 4 ++-- .../doctype/employee_incentive/test_employee_incentive.py | 4 ++-- .../employee_other_income/test_employee_other_income.py | 4 ++-- .../test_employee_tax_exemption_category.py | 4 ++-- .../test_employee_tax_exemption_declaration.py | 4 ++-- .../test_employee_tax_exemption_proof_submission.py | 4 ++-- .../test_employee_tax_exemption_sub_category.py | 4 ++-- hrms/payroll/doctype/gratuity/test_gratuity.py | 4 ++-- hrms/payroll/doctype/gratuity_rule/test_gratuity_rule.py | 4 ++-- .../payroll/doctype/income_tax_slab/test_income_tax_slab.py | 4 ++-- hrms/payroll/doctype/payroll_entry/test_payroll_entry.py | 4 ++-- hrms/payroll/doctype/payroll_period/test_payroll_period.py | 4 ++-- .../doctype/payroll_settings/test_payroll_settings.py | 4 ++-- .../payroll/doctype/retention_bonus/test_retention_bonus.py | 4 ++-- .../doctype/salary_component/test_salary_component.py | 4 ++-- hrms/payroll/doctype/salary_slip/test_salary_slip.py | 6 +++--- .../doctype/salary_structure/test_salary_structure.py | 4 ++-- .../test_salary_structure_assignment.py | 4 ++-- .../doctype/salary_withholding/test_salary_withholding.py | 4 ++-- .../income_tax_computation/test_income_tax_computation.py | 4 ++-- .../income_tax_deductions/test_income_tax_deductions.py | 4 ++-- 110 files changed, 221 insertions(+), 221 deletions(-) diff --git a/hrms/controllers/tests/test_employee_reminders.py b/hrms/controllers/tests/test_employee_reminders.py index 0e1ed9456a..5760cee005 100644 --- a/hrms/controllers/tests/test_employee_reminders.py +++ b/hrms/controllers/tests/test_employee_reminders.py @@ -4,7 +4,7 @@ from datetime import timedelta import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_months, getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -14,7 +14,7 @@ from hrms.hr.utils import get_holidays_for_employee -class TestEmployeeReminders(FrappeTestCase): +class TestEmployeeReminders(IntegrationTestCase): @classmethod def setUpClass(cls): super().setUpClass() diff --git a/hrms/hr/doctype/appointment_letter/test_appointment_letter.py b/hrms/hr/doctype/appointment_letter/test_appointment_letter.py index 3e068c51f5..d7328ea3ba 100644 --- a/hrms/hr/doctype/appointment_letter/test_appointment_letter.py +++ b/hrms/hr/doctype/appointment_letter/test_appointment_letter.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestAppointmentLetter(FrappeTestCase): +class TestAppointmentLetter(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/appointment_letter_template/test_appointment_letter_template.py b/hrms/hr/doctype/appointment_letter_template/test_appointment_letter_template.py index 3d85a9c4ea..e5e895acf3 100644 --- a/hrms/hr/doctype/appointment_letter_template/test_appointment_letter_template.py +++ b/hrms/hr/doctype/appointment_letter_template/test_appointment_letter_template.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestAppointmentLetterTemplate(FrappeTestCase): +class TestAppointmentLetterTemplate(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/appraisal/test_appraisal.py b/hrms/hr/doctype/appraisal/test_appraisal.py index bff9a04db1..227e8daf6a 100644 --- a/hrms/hr/doctype/appraisal/test_appraisal.py +++ b/hrms/hr/doctype/appraisal/test_appraisal.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from erpnext.setup.doctype.designation.test_designation import create_designation from erpnext.setup.doctype.employee.test_employee import make_employee @@ -17,7 +17,7 @@ from hrms.tests.test_utils import create_company -class TestAppraisal(FrappeTestCase): +class TestAppraisal(IntegrationTestCase): def setUp(self): frappe.db.delete("Goal") frappe.db.delete("Appraisal") diff --git a/hrms/hr/doctype/appraisal_cycle/test_appraisal_cycle.py b/hrms/hr/doctype/appraisal_cycle/test_appraisal_cycle.py index 6ac8268edc..f66d8de634 100644 --- a/hrms/hr/doctype/appraisal_cycle/test_appraisal_cycle.py +++ b/hrms/hr/doctype/appraisal_cycle/test_appraisal_cycle.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from erpnext.setup.doctype.designation.test_designation import create_designation from erpnext.setup.doctype.employee.test_employee import make_employee @@ -11,7 +11,7 @@ from hrms.tests.test_utils import create_company -class TestAppraisalCycle(FrappeTestCase): +class TestAppraisalCycle(IntegrationTestCase): def setUp(self): company = create_company("_Test Appraisal").name self.template = create_appraisal_template() diff --git a/hrms/hr/doctype/appraisal_template/test_appraisal_template.py b/hrms/hr/doctype/appraisal_template/test_appraisal_template.py index 3047470ad4..1d86bf965b 100644 --- a/hrms/hr/doctype/appraisal_template/test_appraisal_template.py +++ b/hrms/hr/doctype/appraisal_template/test_appraisal_template.py @@ -2,10 +2,10 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestAppraisalTemplate(FrappeTestCase): +class TestAppraisalTemplate(IntegrationTestCase): def test_incorrect_weightage_allocation(self): template = create_appraisal_template() template.goals[1].per_weightage = 69.99 diff --git a/hrms/hr/doctype/attendance/test_attendance.py b/hrms/hr/doctype/attendance/test_attendance.py index 765723321e..27df19e9f7 100644 --- a/hrms/hr/doctype/attendance/test_attendance.py +++ b/hrms/hr/doctype/attendance/test_attendance.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import ( add_days, add_months, @@ -27,7 +27,7 @@ test_records = frappe.get_test_records("Attendance") -class TestAttendance(FrappeTestCase): +class TestAttendance(IntegrationTestCase): def setUp(self): from hrms.payroll.doctype.salary_slip.test_salary_slip import make_holiday_list diff --git a/hrms/hr/doctype/attendance_request/test_attendance_request.py b/hrms/hr/doctype/attendance_request/test_attendance_request.py index 096d533513..ec06fce8ca 100644 --- a/hrms/hr/doctype/attendance_request/test_attendance_request.py +++ b/hrms/hr/doctype/attendance_request/test_attendance_request.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, add_months, get_year_ending, get_year_start, getdate from hrms.hr.doctype.attendance.attendance import mark_attendance @@ -17,7 +17,7 @@ test_dependencies = ["Employee"] -class TestAttendanceRequest(FrappeTestCase): +class TestAttendanceRequest(IntegrationTestCase): def setUp(self): for doctype in ["Attendance Request", "Attendance"]: frappe.db.delete(doctype) diff --git a/hrms/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py b/hrms/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py index c05393a000..e8e52389ce 100644 --- a/hrms/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py +++ b/hrms/hr/doctype/compensatory_leave_request/test_compensatory_leave_request.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, add_months, today from hrms.hr.doctype.attendance_request.test_attendance_request import get_employee @@ -13,7 +13,7 @@ test_dependencies = ["Employee"] -class TestCompensatoryLeaveRequest(FrappeTestCase): +class TestCompensatoryLeaveRequest(IntegrationTestCase): def setUp(self): frappe.db.delete("Compensatory Leave Request") frappe.db.delete("Leave Ledger Entry") diff --git a/hrms/hr/doctype/daily_work_summary/test_daily_work_summary.py b/hrms/hr/doctype/daily_work_summary/test_daily_work_summary.py index 05c725ef91..95e0d3aaa5 100644 --- a/hrms/hr/doctype/daily_work_summary/test_daily_work_summary.py +++ b/hrms/hr/doctype/daily_work_summary/test_daily_work_summary.py @@ -5,12 +5,12 @@ import frappe import frappe.utils -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase # test_records = frappe.get_test_records('Daily Work Summary') -class TestDailyWorkSummary(FrappeTestCase): +class TestDailyWorkSummary(IntegrationTestCase): def test_email_trigger(self): self.setup_and_prepare_test() for d in self.users: diff --git a/hrms/hr/doctype/employee_advance/test_employee_advance.py b/hrms/hr/doctype/employee_advance/test_employee_advance.py index a37f9ad938..1c223445ac 100644 --- a/hrms/hr/doctype/employee_advance/test_employee_advance.py +++ b/hrms/hr/doctype/employee_advance/test_employee_advance.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import flt, nowdate import erpnext @@ -23,7 +23,7 @@ from hrms.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure -class TestEmployeeAdvance(FrappeTestCase): +class TestEmployeeAdvance(IntegrationTestCase): def setUp(self): frappe.db.delete("Employee Advance") diff --git a/hrms/hr/doctype/employee_attendance_tool/test_employee_attendance_tool.py b/hrms/hr/doctype/employee_attendance_tool/test_employee_attendance_tool.py index ca4cb0e9c4..0c7ff08731 100644 --- a/hrms/hr/doctype/employee_attendance_tool/test_employee_attendance_tool.py +++ b/hrms/hr/doctype/employee_attendance_tool/test_employee_attendance_tool.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -15,7 +15,7 @@ from hrms.hr.doctype.shift_type.test_shift_type import setup_shift_type -class TestEmployeeAttendanceTool(FrappeTestCase): +class TestEmployeeAttendanceTool(IntegrationTestCase): def setUp(self): frappe.db.delete("Attendance") diff --git a/hrms/hr/doctype/employee_checkin/test_employee_checkin.py b/hrms/hr/doctype/employee_checkin/test_employee_checkin.py index 98f7388a6d..aa532eb33b 100644 --- a/hrms/hr/doctype/employee_checkin/test_employee_checkin.py +++ b/hrms/hr/doctype/employee_checkin/test_employee_checkin.py @@ -4,7 +4,7 @@ from datetime import datetime, timedelta import frappe -from frappe.tests.utils import FrappeTestCase, change_settings +from frappe.tests import IntegrationTestCase, change_settings from frappe.utils import ( add_days, get_time, @@ -28,7 +28,7 @@ from hrms.payroll.doctype.salary_slip.test_salary_slip import make_holiday_list -class TestEmployeeCheckin(FrappeTestCase): +class TestEmployeeCheckin(IntegrationTestCase): def setUp(self): frappe.db.delete("Shift Type") frappe.db.delete("Shift Assignment") diff --git a/hrms/hr/doctype/employee_feedback_criteria/test_employee_feedback_criteria.py b/hrms/hr/doctype/employee_feedback_criteria/test_employee_feedback_criteria.py index dd300f8753..9cb43c489b 100644 --- a/hrms/hr/doctype/employee_feedback_criteria/test_employee_feedback_criteria.py +++ b/hrms/hr/doctype/employee_feedback_criteria/test_employee_feedback_criteria.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestEmployeeFeedbackCriteria(FrappeTestCase): +class TestEmployeeFeedbackCriteria(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/employee_grade/test_employee_grade.py b/hrms/hr/doctype/employee_grade/test_employee_grade.py index 95c43e7e94..20afd3f112 100644 --- a/hrms/hr/doctype/employee_grade/test_employee_grade.py +++ b/hrms/hr/doctype/employee_grade/test_employee_grade.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestEmployeeGrade(FrappeTestCase): +class TestEmployeeGrade(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/employee_grievance/test_employee_grievance.py b/hrms/hr/doctype/employee_grievance/test_employee_grievance.py index 3bb97864ae..b0cc8ad64e 100644 --- a/hrms/hr/doctype/employee_grievance/test_employee_grievance.py +++ b/hrms/hr/doctype/employee_grievance/test_employee_grievance.py @@ -2,13 +2,13 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import today from erpnext.setup.doctype.employee.test_employee import make_employee -class TestEmployeeGrievance(FrappeTestCase): +class TestEmployeeGrievance(IntegrationTestCase): def test_create_employee_grievance(self): create_employee_grievance() diff --git a/hrms/hr/doctype/employee_health_insurance/test_employee_health_insurance.py b/hrms/hr/doctype/employee_health_insurance/test_employee_health_insurance.py index f408ed6f79..fcfce7dc7b 100644 --- a/hrms/hr/doctype/employee_health_insurance/test_employee_health_insurance.py +++ b/hrms/hr/doctype/employee_health_insurance/test_employee_health_insurance.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestEmployeeHealthInsurance(FrappeTestCase): +class TestEmployeeHealthInsurance(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/employee_onboarding/test_employee_onboarding.py b/hrms/hr/doctype/employee_onboarding/test_employee_onboarding.py index 7dd734fb10..1d22865b0c 100644 --- a/hrms/hr/doctype/employee_onboarding/test_employee_onboarding.py +++ b/hrms/hr/doctype/employee_onboarding/test_employee_onboarding.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, getdate from hrms.hr.doctype.employee_onboarding.employee_onboarding import ( @@ -14,7 +14,7 @@ from hrms.tests.test_utils import create_company -class TestEmployeeOnboarding(FrappeTestCase): +class TestEmployeeOnboarding(IntegrationTestCase): def setUp(self): create_company() if frappe.db.exists("Employee Onboarding", {"employee_name": "Test Researcher"}): diff --git a/hrms/hr/doctype/employee_onboarding_template/test_employee_onboarding_template.py b/hrms/hr/doctype/employee_onboarding_template/test_employee_onboarding_template.py index 0d79a826d2..c3edfd8ff9 100644 --- a/hrms/hr/doctype/employee_onboarding_template/test_employee_onboarding_template.py +++ b/hrms/hr/doctype/employee_onboarding_template/test_employee_onboarding_template.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestEmployeeOnboardingTemplate(FrappeTestCase): +class TestEmployeeOnboardingTemplate(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/employee_performance_feedback/test_employee_performance_feedback.py b/hrms/hr/doctype/employee_performance_feedback/test_employee_performance_feedback.py index ecfe466bf3..2720a27ef4 100644 --- a/hrms/hr/doctype/employee_performance_feedback/test_employee_performance_feedback.py +++ b/hrms/hr/doctype/employee_performance_feedback/test_employee_performance_feedback.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from erpnext.setup.doctype.designation.test_designation import create_designation from erpnext.setup.doctype.employee.test_employee import make_employee @@ -12,7 +12,7 @@ from hrms.tests.test_utils import create_company -class TestEmployeePerformanceFeedback(FrappeTestCase): +class TestEmployeePerformanceFeedback(IntegrationTestCase): def setUp(self): frappe.db.delete("Employee Performance Feedback") frappe.db.delete("Appraisal") diff --git a/hrms/hr/doctype/employee_promotion/test_employee_promotion.py b/hrms/hr/doctype/employee_promotion/test_employee_promotion.py index 804a95c4e5..734f332f88 100644 --- a/hrms/hr/doctype/employee_promotion/test_employee_promotion.py +++ b/hrms/hr/doctype/employee_promotion/test_employee_promotion.py @@ -2,13 +2,13 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, getdate from hrms.payroll.doctype.salary_structure.test_salary_structure import make_employee -class TestEmployeePromotion(FrappeTestCase): +class TestEmployeePromotion(IntegrationTestCase): def setUp(self): frappe.db.delete("Employee Promotion") diff --git a/hrms/hr/doctype/employee_referral/test_employee_referral.py b/hrms/hr/doctype/employee_referral/test_employee_referral.py index a7d6f15096..8f3a40ba1a 100644 --- a/hrms/hr/doctype/employee_referral/test_employee_referral.py +++ b/hrms/hr/doctype/employee_referral/test_employee_referral.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import today from erpnext.setup.doctype.designation.test_designation import create_designation @@ -14,7 +14,7 @@ ) -class TestEmployeeReferral(FrappeTestCase): +class TestEmployeeReferral(IntegrationTestCase): def setUp(self): frappe.db.sql("DELETE FROM `tabJob Applicant`") frappe.db.sql("DELETE FROM `tabEmployee Referral`") diff --git a/hrms/hr/doctype/employee_separation/test_employee_separation.py b/hrms/hr/doctype/employee_separation/test_employee_separation.py index d27719de59..f7cf40ff78 100644 --- a/hrms/hr/doctype/employee_separation/test_employee_separation.py +++ b/hrms/hr/doctype/employee_separation/test_employee_separation.py @@ -2,13 +2,13 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import getdate test_dependencies = ["Employee Onboarding"] -class TestEmployeeSeparation(FrappeTestCase): +class TestEmployeeSeparation(IntegrationTestCase): def test_employee_separation(self): separation = create_employee_separation() diff --git a/hrms/hr/doctype/employee_separation_template/test_employee_separation_template.py b/hrms/hr/doctype/employee_separation_template/test_employee_separation_template.py index f7fe12e72b..0fed2100d6 100644 --- a/hrms/hr/doctype/employee_separation_template/test_employee_separation_template.py +++ b/hrms/hr/doctype/employee_separation_template/test_employee_separation_template.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestEmployeeSeparationTemplate(FrappeTestCase): +class TestEmployeeSeparationTemplate(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/employee_transfer/test_employee_transfer.py b/hrms/hr/doctype/employee_transfer/test_employee_transfer.py index 6a40170f68..d9ee255923 100644 --- a/hrms/hr/doctype/employee_transfer/test_employee_transfer.py +++ b/hrms/hr/doctype/employee_transfer/test_employee_transfer.py @@ -2,13 +2,13 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase, change_settings +from frappe.tests import IntegrationTestCase, change_settings from frappe.utils import add_days, getdate from erpnext.setup.doctype.employee.test_employee import make_employee -class TestEmployeeTransfer(FrappeTestCase): +class TestEmployeeTransfer(IntegrationTestCase): def setUp(self): create_company() diff --git a/hrms/hr/doctype/exit_interview/test_exit_interview.py b/hrms/hr/doctype/exit_interview/test_exit_interview.py index 710777d045..a4909672d0 100644 --- a/hrms/hr/doctype/exit_interview/test_exit_interview.py +++ b/hrms/hr/doctype/exit_interview/test_exit_interview.py @@ -6,8 +6,8 @@ import frappe from frappe import _ from frappe.core.doctype.user_permission.test_user_permission import create_user +from frappe.tests import IntegrationTestCase from frappe.tests.test_webform import create_custom_doctype, create_webform -from frappe.tests.utils import FrappeTestCase from frappe.utils import getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -15,7 +15,7 @@ from hrms.hr.doctype.exit_interview.exit_interview import send_exit_questionnaire -class TestExitInterview(FrappeTestCase): +class TestExitInterview(IntegrationTestCase): def setUp(self): frappe.db.sql("delete from `tabExit Interview`") diff --git a/hrms/hr/doctype/expense_claim/test_expense_claim.py b/hrms/hr/doctype/expense_claim/test_expense_claim.py index 2d74922eae..4094932b91 100644 --- a/hrms/hr/doctype/expense_claim/test_expense_claim.py +++ b/hrms/hr/doctype/expense_claim/test_expense_claim.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import flt, nowdate, random_string from erpnext.accounts.doctype.account.test_account import create_account @@ -19,7 +19,7 @@ company_name = "_Test Company 3" -class TestExpenseClaim(FrappeTestCase): +class TestExpenseClaim(IntegrationTestCase): def setUp(self): if not frappe.db.get_value("Cost Center", {"company": company_name}): cost_center = frappe.new_doc("Cost Center") diff --git a/hrms/hr/doctype/expense_claim_type/test_expense_claim_type.py b/hrms/hr/doctype/expense_claim_type/test_expense_claim_type.py index b1906581ca..236de562df 100644 --- a/hrms/hr/doctype/expense_claim_type/test_expense_claim_type.py +++ b/hrms/hr/doctype/expense_claim_type/test_expense_claim_type.py @@ -1,10 +1,10 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase # test_records = frappe.get_test_records('Expense Claim Type') -class TestExpenseClaimType(FrappeTestCase): +class TestExpenseClaimType(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/full_and_final_asset/test_full_and_final_asset.py b/hrms/hr/doctype/full_and_final_asset/test_full_and_final_asset.py index c52dd9b484..f54c7c0b08 100644 --- a/hrms/hr/doctype/full_and_final_asset/test_full_and_final_asset.py +++ b/hrms/hr/doctype/full_and_final_asset/test_full_and_final_asset.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestFullandFinalAsset(FrappeTestCase): +class TestFullandFinalAsset(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/full_and_final_statement/test_full_and_final_statement.py b/hrms/hr/doctype/full_and_final_statement/test_full_and_final_statement.py index d1d0deeec3..ed5cae7949 100644 --- a/hrms/hr/doctype/full_and_final_statement/test_full_and_final_statement.py +++ b/hrms/hr/doctype/full_and_final_statement/test_full_and_final_statement.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, today from erpnext.assets.doctype.asset.test_asset import create_asset_data @@ -10,7 +10,7 @@ from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt -class TestFullandFinalStatement(FrappeTestCase): +class TestFullandFinalStatement(IntegrationTestCase): def setUp(self): for dt in ["Full and Final Statement", "Asset", "Asset Movement", "Asset Movement Item"]: frappe.db.delete(dt) diff --git a/hrms/hr/doctype/goal/test_goal.py b/hrms/hr/doctype/goal/test_goal.py index 4085714580..947393d85d 100644 --- a/hrms/hr/doctype/goal/test_goal.py +++ b/hrms/hr/doctype/goal/test_goal.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from erpnext.setup.doctype.employee.test_employee import make_employee @@ -10,7 +10,7 @@ from hrms.hr.doctype.goal.goal import get_children, update_status -class TestGoal(FrappeTestCase): +class TestGoal(IntegrationTestCase): def setUp(self): frappe.db.delete("Goal") create_kras(["Development", "Quality"]) diff --git a/hrms/hr/doctype/grievance_type/test_grievance_type.py b/hrms/hr/doctype/grievance_type/test_grievance_type.py index 7d6b387d49..aed0bff6f0 100644 --- a/hrms/hr/doctype/grievance_type/test_grievance_type.py +++ b/hrms/hr/doctype/grievance_type/test_grievance_type.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestGrievanceType(FrappeTestCase): +class TestGrievanceType(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/hr_settings/test_hr_settings.py b/hrms/hr/doctype/hr_settings/test_hr_settings.py index 218aec7f89..43e5079e44 100644 --- a/hrms/hr/doctype/hr_settings/test_hr_settings.py +++ b/hrms/hr/doctype/hr_settings/test_hr_settings.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestHRSettings(FrappeTestCase): +class TestHRSettings(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/identification_document_type/test_identification_document_type.py b/hrms/hr/doctype/identification_document_type/test_identification_document_type.py index 7abd9431e2..32fa0a7445 100644 --- a/hrms/hr/doctype/identification_document_type/test_identification_document_type.py +++ b/hrms/hr/doctype/identification_document_type/test_identification_document_type.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestIdentificationDocumentType(FrappeTestCase): +class TestIdentificationDocumentType(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/interest/test_interest.py b/hrms/hr/doctype/interest/test_interest.py index ce6b70d3c0..466b9cb5f8 100644 --- a/hrms/hr/doctype/interest/test_interest.py +++ b/hrms/hr/doctype/interest/test_interest.py @@ -1,10 +1,10 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase # test_records = frappe.get_test_records('Interest') -class TestInterest(FrappeTestCase): +class TestInterest(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/interview/test_interview.py b/hrms/hr/doctype/interview/test_interview.py index 3af55ac026..6db0faf23f 100644 --- a/hrms/hr/doctype/interview/test_interview.py +++ b/hrms/hr/doctype/interview/test_interview.py @@ -7,7 +7,7 @@ import frappe from frappe import _ from frappe.core.doctype.user_permission.test_user_permission import create_user -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, get_datetime, get_time, getdate, nowtime from erpnext.setup.doctype.designation.test_designation import create_designation @@ -23,7 +23,7 @@ from hrms.tests.test_utils import create_job_applicant, get_email_by_subject -class TestInterview(FrappeTestCase): +class TestInterview(IntegrationTestCase): def test_validations_for_designation(self): job_applicant = create_job_applicant() interview = create_interview_and_dependencies( diff --git a/hrms/hr/doctype/interview_feedback/test_interview_feedback.py b/hrms/hr/doctype/interview_feedback/test_interview_feedback.py index e9b9222669..ad9f7f3198 100644 --- a/hrms/hr/doctype/interview_feedback/test_interview_feedback.py +++ b/hrms/hr/doctype/interview_feedback/test_interview_feedback.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, flt, getdate from hrms.hr.doctype.interview.test_interview import ( @@ -12,7 +12,7 @@ from hrms.tests.test_utils import create_job_applicant -class TestInterviewFeedback(FrappeTestCase): +class TestInterviewFeedback(IntegrationTestCase): def test_validation_for_skill_set(self): frappe.set_user("Administrator") job_applicant = create_job_applicant() diff --git a/hrms/hr/doctype/interview_round/test_interview_round.py b/hrms/hr/doctype/interview_round/test_interview_round.py index 47ed4b3f6e..9339b17c89 100644 --- a/hrms/hr/doctype/interview_round/test_interview_round.py +++ b/hrms/hr/doctype/interview_round/test_interview_round.py @@ -1,10 +1,10 @@ # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase # import frappe -class TestInterviewRound(FrappeTestCase): +class TestInterviewRound(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/interview_type/test_interview_type.py b/hrms/hr/doctype/interview_type/test_interview_type.py index 1474046a0c..6cf77444a0 100644 --- a/hrms/hr/doctype/interview_type/test_interview_type.py +++ b/hrms/hr/doctype/interview_type/test_interview_type.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestInterviewType(FrappeTestCase): +class TestInterviewType(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/job_applicant/test_job_applicant.py b/hrms/hr/doctype/job_applicant/test_job_applicant.py index a1869dd5c9..750a2070d7 100644 --- a/hrms/hr/doctype/job_applicant/test_job_applicant.py +++ b/hrms/hr/doctype/job_applicant/test_job_applicant.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import nowdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -11,7 +11,7 @@ from hrms.tests.test_utils import create_job_applicant -class TestJobApplicant(FrappeTestCase): +class TestJobApplicant(IntegrationTestCase): def test_job_applicant_naming(self): applicant = frappe.get_doc( { diff --git a/hrms/hr/doctype/job_applicant_source/test_job_applicant_source.py b/hrms/hr/doctype/job_applicant_source/test_job_applicant_source.py index 96b80fd5d7..32d2e5f090 100644 --- a/hrms/hr/doctype/job_applicant_source/test_job_applicant_source.py +++ b/hrms/hr/doctype/job_applicant_source/test_job_applicant_source.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestJobApplicantSource(FrappeTestCase): +class TestJobApplicantSource(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/job_offer/test_job_offer.py b/hrms/hr/doctype/job_offer/test_job_offer.py index 7e88fb6308..4d1f3c82e8 100644 --- a/hrms/hr/doctype/job_offer/test_job_offer.py +++ b/hrms/hr/doctype/job_offer/test_job_offer.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, nowdate from erpnext.setup.doctype.designation.test_designation import create_designation @@ -13,7 +13,7 @@ from hrms.tests.test_utils import create_job_applicant -class TestJobOffer(FrappeTestCase): +class TestJobOffer(IntegrationTestCase): def setUp(self): frappe.db.delete("Job Applicant") frappe.db.delete("Job Offer") diff --git a/hrms/hr/doctype/job_offer_term_template/test_job_offer_term_template.py b/hrms/hr/doctype/job_offer_term_template/test_job_offer_term_template.py index 0da68ec2a8..6d2e6b14a4 100644 --- a/hrms/hr/doctype/job_offer_term_template/test_job_offer_term_template.py +++ b/hrms/hr/doctype/job_offer_term_template/test_job_offer_term_template.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestJobOfferTermTemplate(FrappeTestCase): +class TestJobOfferTermTemplate(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/job_opening/test_job_opening.py b/hrms/hr/doctype/job_opening/test_job_opening.py index fb4c0aed77..71dafde2aa 100644 --- a/hrms/hr/doctype/job_opening/test_job_opening.py +++ b/hrms/hr/doctype/job_opening/test_job_opening.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -11,7 +11,7 @@ from hrms.hr.doctype.staffing_plan.test_staffing_plan import make_company -class TestJobOpening(FrappeTestCase): +class TestJobOpening(IntegrationTestCase): def setUp(self): frappe.db.delete("Staffing Plan") frappe.db.delete("Staffing Plan Detail") diff --git a/hrms/hr/doctype/job_requisition/test_job_requisition.py b/hrms/hr/doctype/job_requisition/test_job_requisition.py index 808ea51ffc..1f417678e7 100644 --- a/hrms/hr/doctype/job_requisition/test_job_requisition.py +++ b/hrms/hr/doctype/job_requisition/test_job_requisition.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from erpnext.setup.doctype.designation.test_designation import create_designation from erpnext.setup.doctype.employee.test_employee import make_employee @@ -11,7 +11,7 @@ from hrms.hr.doctype.job_requisition.job_requisition import make_job_opening -class TestJobRequisition(FrappeTestCase): +class TestJobRequisition(IntegrationTestCase): def setUp(self): self.employee = make_employee("test_employee_1@company.com", company="_Test Company") diff --git a/hrms/hr/doctype/kra/test_kra.py b/hrms/hr/doctype/kra/test_kra.py index 3f05a6a3c6..93b8a07ad8 100644 --- a/hrms/hr/doctype/kra/test_kra.py +++ b/hrms/hr/doctype/kra/test_kra.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestKRA(FrappeTestCase): +class TestKRA(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/leave_allocation/test_earned_leaves.py b/hrms/hr/doctype/leave_allocation/test_earned_leaves.py index 9f17827f81..a6d13e0f92 100644 --- a/hrms/hr/doctype/leave_allocation/test_earned_leaves.py +++ b/hrms/hr/doctype/leave_allocation/test_earned_leaves.py @@ -1,5 +1,5 @@ import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import ( add_days, add_months, @@ -27,7 +27,7 @@ from hrms.tests.test_utils import get_first_sunday -class TestLeaveAllocation(FrappeTestCase): +class TestLeaveAllocation(IntegrationTestCase): def setUp(self): for doctype in [ "Leave Period", diff --git a/hrms/hr/doctype/leave_allocation/test_leave_allocation.py b/hrms/hr/doctype/leave_allocation/test_leave_allocation.py index 1c258df3e0..8836689d62 100644 --- a/hrms/hr/doctype/leave_allocation/test_leave_allocation.py +++ b/hrms/hr/doctype/leave_allocation/test_leave_allocation.py @@ -1,5 +1,5 @@ import frappe -from frappe.tests.utils import FrappeTestCase, change_settings +from frappe.tests import IntegrationTestCase, change_settings from frappe.utils import add_days, add_months, getdate, nowdate import erpnext @@ -13,7 +13,7 @@ from hrms.hr.doctype.leave_type.test_leave_type import create_leave_type -class TestLeaveAllocation(FrappeTestCase): +class TestLeaveAllocation(IntegrationTestCase): def setUp(self): frappe.db.delete("Leave Period") frappe.db.delete("Leave Allocation") diff --git a/hrms/hr/doctype/leave_application/test_leave_application.py b/hrms/hr/doctype/leave_application/test_leave_application.py index 9c0aaa291b..d0d566f5b1 100644 --- a/hrms/hr/doctype/leave_application/test_leave_application.py +++ b/hrms/hr/doctype/leave_application/test_leave_application.py @@ -3,7 +3,7 @@ import frappe from frappe.permissions import clear_user_permissions_for_doctype -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import ( add_days, add_months, @@ -77,7 +77,7 @@ ] -class TestLeaveApplication(FrappeTestCase): +class TestLeaveApplication(IntegrationTestCase): def setUp(self): for dt in [ "Leave Application", diff --git a/hrms/hr/doctype/leave_block_list/test_leave_block_list.py b/hrms/hr/doctype/leave_block_list/test_leave_block_list.py index 72c208edec..61adf1e96b 100644 --- a/hrms/hr/doctype/leave_block_list/test_leave_block_list.py +++ b/hrms/hr/doctype/leave_block_list/test_leave_block_list.py @@ -2,7 +2,7 @@ # License: GNU General Public License v3. See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import getdate from hrms.hr.doctype.leave_block_list.leave_block_list import get_applicable_block_dates @@ -11,7 +11,7 @@ test_records = frappe.get_test_records("Leave Block List") -class TestLeaveBlockList(FrappeTestCase): +class TestLeaveBlockList(IntegrationTestCase): def tearDown(self): frappe.set_user("Administrator") diff --git a/hrms/hr/doctype/leave_control_panel/test_leave_control_panel.py b/hrms/hr/doctype/leave_control_panel/test_leave_control_panel.py index 60113db039..a8fdf49b16 100644 --- a/hrms/hr/doctype/leave_control_panel/test_leave_control_panel.py +++ b/hrms/hr/doctype/leave_control_panel/test_leave_control_panel.py @@ -4,7 +4,7 @@ from datetime import date import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from erpnext.setup.doctype.employee.test_employee import make_employee @@ -15,7 +15,7 @@ from hrms.tests.test_utils import create_company -class TestLeaveControlPanel(FrappeTestCase): +class TestLeaveControlPanel(IntegrationTestCase): @classmethod def setUpClass(self): create_company() diff --git a/hrms/hr/doctype/leave_encashment/test_leave_encashment.py b/hrms/hr/doctype/leave_encashment/test_leave_encashment.py index a315fcf846..dbe3f6f306 100644 --- a/hrms/hr/doctype/leave_encashment/test_leave_encashment.py +++ b/hrms/hr/doctype/leave_encashment/test_leave_encashment.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, get_year_ending, get_year_start, getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -23,7 +23,7 @@ test_records = frappe.get_test_records("Leave Type") -class TestLeaveEncashment(FrappeTestCase): +class TestLeaveEncashment(IntegrationTestCase): def setUp(self): for dt in [ "Leave Period", diff --git a/hrms/hr/doctype/leave_ledger_entry/test_leave_ledger_entry.py b/hrms/hr/doctype/leave_ledger_entry/test_leave_ledger_entry.py index 668b758665..50780d5e74 100644 --- a/hrms/hr/doctype/leave_ledger_entry/test_leave_ledger_entry.py +++ b/hrms/hr/doctype/leave_ledger_entry/test_leave_ledger_entry.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils.data import add_to_date, today from erpnext.setup.doctype.employee.test_employee import make_employee @@ -10,7 +10,7 @@ from hrms.hr.doctype.leave_ledger_entry.leave_ledger_entry import expire_allocation -class TestLeaveLedgerEntry(FrappeTestCase): +class TestLeaveLedgerEntry(IntegrationTestCase): def setUp(self): emp_id = make_employee("test_leave_allocation@salary.com", company="_Test Company") self.employee = frappe.get_doc("Employee", emp_id) diff --git a/hrms/hr/doctype/leave_period/test_leave_period.py b/hrms/hr/doctype/leave_period/test_leave_period.py index 890aad2f8b..8b9204e022 100644 --- a/hrms/hr/doctype/leave_period/test_leave_period.py +++ b/hrms/hr/doctype/leave_period/test_leave_period.py @@ -2,14 +2,14 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase import erpnext test_dependencies = ["Employee", "Leave Type", "Leave Policy"] -class TestLeavePeriod(FrappeTestCase): +class TestLeavePeriod(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/leave_policy/test_leave_policy.py b/hrms/hr/doctype/leave_policy/test_leave_policy.py index debef62efd..6aca3595c3 100644 --- a/hrms/hr/doctype/leave_policy/test_leave_policy.py +++ b/hrms/hr/doctype/leave_policy/test_leave_policy.py @@ -2,10 +2,10 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestLeavePolicy(FrappeTestCase): +class TestLeavePolicy(IntegrationTestCase): def test_max_leave_allowed(self): random_leave_type = frappe.get_all("Leave Type", fields=["name", "max_leaves_allowed"]) if random_leave_type: diff --git a/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py b/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py index ecece69b48..7fd0cf62db 100644 --- a/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py +++ b/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_months, get_first_day, get_year_ending, getdate from hrms.hr.doctype.leave_application.test_leave_application import get_employee, get_leave_period @@ -14,7 +14,7 @@ test_dependencies = ["Employee"] -class TestLeavePolicyAssignment(FrappeTestCase): +class TestLeavePolicyAssignment(IntegrationTestCase): def setUp(self): for doctype in [ "Leave Period", diff --git a/hrms/hr/doctype/leave_policy_detail/test_leave_policy_detail.py b/hrms/hr/doctype/leave_policy_detail/test_leave_policy_detail.py index b8915ac59e..bafa42eef5 100644 --- a/hrms/hr/doctype/leave_policy_detail/test_leave_policy_detail.py +++ b/hrms/hr/doctype/leave_policy_detail/test_leave_policy_detail.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestLeavePolicyDetail(FrappeTestCase): +class TestLeavePolicyDetail(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/offer_term/test_offer_term.py b/hrms/hr/doctype/offer_term/test_offer_term.py index 37e0436bce..9be24f5109 100644 --- a/hrms/hr/doctype/offer_term/test_offer_term.py +++ b/hrms/hr/doctype/offer_term/test_offer_term.py @@ -1,10 +1,10 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase # test_records = frappe.get_test_records('Offer Term') -class TestOfferTerm(FrappeTestCase): +class TestOfferTerm(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/purpose_of_travel/test_purpose_of_travel.py b/hrms/hr/doctype/purpose_of_travel/test_purpose_of_travel.py index 46b78f9fbe..914054a7f9 100644 --- a/hrms/hr/doctype/purpose_of_travel/test_purpose_of_travel.py +++ b/hrms/hr/doctype/purpose_of_travel/test_purpose_of_travel.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestPurposeofTravel(FrappeTestCase): +class TestPurposeofTravel(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/pwa_notification/test_pwa_notification.py b/hrms/hr/doctype/pwa_notification/test_pwa_notification.py index 21d3c3b17b..5c8bd1fde2 100644 --- a/hrms/hr/doctype/pwa_notification/test_pwa_notification.py +++ b/hrms/hr/doctype/pwa_notification/test_pwa_notification.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestPWANotification(FrappeTestCase): +class TestPWANotification(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/shift_assignment/test_shift_assignment.py b/hrms/hr/doctype/shift_assignment/test_shift_assignment.py index 47175147b2..a41d1fa5f2 100644 --- a/hrms/hr/doctype/shift_assignment/test_shift_assignment.py +++ b/hrms/hr/doctype/shift_assignment/test_shift_assignment.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, get_datetime, getdate, nowdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -18,7 +18,7 @@ test_dependencies = ["Shift Type"] -class TestShiftAssignment(FrappeTestCase): +class TestShiftAssignment(IntegrationTestCase): def setUp(self): frappe.db.delete("Shift Assignment") frappe.db.delete("Shift Type") diff --git a/hrms/hr/doctype/shift_assignment_schedule/test_shift_assignment_schedule.py b/hrms/hr/doctype/shift_assignment_schedule/test_shift_assignment_schedule.py index 54c9c1e112..69a5782c29 100644 --- a/hrms/hr/doctype/shift_assignment_schedule/test_shift_assignment_schedule.py +++ b/hrms/hr/doctype/shift_assignment_schedule/test_shift_assignment_schedule.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestShiftAssignmentSchedule(FrappeTestCase): +class TestShiftAssignmentSchedule(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.py b/hrms/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.py index 1f064c6e4a..c4c236f5b2 100644 --- a/hrms/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.py +++ b/hrms/hr/doctype/shift_assignment_tool/test_shift_assignment_tool.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -13,7 +13,7 @@ from hrms.tests.test_utils import create_company -class TestShiftAssignmentTool(FrappeTestCase): +class TestShiftAssignmentTool(IntegrationTestCase): def setUp(self): create_company() create_company("_Test Company2") diff --git a/hrms/hr/doctype/shift_location/test_shift_location.py b/hrms/hr/doctype/shift_location/test_shift_location.py index fb102fc198..bd6ecb76b7 100644 --- a/hrms/hr/doctype/shift_location/test_shift_location.py +++ b/hrms/hr/doctype/shift_location/test_shift_location.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestShiftLocation(FrappeTestCase): +class TestShiftLocation(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/shift_request/test_shift_request.py b/hrms/hr/doctype/shift_request/test_shift_request.py index b5dd3e1ce4..9fc8e02afa 100644 --- a/hrms/hr/doctype/shift_request/test_shift_request.py +++ b/hrms/hr/doctype/shift_request/test_shift_request.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase, change_settings +from frappe.tests import IntegrationTestCase, change_settings from frappe.utils import add_days, nowdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -13,7 +13,7 @@ test_dependencies = ["Shift Type"] -class TestShiftRequest(FrappeTestCase): +class TestShiftRequest(IntegrationTestCase): def setUp(self): for doctype in ["Shift Request", "Shift Assignment", "Shift Type"]: frappe.db.delete(doctype) diff --git a/hrms/hr/doctype/shift_type/test_shift_type.py b/hrms/hr/doctype/shift_type/test_shift_type.py index 997856a52d..744bce3c8f 100644 --- a/hrms/hr/doctype/shift_type/test_shift_type.py +++ b/hrms/hr/doctype/shift_type/test_shift_type.py @@ -3,7 +3,7 @@ from datetime import datetime, timedelta import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, get_time, get_year_ending, get_year_start, getdate, now_datetime from erpnext.setup.doctype.employee.test_employee import make_employee @@ -14,7 +14,7 @@ from hrms.tests.test_utils import add_date_to_holiday_list -class TestShiftType(FrappeTestCase): +class TestShiftType(IntegrationTestCase): def setUp(self): frappe.db.delete("Shift Type") frappe.db.delete("Shift Assignment") diff --git a/hrms/hr/doctype/staffing_plan/test_staffing_plan.py b/hrms/hr/doctype/staffing_plan/test_staffing_plan.py index 966163f198..6d45e4ddc1 100644 --- a/hrms/hr/doctype/staffing_plan/test_staffing_plan.py +++ b/hrms/hr/doctype/staffing_plan/test_staffing_plan.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, nowdate from hrms.hr.doctype.staffing_plan.staffing_plan import ParentCompanyError, SubsidiaryCompanyError @@ -10,7 +10,7 @@ test_dependencies = ["Designation"] -class TestStaffingPlan(FrappeTestCase): +class TestStaffingPlan(IntegrationTestCase): def test_staffing_plan(self): _set_up() frappe.db.set_value("Company", "_Test Company 3", "is_group", 1) diff --git a/hrms/hr/doctype/training_event/test_training_event.py b/hrms/hr/doctype/training_event/test_training_event.py index ef738859c3..e89601fef7 100644 --- a/hrms/hr/doctype/training_event/test_training_event.py +++ b/hrms/hr/doctype/training_event/test_training_event.py @@ -2,13 +2,13 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, today from hrms.payroll.doctype.salary_structure.test_salary_structure import make_employee -class TestTrainingEvent(FrappeTestCase): +class TestTrainingEvent(IntegrationTestCase): def setUp(self): create_training_program("Basic Training") employee = make_employee("robert_loan@trainig.com") diff --git a/hrms/hr/doctype/training_feedback/test_training_feedback.py b/hrms/hr/doctype/training_feedback/test_training_feedback.py index 6cc77d2bbc..ea2eca4de4 100644 --- a/hrms/hr/doctype/training_feedback/test_training_feedback.py +++ b/hrms/hr/doctype/training_feedback/test_training_feedback.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from hrms.hr.doctype.training_event.test_training_event import ( create_training_event, @@ -11,7 +11,7 @@ from hrms.payroll.doctype.salary_structure.test_salary_structure import make_employee -class TestTrainingFeedback(FrappeTestCase): +class TestTrainingFeedback(IntegrationTestCase): def setUp(self): create_training_program("Basic Training") self.employee = make_employee("robert_loan@trainig.com") diff --git a/hrms/hr/doctype/training_program/test_training_program.py b/hrms/hr/doctype/training_program/test_training_program.py index fd42afac06..472322dc1b 100644 --- a/hrms/hr/doctype/training_program/test_training_program.py +++ b/hrms/hr/doctype/training_program/test_training_program.py @@ -1,8 +1,8 @@ # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestTrainingProgram(FrappeTestCase): +class TestTrainingProgram(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/training_result/test_training_result.py b/hrms/hr/doctype/training_result/test_training_result.py index 1317871e2e..1fdde26bf8 100644 --- a/hrms/hr/doctype/training_result/test_training_result.py +++ b/hrms/hr/doctype/training_result/test_training_result.py @@ -1,10 +1,10 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase # test_records = frappe.get_test_records('Training Result') -class TestTrainingResult(FrappeTestCase): +class TestTrainingResult(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/travel_request/test_travel_request.py b/hrms/hr/doctype/travel_request/test_travel_request.py index 8ceacf56ec..86f798fe64 100644 --- a/hrms/hr/doctype/travel_request/test_travel_request.py +++ b/hrms/hr/doctype/travel_request/test_travel_request.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestTravelRequest(FrappeTestCase): +class TestTravelRequest(IntegrationTestCase): pass diff --git a/hrms/hr/doctype/upload_attendance/test_upload_attendance.py b/hrms/hr/doctype/upload_attendance/test_upload_attendance.py index 83aa8062e7..18394d4e2b 100644 --- a/hrms/hr/doctype/upload_attendance/test_upload_attendance.py +++ b/hrms/hr/doctype/upload_attendance/test_upload_attendance.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import getdate import erpnext @@ -13,7 +13,7 @@ test_dependencies = ["Holiday List"] -class TestUploadAttendance(FrappeTestCase): +class TestUploadAttendance(IntegrationTestCase): @classmethod def setUpClass(cls): super().setUpClass() diff --git a/hrms/hr/doctype/vehicle_log/test_vehicle_log.py b/hrms/hr/doctype/vehicle_log/test_vehicle_log.py index 9ac8c346e3..9551f24c0e 100644 --- a/hrms/hr/doctype/vehicle_log/test_vehicle_log.py +++ b/hrms/hr/doctype/vehicle_log/test_vehicle_log.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import cstr, flt, nowdate, random_string from erpnext.setup.doctype.employee.test_employee import make_employee @@ -10,7 +10,7 @@ from hrms.hr.doctype.vehicle_log.vehicle_log import make_expense_claim -class TestVehicleLog(FrappeTestCase): +class TestVehicleLog(IntegrationTestCase): def setUp(self): employee_id = frappe.db.sql("""select name from `tabEmployee` where name='testdriver@example.com'""") self.employee_id = employee_id[0][0] if employee_id else None diff --git a/hrms/hr/doctype/vehicle_service_item/test_vehicle_service_item.py b/hrms/hr/doctype/vehicle_service_item/test_vehicle_service_item.py index c6f42ea830..2a7c98ea81 100644 --- a/hrms/hr/doctype/vehicle_service_item/test_vehicle_service_item.py +++ b/hrms/hr/doctype/vehicle_service_item/test_vehicle_service_item.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestVehicleServiceItem(FrappeTestCase): +class TestVehicleServiceItem(IntegrationTestCase): pass diff --git a/hrms/hr/page/organizational_chart/test_organizational_chart.py b/hrms/hr/page/organizational_chart/test_organizational_chart.py index ba77138f25..4440b76def 100644 --- a/hrms/hr/page/organizational_chart/test_organizational_chart.py +++ b/hrms/hr/page/organizational_chart/test_organizational_chart.py @@ -2,7 +2,7 @@ # License: GNU General Public License v3. See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from erpnext.setup.doctype.employee.test_employee import make_employee @@ -10,7 +10,7 @@ from hrms.tests.test_utils import create_company -class TestOrganizationalChart(FrappeTestCase): +class TestOrganizationalChart(IntegrationTestCase): def setUp(self): self.company = create_company("Test Org Chart").name frappe.db.delete("Employee", {"company": self.company}) diff --git a/hrms/hr/report/appraisal_overview/test_appraisal_overview.py b/hrms/hr/report/appraisal_overview/test_appraisal_overview.py index c03c03c9ea..23e49fb321 100644 --- a/hrms/hr/report/appraisal_overview/test_appraisal_overview.py +++ b/hrms/hr/report/appraisal_overview/test_appraisal_overview.py @@ -1,5 +1,5 @@ import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from erpnext.setup.doctype.designation.test_designation import create_designation from erpnext.setup.doctype.employee.test_employee import make_employee @@ -13,7 +13,7 @@ from hrms.tests.test_utils import create_company -class TestAppraisalOverview(FrappeTestCase): +class TestAppraisalOverview(IntegrationTestCase): def setUp(self): frappe.db.delete("Goal") frappe.db.delete("Appraisal") diff --git a/hrms/hr/report/employee_exits/test_employee_exits.py b/hrms/hr/report/employee_exits/test_employee_exits.py index d654ead09d..15872fea80 100644 --- a/hrms/hr/report/employee_exits/test_employee_exits.py +++ b/hrms/hr/report/employee_exits/test_employee_exits.py @@ -1,5 +1,5 @@ import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -12,7 +12,7 @@ from hrms.tests.test_utils import create_company -class TestEmployeeExits(FrappeTestCase): +class TestEmployeeExits(IntegrationTestCase): @classmethod def setUpClass(cls): super().setUpClass() diff --git a/hrms/hr/report/employee_hours_utilization_based_on_timesheet/test_employee_util.py b/hrms/hr/report/employee_hours_utilization_based_on_timesheet/test_employee_util.py index 5a0f2e8a65..885abadf14 100644 --- a/hrms/hr/report/employee_hours_utilization_based_on_timesheet/test_employee_util.py +++ b/hrms/hr/report/employee_hours_utilization_based_on_timesheet/test_employee_util.py @@ -1,5 +1,5 @@ import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils.make_random import get_random from erpnext.projects.doctype.project.test_project import make_project @@ -10,7 +10,7 @@ ) -class TestEmployeeUtilization(FrappeTestCase): +class TestEmployeeUtilization(IntegrationTestCase): @classmethod def setUpClass(cls): super().setUpClass() diff --git a/hrms/hr/report/employee_leave_balance/test_employee_leave_balance.py b/hrms/hr/report/employee_leave_balance/test_employee_leave_balance.py index 548742f308..3a0ff33237 100644 --- a/hrms/hr/report/employee_leave_balance/test_employee_leave_balance.py +++ b/hrms/hr/report/employee_leave_balance/test_employee_leave_balance.py @@ -3,7 +3,7 @@ import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, add_months, flt, get_year_ending, get_year_start, getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -22,7 +22,7 @@ test_records = frappe.get_test_records("Leave Type") -class TestEmployeeLeaveBalance(FrappeTestCase): +class TestEmployeeLeaveBalance(IntegrationTestCase): def setUp(self): for dt in [ "Leave Application", diff --git a/hrms/hr/report/employee_leave_balance_summary/test_employee_leave_balance_summary.py b/hrms/hr/report/employee_leave_balance_summary/test_employee_leave_balance_summary.py index 405d426a94..3259eda192 100644 --- a/hrms/hr/report/employee_leave_balance_summary/test_employee_leave_balance_summary.py +++ b/hrms/hr/report/employee_leave_balance_summary/test_employee_leave_balance_summary.py @@ -3,7 +3,7 @@ import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, flt, get_year_ending, get_year_start, getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -21,7 +21,7 @@ test_records = frappe.get_test_records("Leave Type") -class TestEmployeeLeaveBalance(FrappeTestCase): +class TestEmployeeLeaveBalance(IntegrationTestCase): def setUp(self): for dt in [ "Leave Application", diff --git a/hrms/hr/report/leave_ledger/test_leave_ledger.py b/hrms/hr/report/leave_ledger/test_leave_ledger.py index 160f42699c..4eae16d113 100644 --- a/hrms/hr/report/leave_ledger/test_leave_ledger.py +++ b/hrms/hr/report/leave_ledger/test_leave_ledger.py @@ -1,5 +1,5 @@ import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, add_months, flt, get_year_ending, get_year_start, getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -17,7 +17,7 @@ from hrms.payroll.doctype.salary_slip.test_salary_slip import make_holiday_list -class TestLeaveLedger(FrappeTestCase): +class TestLeaveLedger(IntegrationTestCase): def setUp(self): for dt in [ "Leave Application", diff --git a/hrms/hr/report/monthly_attendance_sheet/test_monthly_attendance_sheet.py b/hrms/hr/report/monthly_attendance_sheet/test_monthly_attendance_sheet.py index ad2066cd6f..30ee225070 100644 --- a/hrms/hr/report/monthly_attendance_sheet/test_monthly_attendance_sheet.py +++ b/hrms/hr/report/monthly_attendance_sheet/test_monthly_attendance_sheet.py @@ -1,7 +1,7 @@ from dateutil.relativedelta import relativedelta import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import get_year_ending, get_year_start, getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -18,7 +18,7 @@ from hrms.tests.test_utils import create_company, get_first_day_for_prev_month -class TestMonthlyAttendanceSheet(FrappeTestCase): +class TestMonthlyAttendanceSheet(IntegrationTestCase): def setUp(self): self.company = "_Test Company" self.employee = make_employee("test_employee@example.com", company=self.company) diff --git a/hrms/hr/report/project_profitability/test_project_profitability.py b/hrms/hr/report/project_profitability/test_project_profitability.py index 7116102484..9b29a4b5d9 100644 --- a/hrms/hr/report/project_profitability/test_project_profitability.py +++ b/hrms/hr/report/project_profitability/test_project_profitability.py @@ -1,5 +1,5 @@ import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, getdate from erpnext.projects.doctype.timesheet.test_timesheet import make_timesheet @@ -13,7 +13,7 @@ test_dependencies = ["Customer"] -class TestProjectProfitability(FrappeTestCase): +class TestProjectProfitability(IntegrationTestCase): def setUp(self): frappe.db.delete("Timesheet") emp = make_employee("test_employee_9@salary.com", company="_Test Company") diff --git a/hrms/hr/report/shift_attendance/test_shift_attendance.py b/hrms/hr/report/shift_attendance/test_shift_attendance.py index 1a9c84c809..7f43aec4f5 100644 --- a/hrms/hr/report/shift_attendance/test_shift_attendance.py +++ b/hrms/hr/report/shift_attendance/test_shift_attendance.py @@ -1,7 +1,7 @@ from datetime import date, datetime, time import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import format_datetime from erpnext.setup.doctype.employee.test_employee import make_employee @@ -11,7 +11,7 @@ from hrms.tests.test_utils import create_company -class TestShiftAttendance(FrappeTestCase): +class TestShiftAttendance(IntegrationTestCase): @classmethod def setUpClass(cls): create_company() diff --git a/hrms/hr/report/vehicle_expenses/test_vehicle_expenses.py b/hrms/hr/report/vehicle_expenses/test_vehicle_expenses.py index 9c4960dbc1..1acfbc5d70 100644 --- a/hrms/hr/report/vehicle_expenses/test_vehicle_expenses.py +++ b/hrms/hr/report/vehicle_expenses/test_vehicle_expenses.py @@ -3,7 +3,7 @@ import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import getdate from erpnext.accounts.utils import get_fiscal_year @@ -14,7 +14,7 @@ from hrms.hr.report.vehicle_expenses.vehicle_expenses import execute -class TestVehicleExpenses(FrappeTestCase): +class TestVehicleExpenses(IntegrationTestCase): @classmethod def setUpClass(self): super().setUpClass() diff --git a/hrms/payroll/doctype/additional_salary/test_additional_salary.py b/hrms/payroll/doctype/additional_salary/test_additional_salary.py index b3251de700..e6d30c5c09 100644 --- a/hrms/payroll/doctype/additional_salary/test_additional_salary.py +++ b/hrms/payroll/doctype/additional_salary/test_additional_salary.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, add_months, nowdate import erpnext @@ -16,7 +16,7 @@ ) -class TestAdditionalSalary(FrappeTestCase): +class TestAdditionalSalary(IntegrationTestCase): def setUp(self): setup_test() diff --git a/hrms/payroll/doctype/bulk_salary_structure_assignment/test_bulk_salary_structure_assignment.py b/hrms/payroll/doctype/bulk_salary_structure_assignment/test_bulk_salary_structure_assignment.py index 25f18aa505..14ad11214c 100644 --- a/hrms/payroll/doctype/bulk_salary_structure_assignment/test_bulk_salary_structure_assignment.py +++ b/hrms/payroll/doctype/bulk_salary_structure_assignment/test_bulk_salary_structure_assignment.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -14,7 +14,7 @@ from hrms.tests.test_utils import create_company, create_department, create_employee_grade -class TestBulkSalaryStructureAssignment(FrappeTestCase): +class TestBulkSalaryStructureAssignment(IntegrationTestCase): def setUp(self): create_company() create_department("Accounts") diff --git a/hrms/payroll/doctype/employee_benefit_application/test_employee_benefit_application.py b/hrms/payroll/doctype/employee_benefit_application/test_employee_benefit_application.py index fc0283cf52..9f865e28bf 100644 --- a/hrms/payroll/doctype/employee_benefit_application/test_employee_benefit_application.py +++ b/hrms/payroll/doctype/employee_benefit_application/test_employee_benefit_application.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_days, date_diff, get_year_ending, get_year_start, getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -24,7 +24,7 @@ from hrms.tests.test_utils import get_first_sunday -class TestEmployeeBenefitApplication(FrappeTestCase): +class TestEmployeeBenefitApplication(IntegrationTestCase): def setUp(self): date = getdate() make_holiday_list(from_date=get_year_start(date), to_date=get_year_ending(date)) diff --git a/hrms/payroll/doctype/employee_benefit_claim/test_employee_benefit_claim.py b/hrms/payroll/doctype/employee_benefit_claim/test_employee_benefit_claim.py index 9505c3f4db..3ac1029f7f 100644 --- a/hrms/payroll/doctype/employee_benefit_claim/test_employee_benefit_claim.py +++ b/hrms/payroll/doctype/employee_benefit_claim/test_employee_benefit_claim.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestEmployeeBenefitClaim(FrappeTestCase): +class TestEmployeeBenefitClaim(IntegrationTestCase): pass diff --git a/hrms/payroll/doctype/employee_incentive/test_employee_incentive.py b/hrms/payroll/doctype/employee_incentive/test_employee_incentive.py index 912aec9949..2b6bed8054 100644 --- a/hrms/payroll/doctype/employee_incentive/test_employee_incentive.py +++ b/hrms/payroll/doctype/employee_incentive/test_employee_incentive.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestEmployeeIncentive(FrappeTestCase): +class TestEmployeeIncentive(IntegrationTestCase): pass diff --git a/hrms/payroll/doctype/employee_other_income/test_employee_other_income.py b/hrms/payroll/doctype/employee_other_income/test_employee_other_income.py index 3432d4b60f..0598d9087d 100644 --- a/hrms/payroll/doctype/employee_other_income/test_employee_other_income.py +++ b/hrms/payroll/doctype/employee_other_income/test_employee_other_income.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestEmployeeOtherIncome(FrappeTestCase): +class TestEmployeeOtherIncome(IntegrationTestCase): pass diff --git a/hrms/payroll/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.py b/hrms/payroll/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.py index 5846639f80..5c47b07868 100644 --- a/hrms/payroll/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.py +++ b/hrms/payroll/doctype/employee_tax_exemption_category/test_employee_tax_exemption_category.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestEmployeeTaxExemptionCategory(FrappeTestCase): +class TestEmployeeTaxExemptionCategory(IntegrationTestCase): pass diff --git a/hrms/payroll/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py b/hrms/payroll/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py index ac6175ae4d..78799f2b36 100644 --- a/hrms/payroll/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py +++ b/hrms/payroll/doctype/employee_tax_exemption_declaration/test_employee_tax_exemption_declaration.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_months, getdate import erpnext @@ -15,7 +15,7 @@ PAYROLL_PERIOD_END = "2022-12-31" -class TestEmployeeTaxExemptionDeclaration(FrappeTestCase): +class TestEmployeeTaxExemptionDeclaration(IntegrationTestCase): def setUp(self): frappe.db.delete("Employee Tax Exemption Declaration") frappe.db.delete("Salary Structure Assignment") diff --git a/hrms/payroll/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py b/hrms/payroll/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py index cfb02223f7..6a8a575915 100644 --- a/hrms/payroll/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py +++ b/hrms/payroll/doctype/employee_tax_exemption_proof_submission/test_employee_tax_exemption_proof_submission.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from erpnext.setup.doctype.employee.test_employee import make_employee @@ -16,7 +16,7 @@ ) -class TestEmployeeTaxExemptionProofSubmission(FrappeTestCase): +class TestEmployeeTaxExemptionProofSubmission(IntegrationTestCase): def setUp(self): frappe.db.delete("Employee Tax Exemption Proof Submission") frappe.db.delete("Salary Structure Assignment") diff --git a/hrms/payroll/doctype/employee_tax_exemption_sub_category/test_employee_tax_exemption_sub_category.py b/hrms/payroll/doctype/employee_tax_exemption_sub_category/test_employee_tax_exemption_sub_category.py index 0de5fdacf6..3500164edc 100644 --- a/hrms/payroll/doctype/employee_tax_exemption_sub_category/test_employee_tax_exemption_sub_category.py +++ b/hrms/payroll/doctype/employee_tax_exemption_sub_category/test_employee_tax_exemption_sub_category.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestEmployeeTaxExemptionSubCategory(FrappeTestCase): +class TestEmployeeTaxExemptionSubCategory(IntegrationTestCase): pass diff --git a/hrms/payroll/doctype/gratuity/test_gratuity.py b/hrms/payroll/doctype/gratuity/test_gratuity.py index ffb8285e3f..f5da015f79 100644 --- a/hrms/payroll/doctype/gratuity/test_gratuity.py +++ b/hrms/payroll/doctype/gratuity/test_gratuity.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase, change_settings +from frappe.tests import IntegrationTestCase, change_settings from frappe.utils import add_days, add_months, floor, flt, get_datetime, get_first_day, getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -22,7 +22,7 @@ test_dependencies = ["Salary Component", "Salary Slip", "Account"] -class TestGratuity(FrappeTestCase): +class TestGratuity(IntegrationTestCase): def setUp(self): for dt in ["Gratuity", "Salary Slip", "Additional Salary"]: frappe.db.delete(dt) diff --git a/hrms/payroll/doctype/gratuity_rule/test_gratuity_rule.py b/hrms/payroll/doctype/gratuity_rule/test_gratuity_rule.py index 34d53f594c..a8f02fac3b 100644 --- a/hrms/payroll/doctype/gratuity_rule/test_gratuity_rule.py +++ b/hrms/payroll/doctype/gratuity_rule/test_gratuity_rule.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestGratuityRule(FrappeTestCase): +class TestGratuityRule(IntegrationTestCase): pass diff --git a/hrms/payroll/doctype/income_tax_slab/test_income_tax_slab.py b/hrms/payroll/doctype/income_tax_slab/test_income_tax_slab.py index b06b70678d..f7c1b35d7a 100644 --- a/hrms/payroll/doctype/income_tax_slab/test_income_tax_slab.py +++ b/hrms/payroll/doctype/income_tax_slab/test_income_tax_slab.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestIncomeTaxSlab(FrappeTestCase): +class TestIncomeTaxSlab(IntegrationTestCase): pass diff --git a/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py b/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py index 6f148d2ce6..5ae2f02e92 100644 --- a/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py +++ b/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py @@ -4,7 +4,7 @@ from dateutil.relativedelta import relativedelta import frappe -from frappe.tests.utils import FrappeTestCase, change_settings +from frappe.tests import IntegrationTestCase, change_settings from frappe.utils import add_days, add_months, cstr import erpnext @@ -42,7 +42,7 @@ test_dependencies = ["Holiday List"] -class TestPayrollEntry(FrappeTestCase): +class TestPayrollEntry(IntegrationTestCase): def setUp(self): for dt in [ "Salary Slip", diff --git a/hrms/payroll/doctype/payroll_period/test_payroll_period.py b/hrms/payroll/doctype/payroll_period/test_payroll_period.py index ac4e6cced3..73717b0d06 100644 --- a/hrms/payroll/doctype/payroll_period/test_payroll_period.py +++ b/hrms/payroll/doctype/payroll_period/test_payroll_period.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestPayrollPeriod(FrappeTestCase): +class TestPayrollPeriod(IntegrationTestCase): pass diff --git a/hrms/payroll/doctype/payroll_settings/test_payroll_settings.py b/hrms/payroll/doctype/payroll_settings/test_payroll_settings.py index bce80e44c7..ef88b991e6 100644 --- a/hrms/payroll/doctype/payroll_settings/test_payroll_settings.py +++ b/hrms/payroll/doctype/payroll_settings/test_payroll_settings.py @@ -2,8 +2,8 @@ # See license.txt # import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestPayrollSettings(FrappeTestCase): +class TestPayrollSettings(IntegrationTestCase): pass diff --git a/hrms/payroll/doctype/retention_bonus/test_retention_bonus.py b/hrms/payroll/doctype/retention_bonus/test_retention_bonus.py index 297ef81cdd..21f5ca849e 100644 --- a/hrms/payroll/doctype/retention_bonus/test_retention_bonus.py +++ b/hrms/payroll/doctype/retention_bonus/test_retention_bonus.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestRetentionBonus(FrappeTestCase): +class TestRetentionBonus(IntegrationTestCase): pass diff --git a/hrms/payroll/doctype/salary_component/test_salary_component.py b/hrms/payroll/doctype/salary_component/test_salary_component.py index 8bc503d70a..2545801290 100644 --- a/hrms/payroll/doctype/salary_component/test_salary_component.py +++ b/hrms/payroll/doctype/salary_component/test_salary_component.py @@ -2,12 +2,12 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from hrms.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure -class TestSalaryComponent(FrappeTestCase): +class TestSalaryComponent(IntegrationTestCase): def test_update_salary_structures(self): salary_component = create_salary_component("Special Allowance") salary_component.condition = "H < 10000" diff --git a/hrms/payroll/doctype/salary_slip/test_salary_slip.py b/hrms/payroll/doctype/salary_slip/test_salary_slip.py index 9a3a8a8fbd..c389553284 100644 --- a/hrms/payroll/doctype/salary_slip/test_salary_slip.py +++ b/hrms/payroll/doctype/salary_slip/test_salary_slip.py @@ -6,7 +6,7 @@ import frappe from frappe.model.document import Document -from frappe.tests.utils import FrappeTestCase, change_settings +from frappe.tests import IntegrationTestCase, change_settings from frappe.utils import ( add_days, add_months, @@ -48,7 +48,7 @@ from hrms.tests.test_utils import get_email_by_subject, get_first_sunday -class TestSalarySlip(FrappeTestCase): +class TestSalarySlip(IntegrationTestCase): def setUp(self): setup_test() frappe.flags.pop("via_payroll_entry", None) @@ -1664,7 +1664,7 @@ def test_variable_tax_component(self): self.assertListEqual(tax_component, ["_Test TDS"]) -class TestSalarySlipSafeEval(FrappeTestCase): +class TestSalarySlipSafeEval(IntegrationTestCase): def test_safe_eval_for_salary_slip(self): TEST_CASES = { "1+1": 2, diff --git a/hrms/payroll/doctype/salary_structure/test_salary_structure.py b/hrms/payroll/doctype/salary_structure/test_salary_structure.py index 5e0861942f..82e04e27ff 100644 --- a/hrms/payroll/doctype/salary_structure/test_salary_structure.py +++ b/hrms/payroll/doctype/salary_structure/test_salary_structure.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import add_years, cstr, date_diff, get_first_day, nowdate from frappe.utils.make_random import get_random @@ -24,7 +24,7 @@ test_dependencies = ["Fiscal Year"] -class TestSalaryStructure(FrappeTestCase): +class TestSalaryStructure(IntegrationTestCase): def setUp(self): for dt in ["Salary Slip", "Salary Structure", "Salary Structure Assignment"]: frappe.db.sql("delete from `tab%s`" % dt) diff --git a/hrms/payroll/doctype/salary_structure_assignment/test_salary_structure_assignment.py b/hrms/payroll/doctype/salary_structure_assignment/test_salary_structure_assignment.py index 6c6f3c5c8a..3061a7c0b9 100644 --- a/hrms/payroll/doctype/salary_structure_assignment/test_salary_structure_assignment.py +++ b/hrms/payroll/doctype/salary_structure_assignment/test_salary_structure_assignment.py @@ -1,8 +1,8 @@ # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors # See license.txt -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase -class TestSalaryStructureAssignment(FrappeTestCase): +class TestSalaryStructureAssignment(IntegrationTestCase): pass diff --git a/hrms/payroll/doctype/salary_withholding/test_salary_withholding.py b/hrms/payroll/doctype/salary_withholding/test_salary_withholding.py index 5d4ad486cb..d79a084611 100644 --- a/hrms/payroll/doctype/salary_withholding/test_salary_withholding.py +++ b/hrms/payroll/doctype/salary_withholding/test_salary_withholding.py @@ -2,7 +2,7 @@ # See license.txt import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import get_first_day, get_year_start, getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -12,7 +12,7 @@ from hrms.payroll.doctype.salary_structure.test_salary_structure import make_salary_structure -class TestSalaryWithholding(FrappeTestCase): +class TestSalaryWithholding(IntegrationTestCase): def setUp(self): for dt in [ "Salary Withholding", diff --git a/hrms/payroll/report/income_tax_computation/test_income_tax_computation.py b/hrms/payroll/report/income_tax_computation/test_income_tax_computation.py index da1cd764b3..24614e9712 100644 --- a/hrms/payroll/report/income_tax_computation/test_income_tax_computation.py +++ b/hrms/payroll/report/income_tax_computation/test_income_tax_computation.py @@ -1,5 +1,5 @@ import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -16,7 +16,7 @@ from hrms.payroll.report.income_tax_computation.income_tax_computation import execute -class TestIncomeTaxComputation(FrappeTestCase): +class TestIncomeTaxComputation(IntegrationTestCase): def setUp(self): self.cleanup_records() self.create_records() diff --git a/hrms/payroll/report/income_tax_deductions/test_income_tax_deductions.py b/hrms/payroll/report/income_tax_deductions/test_income_tax_deductions.py index d1cb70a89c..e9be0d4a74 100644 --- a/hrms/payroll/report/income_tax_deductions/test_income_tax_deductions.py +++ b/hrms/payroll/report/income_tax_deductions/test_income_tax_deductions.py @@ -1,5 +1,5 @@ import frappe -from frappe.tests.utils import FrappeTestCase +from frappe.tests import IntegrationTestCase from frappe.utils import getdate from erpnext.setup.doctype.employee.test_employee import make_employee @@ -14,7 +14,7 @@ from hrms.payroll.report.income_tax_deductions.income_tax_deductions import execute -class TestIncomeTaxDeductions(FrappeTestCase): +class TestIncomeTaxDeductions(IntegrationTestCase): @classmethod def setUpClass(cls): super().setUpClass() From 2e0f20ca6becd019145a3646eaa36ddff9399862 Mon Sep 17 00:00:00 2001 From: krantheman Date: Mon, 14 Oct 2024 14:16:31 +0530 Subject: [PATCH 18/25] refactor: show only holidays from employee's holidays --- .../employees_working_on_a_holiday.js | 14 ++++ .../employees_working_on_a_holiday.py | 74 +++++++++---------- 2 files changed, 47 insertions(+), 41 deletions(-) diff --git a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.js b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.js index 4ce5ba4bc5..6f1137c713 100644 --- a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.js +++ b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.js @@ -23,5 +23,19 @@ frappe.query_reports["Employees working on a holiday"] = { fieldtype: "Link", options: "Holiday List", }, + { + fieldname: "department", + label: __("Department"), + fieldtype: "Link", + options: "Department", + }, + { + fieldname: "company", + label: __("Company"), + fieldtype: "Link", + options: "Company", + reqd: 1, + default: frappe.defaults.get_user_default("Company"), + }, ], }; diff --git a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py index b2625157c4..b37b90557c 100644 --- a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py +++ b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py @@ -5,13 +5,15 @@ import frappe from frappe import _ +from erpnext.setup.doctype.employee.employee import get_holiday_list_for_employee + def execute(filters=None): if not filters: filters = {} columns = get_columns() - data = get_employees(filters) + data = get_data(filters) return columns, data @@ -47,51 +49,41 @@ def get_columns(): ] -def get_employees(filters): - holiday_filter = [ - ["holiday_date", ">=", filters.from_date], - ["holiday_date", "<=", filters.to_date], - ] - if filters.holiday_list: - holiday_filter.append(["parent", "=", filters.holiday_list]) +def get_data(filters): + Attendance = frappe.qb.DocType("Attendance") + Holiday = frappe.qb.DocType("Holiday") - holidays = frappe.get_all("Holiday", fields=["holiday_date", "description"], filters=holiday_filter) + data = [] - holiday_names = {} - holidays_list = [] + employee_filters = {"company": filters.company} + if filters.department: + employee_filters["department"] = filters.department - for holiday in holidays: - holidays_list.append(holiday.holiday_date) - holiday_names[holiday.holiday_date] = holiday.description + for employee in frappe.get_list("Employee", filters=employee_filters, pluck="name"): + holiday_list = get_holiday_list_for_employee(employee, raise_exception=False) + if not holiday_list or (filters.holiday_list and filters.holiday_list != holiday_list): + continue - if holidays_list: - attendance_doctype = frappe.qb.DocType("Attendance") - employee_list = ( - frappe.qb.from_(attendance_doctype) + working_days = ( + frappe.qb.from_(Attendance) + .inner_join(Holiday) + .on(Attendance.attendance_date == Holiday.holiday_date) .select( - attendance_doctype.employee, - attendance_doctype.employee_name, - attendance_doctype.attendance_date, - attendance_doctype.status, + Attendance.employee, + Attendance.employee_name, + Attendance.attendance_date, + Attendance.status, + Holiday.description, ) - .where(attendance_doctype.attendance_date.isin(holidays_list)) - .where(attendance_doctype.status.notin(["Absent", "On Leave"])) - ) - - if filters.holiday_list: - employee = frappe.qb.DocType("Employee") - employee_based_on_holiday = ( - frappe.qb.from_(employee) - .select(employee.employee) - .where(employee.holiday_list == filters.holiday_list) + .where( + (Attendance.employee == employee) + & (Attendance.attendance_date[filters.from_date : filters.to_date]) + & (Attendance.status.notin(["Absent", "On Leave"])) + & (Attendance.docstatus == 1) + & (Holiday.parent == holiday_list) ) - employee_list.where(attendance_doctype.employee.isin(employee_based_on_holiday)) - - employee_list = employee_list.run(as_list=True) - - for employee_data in employee_list: - employee_data.append(holiday_names[employee_data[2]]) + .run(as_list=True) + ) + data.extend(working_days) - return employee_list - else: - return [] + return data From 68924492368afb0bf8ffb3205176eb6a3f75e012 Mon Sep 17 00:00:00 2001 From: krantheman Date: Mon, 14 Oct 2024 15:16:11 +0530 Subject: [PATCH 19/25] refactor: column widths --- .../employees_working_on_a_holiday.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py index b37b90557c..3fa87892cb 100644 --- a/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py +++ b/hrms/hr/report/employees_working_on_a_holiday/employees_working_on_a_holiday.py @@ -24,22 +24,23 @@ def get_columns(): "fieldtype": "Link", "fieldname": "employee", "options": "Employee", - "width": 120, + "width": 300, }, { - "label": _("Name"), + "label": _("Employee Name"), "fieldtype": "Data", - "width": 200, + "width": 0, + "hidden": 1, }, { "label": _("Date"), "fieldtype": "Date", - "width": 100, + "width": 120, }, { "label": _("Status"), "fieldtype": "Data", - "width": 70, + "width": 100, }, { "label": _("Holiday"), From f31d431da3ce6ab04db54ae677e482c0b63bb75f Mon Sep 17 00:00:00 2001 From: krantheman Date: Mon, 14 Oct 2024 16:20:28 +0530 Subject: [PATCH 20/25] perf: improve get_holidays function --- hrms/api/roster.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/hrms/api/roster.py b/hrms/api/roster.py index acf740ca9a..3ea5912ffb 100644 --- a/hrms/api/roster.py +++ b/hrms/api/roster.py @@ -161,14 +161,18 @@ def insert_shift( def get_holidays(month_start: str, month_end: str, employee_filters: dict[str, str]) -> dict[str, list[dict]]: holidays = {} + holiday_lists = {} for employee in frappe.get_list("Employee", filters=employee_filters, pluck="name"): - if holiday_list := get_holiday_list_for_employee(employee, raise_exception=False): - holidays[employee] = frappe.get_all( + if not (holiday_list := get_holiday_list_for_employee(employee, raise_exception=False)): + continue + if holiday_list not in holiday_lists: + holiday_lists[holiday_list] = frappe.get_all( "Holiday", filters={"parent": holiday_list, "holiday_date": ["between", [month_start, month_end]]}, fields=["name as holiday", "holiday_date", "description", "weekly_off"], ) + holidays[employee] = holiday_lists[holiday_list].copy() return holidays From 44ffdb0c91294c60d170d36d5bafac568c6828f7 Mon Sep 17 00:00:00 2001 From: Nihantra Patel Date: Tue, 15 Oct 2024 12:01:02 +0530 Subject: [PATCH 21/25] fix: payroll bank entry with the Loan Repayment amount --- .../doctype/payroll_entry/payroll_entry.py | 3 ++ .../payroll_entry/test_payroll_entry.py | 34 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/hrms/payroll/doctype/payroll_entry/payroll_entry.py b/hrms/payroll/doctype/payroll_entry/payroll_entry.py index ad08acb272..208bf33d30 100644 --- a/hrms/payroll/doctype/payroll_entry/payroll_entry.py +++ b/hrms/payroll/doctype/payroll_entry/payroll_entry.py @@ -923,6 +923,8 @@ def make_bank_entry(self, for_withheld_salaries=False): salary_slip_total -= salary_detail.amount + salary_slip_total -= flt(salary_detail.get("total_loan_repayment")) + bank_entry = None if salary_slip_total > 0: remark = "withheld salaries" if for_withheld_salaries else "salaries" @@ -946,6 +948,7 @@ def get_salary_slip_details(self, for_withheld_salaries=False): SalarySlip.employee, SalarySlip.salary_structure, SalarySlip.salary_withholding_cycle, + SalarySlip.total_loan_repayment, SalaryDetail.salary_component, SalaryDetail.amount, SalaryDetail.parentfield, diff --git a/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py b/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py index 6f148d2ce6..d5fb01b64b 100644 --- a/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py +++ b/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py @@ -717,6 +717,40 @@ def test_validate_attendance(self): employees = payroll_entry.get_employees_with_unmarked_attendance() self.assertFalse(employees) + @if_lending_app_installed + @change_settings("Payroll Settings", {"process_payroll_accounting_entry_based_on_employee": 0}) + def test_loan_repayment_from_salary(self): + from lending.loan_management.doctype.loan.test_loan import make_loan_disbursement_entry + from lending.loan_management.doctype.process_loan_interest_accrual.process_loan_interest_accrual import ( + process_loan_interest_accrual_for_term_loans, + ) + + frappe.db.delete("Loan") + applicant, branch, currency, payroll_payable_account = setup_lending() + + loan = create_loan_for_employee(applicant) + loan_doc = frappe.get_doc("Loan", loan.name) + loan_doc.repay_from_salary = 1 + loan_doc.save() + + make_loan_disbursement_entry(loan.name, loan.loan_amount, disbursement_date=add_months(nowdate(), -1)) + process_loan_interest_accrual_for_term_loans(posting_date=nowdate()) + + dates = get_start_end_dates("Monthly", nowdate()) + payroll_entry = make_payroll_entry( + company="_Test Company", + start_date=dates.start_date, + payable_account=payroll_payable_account, + currency=currency, + end_date=dates.end_date, + branch=branch, + cost_center="Main - _TC", + payment_account="Cash - _TC", + total_loan_repayment=loan.monthly_repayment_amount + ) + + bank_entry = payroll_entry.make_bank_entry() + submit_bank_entry(payroll_entry.name) def get_payroll_entry(**args): args = frappe._dict(args) From 2be71267f34ef26d9da5cb818ca28f8b2578179a Mon Sep 17 00:00:00 2001 From: Nihantra Patel Date: Tue, 15 Oct 2024 12:15:52 +0530 Subject: [PATCH 22/25] fix: payroll bank entry with the Loan Repayment amount --- hrms/payroll/doctype/payroll_entry/test_payroll_entry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py b/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py index d5fb01b64b..47306fbcb1 100644 --- a/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py +++ b/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py @@ -746,7 +746,7 @@ def test_loan_repayment_from_salary(self): branch=branch, cost_center="Main - _TC", payment_account="Cash - _TC", - total_loan_repayment=loan.monthly_repayment_amount + total_loan_repayment=loan.monthly_repayment_amount, ) bank_entry = payroll_entry.make_bank_entry() From e275555eb344d37565860c15217f0ece3fadda59 Mon Sep 17 00:00:00 2001 From: Nihantra Patel Date: Tue, 15 Oct 2024 12:17:30 +0530 Subject: [PATCH 23/25] fix: payroll bank entry with the Loan Repayment amount --- hrms/payroll/doctype/payroll_entry/test_payroll_entry.py | 1 + 1 file changed, 1 insertion(+) diff --git a/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py b/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py index 47306fbcb1..0cf3d6294d 100644 --- a/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py +++ b/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py @@ -752,6 +752,7 @@ def test_loan_repayment_from_salary(self): bank_entry = payroll_entry.make_bank_entry() submit_bank_entry(payroll_entry.name) + def get_payroll_entry(**args): args = frappe._dict(args) From 6d5f9985d5407e108a7626cc8119f700dc4d8626 Mon Sep 17 00:00:00 2001 From: Nihantra Patel Date: Tue, 15 Oct 2024 12:21:37 +0530 Subject: [PATCH 24/25] fix: payroll bank entry with the Loan Repayment amount --- hrms/payroll/doctype/payroll_entry/test_payroll_entry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py b/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py index 0cf3d6294d..2a5acdaee0 100644 --- a/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py +++ b/hrms/payroll/doctype/payroll_entry/test_payroll_entry.py @@ -749,7 +749,7 @@ def test_loan_repayment_from_salary(self): total_loan_repayment=loan.monthly_repayment_amount, ) - bank_entry = payroll_entry.make_bank_entry() + payroll_entry.make_bank_entry() submit_bank_entry(payroll_entry.name) From 84ec1855acc867b8ab263379b0665899609e559e Mon Sep 17 00:00:00 2001 From: Akash Tom Date: Tue, 15 Oct 2024 15:26:47 +0530 Subject: [PATCH 25/25] Revert "fix(Leave Policy Assignment): calculation of months passed since from_date" --- .../leave_policy_assignment.py | 31 +++++-------- .../test_leave_policy_assignment.py | 44 ------------------- hrms/hr/doctype/leave_type/test_leave_type.py | 7 ++- 3 files changed, 14 insertions(+), 68 deletions(-) diff --git a/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py b/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py index dc151e4cdb..9fab7276b6 100644 --- a/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py +++ b/hrms/hr/doctype/leave_policy_assignment/leave_policy_assignment.py @@ -182,11 +182,7 @@ def _get_months_passed(current_date, from_date, consider_current_month): months_passed += 1 elif current_date.year > from_date.year: - months_passed = ( - (12 - from_date.month) - + (current_date.year - from_date.year - 1) * 12 - + current_date.month - ) + months_passed = (12 - from_date.month) + current_date.month if consider_current_month: months_passed += 1 @@ -290,7 +286,16 @@ def create_assignment_for_multiple_employees(employees, data): failed = [] for employee in employees: - assignment = create_assignment(employee, data) + assignment = frappe.new_doc("Leave Policy Assignment") + assignment.employee = employee + assignment.assignment_based_on = data.assignment_based_on or None + assignment.leave_policy = data.leave_policy + assignment.effective_from = getdate(data.effective_from) or None + assignment.effective_to = getdate(data.effective_to) or None + assignment.leave_period = data.leave_period or None + assignment.carry_forward = data.carry_forward + assignment.save() + savepoint = "before_assignment_submission" try: frappe.db.savepoint(savepoint) @@ -308,20 +313,6 @@ def create_assignment_for_multiple_employees(employees, data): return docs_name -@frappe.whitelist() -def create_assignment(employee, data): - assignment = frappe.new_doc("Leave Policy Assignment") - assignment.employee = employee - assignment.assignment_based_on = data.assignment_based_on or None - assignment.leave_policy = data.leave_policy - assignment.effective_from = getdate(data.effective_from) or None - assignment.effective_to = getdate(data.effective_to) or None - assignment.leave_period = data.leave_period or None - assignment.carry_forward = data.carry_forward - assignment.save() - return assignment - - def show_assignment_submission_status(failed): frappe.clear_messages() assignment_list = [get_link_to_form("Leave Policy Assignment", entry) for entry in failed] diff --git a/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py b/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py index fee48e23b8..7fd0cf62db 100644 --- a/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py +++ b/hrms/hr/doctype/leave_policy_assignment/test_leave_policy_assignment.py @@ -6,13 +6,10 @@ from frappe.utils import add_months, get_first_day, get_year_ending, getdate from hrms.hr.doctype.leave_application.test_leave_application import get_employee, get_leave_period -from hrms.hr.doctype.leave_period.test_leave_period import create_leave_period from hrms.hr.doctype.leave_policy.test_leave_policy import create_leave_policy from hrms.hr.doctype.leave_policy_assignment.leave_policy_assignment import ( - create_assignment, create_assignment_for_multiple_employees, ) -from hrms.hr.doctype.leave_type.test_leave_type import create_leave_type test_dependencies = ["Employee"] @@ -24,7 +21,6 @@ def setUp(self): "Leave Application", "Leave Allocation", "Leave Policy Assignment", - "Leave Policy", "Leave Ledger Entry", ]: frappe.db.delete(doctype) @@ -121,46 +117,6 @@ def test_pro_rated_leave_allocation(self): # pro-rated leave allocation for 9 months self.assertEqual(allocation, 9) - # tests no of leaves for passed months if assignment is based on Leave Period / Joining Date - def test_get_leaves_for_passed_months(self): - annual_allocation = 10 - leave_type = create_leave_type(leave_type_name="_Test Earned Leave", is_earned_leave=True) - leave_policy = create_leave_policy(leave_type=leave_type, annual_allocation=annual_allocation) - leave_policy.submit() - - data = { - "assignment_based_on": "Joining Date", - "leave_policy": leave_policy.name, - } - - self.employee.date_of_joining = add_months(getdate(), -6) - self.employee.save() - assignment = create_assignment(self.employee.name, frappe._dict(data)) - new_leaves_allocated = assignment.get_leaves_for_passed_months( - annual_allocation, leave_type, self.employee.date_of_joining - ) - self.assertEqual(new_leaves_allocated, 5) - - self.employee.date_of_joining = add_months(getdate(), -36) - self.employee.save() - assignment = create_assignment(self.employee.name, frappe._dict(data)) - new_leaves_allocated = assignment.get_leaves_for_passed_months( - annual_allocation, leave_type, self.employee.date_of_joining - ) - self.assertEqual(new_leaves_allocated, 30) - - leave_period = create_leave_period(add_months(getdate(), -24), getdate()) - data = { - "assignment_based_on": "Leave Period", - "leave_policy": leave_policy.name, - "leave_period": leave_period.name, - } - assignment = create_assignment(self.employee.name, frappe._dict(data)) - new_leaves_allocated = assignment.get_leaves_for_passed_months( - annual_allocation, leave_type, self.employee.date_of_joining - ) - self.assertEqual(new_leaves_allocated, 20) - def test_pro_rated_leave_allocation_for_custom_date_range(self): leave_type = frappe.get_doc( { diff --git a/hrms/hr/doctype/leave_type/test_leave_type.py b/hrms/hr/doctype/leave_type/test_leave_type.py index 643e4fb648..7700013ca1 100644 --- a/hrms/hr/doctype/leave_type/test_leave_type.py +++ b/hrms/hr/doctype/leave_type/test_leave_type.py @@ -8,14 +8,13 @@ def create_leave_type(**args): args = frappe._dict(args) - leave_type_name = args.leave_type_name or "_Test Leave Type" - if frappe.db.exists("Leave Type", leave_type_name): - frappe.delete_doc("Leave Type", leave_type_name, force=True) + if frappe.db.exists("Leave Type", args.leave_type_name): + frappe.delete_doc("Leave Type", args.leave_type_name, force=True) leave_type = frappe.get_doc( { "doctype": "Leave Type", - "leave_type_name": leave_type_name, + "leave_type_name": args.leave_type_name or "_Test Leave Type", "include_holiday": args.include_holidays or 1, "allow_encashment": args.allow_encashment or 0, "is_earned_leave": args.is_earned_leave or 0,