test: Basic report data testing
This commit is contained in:
parent
39b75c63ad
commit
1e772bb9a4
@ -99,7 +99,10 @@ class EmployeeHoursReport:
|
|||||||
|
|
||||||
if self.filters.project:
|
if self.filters.project:
|
||||||
additional_filters += f"AND ttd.project = '{self.filters.project}'"
|
additional_filters += f"AND ttd.project = '{self.filters.project}'"
|
||||||
|
|
||||||
|
if self.filters.company:
|
||||||
|
additional_filters += f"AND tt.company = '{self.filters.company}'"
|
||||||
|
|
||||||
self.filtered_time_logs = frappe.db.sql('''
|
self.filtered_time_logs = frappe.db.sql('''
|
||||||
SELECT tt.employee AS employee, ttd.hours AS hours, ttd.billable AS billable, ttd.project AS project
|
SELECT tt.employee AS employee, ttd.hours AS hours, ttd.billable AS billable, ttd.project AS project
|
||||||
FROM `tabTimesheet Detail` AS ttd
|
FROM `tabTimesheet Detail` AS ttd
|
||||||
@ -134,6 +137,8 @@ class EmployeeHoursReport:
|
|||||||
data['per_util'] = flt(((data['billed_hours'] + data['non_billed_hours']) / TOTAL_HOURS) * 100, 2)
|
data['per_util'] = flt(((data['billed_hours'] + data['non_billed_hours']) / TOTAL_HOURS) * 100, 2)
|
||||||
|
|
||||||
def generate_report_summary(self):
|
def generate_report_summary(self):
|
||||||
|
self.report_summary = []
|
||||||
|
|
||||||
if not self.data:
|
if not self.data:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@ -0,0 +1,147 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
import unittest
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
from frappe.utils.make_random import get_random
|
||||||
|
from frappe.utils import get_timestamp
|
||||||
|
from erpnext.projects.report.employee_hours_utilisation_based_on_timesheet.employee_hours_utilisation_based_on_timesheet import execute
|
||||||
|
from erpnext.hr.doctype.employee.test_employee import make_employee
|
||||||
|
from erpnext.projects.doctype.project.test_project import make_project
|
||||||
|
|
||||||
|
class TestEmployeeUtilisation(unittest.TestCase):
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
# Create test employee
|
||||||
|
cls.test_emp1 = make_employee("test@example.com", "_Test Company")
|
||||||
|
cls.test_emp2 = make_employee("test1@example.com", "_Test Company")
|
||||||
|
|
||||||
|
# Create test project
|
||||||
|
cls.test_project = make_project({"project_name": "_Test Project"})
|
||||||
|
|
||||||
|
# Create test timesheets
|
||||||
|
cls.create_test_timesheets()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create_test_timesheets(cls):
|
||||||
|
timesheet1 = frappe.new_doc("Timesheet")
|
||||||
|
timesheet1.employee = cls.test_emp1
|
||||||
|
timesheet1.company = '_Test Company'
|
||||||
|
|
||||||
|
timesheet1.append("time_logs", {
|
||||||
|
"activity_type": get_random("Activity Type"),
|
||||||
|
"hours": 5,
|
||||||
|
"billable": 1,
|
||||||
|
"from_time": '2021-04-01 13:30:00.000000',
|
||||||
|
"to_time": '2021-04-01 18:30:00.000000'
|
||||||
|
})
|
||||||
|
|
||||||
|
timesheet1.save()
|
||||||
|
timesheet1.submit()
|
||||||
|
|
||||||
|
timesheet2 = frappe.new_doc("Timesheet")
|
||||||
|
timesheet2.employee = cls.test_emp2
|
||||||
|
timesheet2.company = '_Test Company'
|
||||||
|
|
||||||
|
timesheet2.append("time_logs", {
|
||||||
|
"activity_type": get_random("Activity Type"),
|
||||||
|
"hours": 10,
|
||||||
|
"billable": 0,
|
||||||
|
"from_time": '2021-04-01 13:30:00.000000',
|
||||||
|
"to_time": '2021-04-01 23:30:00.000000',
|
||||||
|
"project": cls.test_project.name
|
||||||
|
})
|
||||||
|
|
||||||
|
timesheet2.save()
|
||||||
|
timesheet2.submit()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
# Delete time logs
|
||||||
|
frappe.db.sql("""
|
||||||
|
DELETE FROM `tabTimesheet Detail`
|
||||||
|
WHERE parent IN (
|
||||||
|
SELECT name
|
||||||
|
FROM `tabTimesheet`
|
||||||
|
WHERE company = '_Test Company'
|
||||||
|
)
|
||||||
|
""")
|
||||||
|
|
||||||
|
frappe.db.sql("DELETE FROM `tabTimesheet` WHERE company='_Test Company'")
|
||||||
|
frappe.db.sql(f"DELETE FROM `tabProject` WHERE name='{cls.test_project.name}'")
|
||||||
|
print(f"DELETE FROM `tabProject` WHERE name='{cls.test_project.name}'")
|
||||||
|
|
||||||
|
def test_utilisation_report_with_required_filters_only(self):
|
||||||
|
filters = {
|
||||||
|
"company": "_Test Company",
|
||||||
|
"from_date": "2021-04-01",
|
||||||
|
"to_date": "2021-04-03"
|
||||||
|
}
|
||||||
|
|
||||||
|
report = execute(filters)
|
||||||
|
|
||||||
|
expected_data = [
|
||||||
|
{
|
||||||
|
'employee': 'EMP-00002',
|
||||||
|
'billed_hours': 0.0,
|
||||||
|
'non_billed_hours': 10.0,
|
||||||
|
'total_hours': 18.0,
|
||||||
|
'untracked_hours': 8.0,
|
||||||
|
'per_util': 55.56
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'employee': 'EMP-00001',
|
||||||
|
'billed_hours': 5.0,
|
||||||
|
'non_billed_hours': 0.0,
|
||||||
|
'total_hours': 18.0,
|
||||||
|
'untracked_hours': 13.0,
|
||||||
|
'per_util': 27.78
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
self.assertEqual(report[1], expected_data)
|
||||||
|
|
||||||
|
def test_utilisation_report_for_single_employee(self):
|
||||||
|
filters = {
|
||||||
|
"company": "_Test Company",
|
||||||
|
"from_date": "2021-04-01",
|
||||||
|
"to_date": "2021-04-03",
|
||||||
|
"employee": self.test_emp1
|
||||||
|
}
|
||||||
|
|
||||||
|
report = execute(filters)
|
||||||
|
|
||||||
|
expected_data = [
|
||||||
|
{
|
||||||
|
'employee': 'EMP-00001',
|
||||||
|
'billed_hours': 5.0,
|
||||||
|
'non_billed_hours': 0.0,
|
||||||
|
'total_hours': 18.0,
|
||||||
|
'untracked_hours': 13.0,
|
||||||
|
'per_util': 27.78
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
self.assertEqual(report[1], expected_data)
|
||||||
|
|
||||||
|
def test_utilisation_report_for_project(self):
|
||||||
|
filters = {
|
||||||
|
"company": "_Test Company",
|
||||||
|
"from_date": "2021-04-01",
|
||||||
|
"to_date": "2021-04-03",
|
||||||
|
"project": self.test_project.name
|
||||||
|
}
|
||||||
|
|
||||||
|
report = execute(filters)
|
||||||
|
|
||||||
|
expected_data = [
|
||||||
|
{
|
||||||
|
'employee': 'EMP-00002',
|
||||||
|
'billed_hours': 0.0,
|
||||||
|
'non_billed_hours': 10.0,
|
||||||
|
'total_hours': 18.0,
|
||||||
|
'untracked_hours': 8.0,
|
||||||
|
'per_util': 55.56
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
self.assertEqual(report[1], expected_data)
|
||||||
Loading…
x
Reference in New Issue
Block a user