From c305ff911f2db58b40463ad069a8e99fcc1b2cd9 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Tue, 7 Dec 2021 16:22:17 +0530 Subject: [PATCH] test: Employee Exits Report --- .../report/employee_exits/employee_exits.py | 7 +- .../employee_exits/test_employee_exits.py | 221 ++++++++++++++++++ 2 files changed, 225 insertions(+), 3 deletions(-) create mode 100644 erpnext/hr/report/employee_exits/test_employee_exits.py diff --git a/erpnext/hr/report/employee_exits/employee_exits.py b/erpnext/hr/report/employee_exits/employee_exits.py index 56cea4917b..d0e1ef9a32 100644 --- a/erpnext/hr/report/employee_exits/employee_exits.py +++ b/erpnext/hr/report/employee_exits/employee_exits.py @@ -105,8 +105,9 @@ def get_data(filters): employee.department.as_('department'), employee.designation.as_('designation'), employee.reports_to.as_('reports_to'), interview.name.as_('exit_interview'), interview.status.as_('interview_status'), interview.employee_status.as_('employee_status'), - interview.reference_document_name.as_('questionnaire'), fnf.name.as_('full_and_final_statement') - ).distinct() + interview.reference_document_name.as_('questionnaire'), fnf.name.as_('full_and_final_statement')) + .distinct() + .orderby(employee.relieving_date) .where( ((employee.relieving_date.isnotnull()) | (employee.relieving_date != '')) & ((interview.name.isnull()) | ((interview.name.isnotnull()) & (interview.docstatus != 2))) @@ -158,7 +159,7 @@ def get_conditions(filters, query, employee, interview, fnf): query = query.where((interview.reference_document_name == '') | (interview.reference_document_name.isnull())) if filters.get('fnf_pending'): - query = query.where((fnf.name == '') | (interview.name.isnull())) + query = query.where((fnf.name == '') | (fnf.name.isnull())) return query diff --git a/erpnext/hr/report/employee_exits/test_employee_exits.py b/erpnext/hr/report/employee_exits/test_employee_exits.py new file mode 100644 index 0000000000..1c64b46773 --- /dev/null +++ b/erpnext/hr/report/employee_exits/test_employee_exits.py @@ -0,0 +1,221 @@ +import unittest + +import frappe +from frappe.utils import add_days, getdate + +from erpnext.hr.doctype.employee.test_employee import make_employee +from erpnext.hr.doctype.exit_interview.test_exit_interview import create_exit_interview +from erpnext.hr.doctype.full_and_final_statement.test_full_and_final_statement import create_full_and_final_statement +from erpnext.hr.report.employee_exits.employee_exits import execute + + +class TestEmployeeExits(unittest.TestCase): + @classmethod + def setUpClass(cls): + frappe.db.sql("delete from `tabEmployee` where company='Test Company'") + frappe.db.sql("delete from `tabFull and Final Statement` where company='Test Company'") + frappe.db.sql("delete from `tabExit Interview` where company='Test Company'") + + cls.create_records() + + @classmethod + def tearDownClass(cls): + frappe.db.rollback() + + @classmethod + def create_records(cls): + cls.emp1 = make_employee('employeeexit1@example.com', + company='Test Company', + date_of_joining=getdate('01-10-2021'), + relieving_date=add_days(getdate(), 14), + designation='Accountant' + ) + cls.emp2 = make_employee('employeeexit2@example.com', + company='Test Company', + date_of_joining=getdate('01-12-2021'), + relieving_date=add_days(getdate(), 15), + designation='Accountant' + ) + + cls.emp3 = make_employee('employeeexit3@example.com', + company='Test Company', + date_of_joining=getdate('02-12-2021'), + relieving_date=add_days(getdate(), 29), + designation='Engineer' + ) + cls.emp4 = make_employee('employeeexit4@example.com', + company='Test Company', + date_of_joining=getdate('01-12-2021'), + relieving_date=add_days(getdate(), 30), + designation='Engineer' + ) + + # exit interview for 3 employees only + cls.interview1 = create_exit_interview(cls.emp1) + cls.interview2 = create_exit_interview(cls.emp2) + cls.interview3 = create_exit_interview(cls.emp3) + + # create fnf for some records + cls.fnf1 = create_full_and_final_statement(cls.emp1) + cls.fnf2 = create_full_and_final_statement(cls.emp2) + + # link questionnaire for a few records + # setting employee doctype as reference instead of creating a questionnaire + # since this is just for a test + frappe.db.set_value('Exit Interview', cls.interview1.name, { + 'ref_doctype': 'Employee', + 'reference_document_name': cls.emp1 + }) + + frappe.db.set_value('Exit Interview', cls.interview2.name, { + 'ref_doctype': 'Employee', + 'reference_document_name': cls.emp2 + }) + + frappe.db.set_value('Exit Interview', cls.interview3.name, { + 'ref_doctype': 'Employee', + 'reference_document_name': cls.emp3 + }) + + + def test_employee_exits_summary(self): + filters = { + 'company': 'Test Company', + 'from_date': getdate(), + 'to_date': add_days(getdate(), 15), + 'designation': 'Accountant' + } + + report = execute(filters) + + employee1 = frappe.get_doc('Employee', self.emp1) + employee2 = frappe.get_doc('Employee', self.emp2) + expected_data = [{ + 'employee': employee1.name, + 'employee_name': employee1.employee_name, + 'date_of_joining': employee1.date_of_joining, + 'relieving_date': employee1.relieving_date, + 'department': employee1.department, + 'designation': employee1.designation, + 'reports_to': None, + 'exit_interview': self.interview1.name, + 'interview_status': self.interview1.status, + 'employee_status': '', + 'questionnaire': employee1.name, + 'full_and_final_statement': self.fnf1.name + }, + { + 'employee': employee2.name, + 'employee_name': employee2.employee_name, + 'date_of_joining': employee2.date_of_joining, + 'relieving_date': employee2.relieving_date, + 'department': employee2.department, + 'designation': employee2.designation, + 'reports_to': None, + 'exit_interview': self.interview2.name, + 'interview_status': self.interview2.status, + 'employee_status': '', + 'questionnaire': employee2.name, + 'full_and_final_statement': self.fnf2.name + }] + + self.assertEqual(expected_data, report[1]) # rows + + + def test_pending_exit_interviews_summary(self): + filters = { + 'company': 'Test Company', + 'from_date': getdate(), + 'to_date': add_days(getdate(), 30), + 'exit_interview_pending': 1 + } + + report = execute(filters) + + employee4 = frappe.get_doc('Employee', self.emp4) + expected_data = [{ + 'employee': employee4.name, + 'employee_name': employee4.employee_name, + 'date_of_joining': employee4.date_of_joining, + 'relieving_date': employee4.relieving_date, + 'department': employee4.department, + 'designation': employee4.designation, + 'reports_to': None, + 'exit_interview': None, + 'interview_status': None, + 'employee_status': None, + 'questionnaire': None, + 'full_and_final_statement': None + }] + + self.assertEqual(expected_data, report[1]) # rows + + def test_pending_exit_questionnaire_summary(self): + filters = { + 'company': 'Test Company', + 'from_date': getdate(), + 'to_date': add_days(getdate(), 30), + 'questionnaire_pending': 1 + } + + report = execute(filters) + + employee4 = frappe.get_doc('Employee', self.emp4) + expected_data = [{ + 'employee': employee4.name, + 'employee_name': employee4.employee_name, + 'date_of_joining': employee4.date_of_joining, + 'relieving_date': employee4.relieving_date, + 'department': employee4.department, + 'designation': employee4.designation, + 'reports_to': None, + 'exit_interview': None, + 'interview_status': None, + 'employee_status': None, + 'questionnaire': None, + 'full_and_final_statement': None + }] + + self.assertEqual(expected_data, report[1]) # rows + + + def test_pending_fnf_summary(self): + filters = { + 'company': 'Test Company', + 'fnf_pending': 1 + } + + report = execute(filters) + + employee3 = frappe.get_doc('Employee', self.emp3) + employee4 = frappe.get_doc('Employee', self.emp4) + expected_data = [{ + 'employee': employee3.name, + 'employee_name': employee3.employee_name, + 'date_of_joining': employee3.date_of_joining, + 'relieving_date': employee3.relieving_date, + 'department': employee3.department, + 'designation': employee3.designation, + 'reports_to': None, + 'exit_interview': self.interview3.name, + 'interview_status': self.interview3.status, + 'employee_status': '', + 'questionnaire': employee3.name, + 'full_and_final_statement': None + }, + { + 'employee': employee4.name, + 'employee_name': employee4.employee_name, + 'date_of_joining': employee4.date_of_joining, + 'relieving_date': employee4.relieving_date, + 'department': employee4.department, + 'designation': employee4.designation, + 'reports_to': None, + 'exit_interview': None, + 'interview_status': None, + 'employee_status': None, + 'questionnaire': None, + 'full_and_final_statement': None + }] + + self.assertEqual(expected_data, report[1]) # rows \ No newline at end of file