fix: task actual hours calculation correction post timesheet update after submit

This commit is contained in:
Nishka Gosalia
2025-12-31 15:11:50 +05:30
parent cb5926f59b
commit aefd36e050
2 changed files with 54 additions and 0 deletions

View File

@@ -8,6 +8,7 @@ from frappe.tests import IntegrationTestCase
from frappe.utils import add_to_date, now_datetime, nowdate
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
from erpnext.projects.doctype.task.test_task import create_task
from erpnext.projects.doctype.timesheet.timesheet import OverlapError, make_sales_invoice
from erpnext.setup.doctype.employee.test_employee import make_employee
from erpnext.tests.utils import ERPNextTestSuite
@@ -22,6 +23,55 @@ class TestTimesheet(ERPNextTestSuite):
def setUp(self):
frappe.db.delete("Timesheet")
def test_timesheet_post_update(self):
frappe.get_doc(
{
"doctype": "Property Setter",
"doctype_or_field": "DocField",
"doc_type": "Timesheet",
"field_name": "time_logs",
"property": "allow_on_submit",
"property_type": "Check",
"value": "1",
}
).insert(ignore_permissions=True)
task = create_task("Test Task 1")
timesheet = frappe.new_doc("Timesheet")
timesheet.append(
"time_logs",
{
"task": task.name,
"from_time": now_datetime(),
"to_time": now_datetime() + datetime.timedelta(hours=1),
"company": "_Test Company",
},
)
timesheet.save()
timesheet.submit()
task.reload()
self.assertEqual(task.actual_time, 1)
timesheet.append(
"time_logs",
{
"task": task.name,
"from_time": now_datetime(),
"to_time": now_datetime() + datetime.timedelta(hours=2),
"hours": 2,
},
)
timesheet.save()
task.reload()
self.assertEqual(task.actual_time, 3)
frappe.db.delete(
"Property Setter",
{"doc_type": "Timesheet", "field_name": "time_logs", "property": "allow_on_submit"},
)
def test_timesheet_base_amount(self):
emp = make_employee("test_employee_6@salary.com")
timesheet = make_timesheet(emp, simulate=True, is_billable=1)

View File

@@ -76,6 +76,10 @@ class Timesheet(Document):
def on_discard(self):
self.db_set("status", "Cancelled")
def on_update_after_submit(self):
self.validate_mandatory_fields()
self.update_task_and_project()
def calculate_hours(self):
for row in self.time_logs:
if row.to_time and row.from_time: