From 77b986a5e51651b34ef514ddc5750e4cb1238467 Mon Sep 17 00:00:00 2001 From: Arthur Deierlein Date: Fri, 31 Jan 2025 13:56:57 +0100 Subject: [PATCH] fix(backend): provide total billable time in task meta --- backend/timed/projects/serializers.py | 7 +++++++ backend/timed/projects/tests/test_task.py | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/backend/timed/projects/serializers.py b/backend/timed/projects/serializers.py index b76ec5012..36a3b34ff 100644 --- a/backend/timed/projects/serializers.py +++ b/backend/timed/projects/serializers.py @@ -139,6 +139,13 @@ def get_root_meta(self, _resource, many): queryset = Report.objects.filter(task=self.instance) data = queryset.aggregate(spent_time=Sum("duration")) data["spent_time"] = duration_string(data["spent_time"] or timedelta(0)) + billable_data = queryset.filter(not_billable=False, review=False).aggregate( + spent_billable=Sum("duration") + ) + data["spent_billable"] = duration_string( + billable_data["spent_billable"] or timedelta(0) + ) + return data return {} diff --git a/backend/timed/projects/tests/test_task.py b/backend/timed/projects/tests/test_task.py index df79ca749..c13efb230 100644 --- a/backend/timed/projects/tests/test_task.py +++ b/backend/timed/projects/tests/test_task.py @@ -191,6 +191,7 @@ def test_task_detail_no_reports(internal_employee_client, task): json = res.json() assert json["meta"]["spent-time"] == "00:00:00" + assert json["meta"]["spent-billable"] == "00:00:00" def test_task_detail_with_reports(internal_employee_client, task, report_factory): @@ -204,6 +205,7 @@ def test_task_detail_with_reports(internal_employee_client, task, report_factory json = res.json() assert json["meta"]["spent-time"] == "02:30:00" + assert json["meta"]["spent-billable"] == "02:30:00" @pytest.mark.parametrize(("is_assigned", "expected"), [(True, 1), (False, 0)]) @@ -263,3 +265,17 @@ def test_task_multi_number_value_filter(internal_employee_client): json = response.json() assert len(json["data"]) == 2 + + +def test_task_detail_spent_billable(internal_employee_client, task, report_factory): + report_factory.create(task=task, duration=timedelta(minutes=30), not_billable=True) + + url = reverse("task-detail", args=[task.id]) + + res = internal_employee_client.get(url) + + assert res.status_code == status.HTTP_200_OK + + json = res.json() + assert json["meta"]["spent-time"] == "00:30:00" + assert json["meta"]["spent-billable"] == "00:00:00"