feat(reports): add uncategorized dual-share exports
This commit is contained in:
@@ -68,6 +68,9 @@ def make_user_summary(*, name: str, mobile: str):
|
||||
"project_percentages": [{"id": "1", "name": "Website", "percentage": "100"}],
|
||||
"client_percentages": [{"id": "1", "name": "Acme", "percentage": "100"}],
|
||||
"tag_percentages": [{"id": "1", "name": "Design", "percentage": "100"}],
|
||||
"project_income_percentages": [{"id": "1", "name": "Website", "percentage": "100"}],
|
||||
"client_income_percentages": [{"id": "1", "name": "Acme", "percentage": "100"}],
|
||||
"tag_income_percentages": [{"id": "1", "name": "Design", "percentage": "100"}],
|
||||
}
|
||||
|
||||
|
||||
@@ -120,23 +123,26 @@ class ReportExporterTests(TestCase):
|
||||
self.assertEqual(summary_sheet["A1"].value, "Workspace Report")
|
||||
self.assertEqual(summary_sheet["B1"].value, "Exports")
|
||||
self.assertEqual(summary_sheet["A15"].value, "Users Summary")
|
||||
self.assertIn("A15:M15", {str(item) for item in summary_sheet.merged_cells.ranges})
|
||||
self.assertIn("A15:P15", {str(item) for item in summary_sheet.merged_cells.ranges})
|
||||
self.assertEqual(
|
||||
tuple(summary_sheet.iter_rows(min_row=16, max_row=16, values_only=True))[0][:13],
|
||||
tuple(summary_sheet.iter_rows(min_row=16, max_row=16, values_only=True))[0][:16],
|
||||
(
|
||||
"Name",
|
||||
"Mobile",
|
||||
"Working hours",
|
||||
"Non-working hours",
|
||||
"Income",
|
||||
"Hourly rate",
|
||||
"Period",
|
||||
"Income",
|
||||
"Clients",
|
||||
"Percentage",
|
||||
"Hour %",
|
||||
"Income %",
|
||||
"Projects",
|
||||
"Percentage",
|
||||
"Hour %",
|
||||
"Income %",
|
||||
"Tags",
|
||||
"Percentage",
|
||||
"Hour %",
|
||||
"Income %",
|
||||
),
|
||||
)
|
||||
self.assertTrue(any(row and "Owner User" in row for row in summary_values))
|
||||
@@ -161,6 +167,20 @@ class ReportExporterTests(TestCase):
|
||||
daily_row = next(row[:6] for row in user_values if row and "2026/04/12" in row)
|
||||
self.assertEqual(daily_row[4], "15 USD")
|
||||
|
||||
breakdown_header = next(row[:7] for row in user_values if row and row[0] == "Name" and row[2] == "Hour %")
|
||||
self.assertEqual(
|
||||
breakdown_header,
|
||||
(
|
||||
"Name",
|
||||
"Billable hours",
|
||||
"Hour %",
|
||||
"Non-billable hours",
|
||||
"Total hours",
|
||||
"Income",
|
||||
"Income %",
|
||||
),
|
||||
)
|
||||
|
||||
def test_pdf_export_supports_persian_locale(self):
|
||||
locale = build_export_locale("fa")
|
||||
report_data = make_report_data(
|
||||
@@ -168,7 +188,16 @@ class ReportExporterTests(TestCase):
|
||||
)
|
||||
report_data["user_summaries"] = [make_user_summary(name="Owner User", mobile="09129990001")]
|
||||
per_user_reports = [
|
||||
{**make_report_data(user_name="Owner User", mobile="09129990001"), "user_summary": make_user_summary(name="Owner User", mobile="09129990001")}
|
||||
{
|
||||
**make_report_data(
|
||||
user_name="Owner User",
|
||||
mobile="09129990001",
|
||||
),
|
||||
"user_summary": make_user_summary(
|
||||
name="Owner User",
|
||||
mobile="09129990001",
|
||||
),
|
||||
}
|
||||
]
|
||||
|
||||
content = build_pdf_report(report_data=report_data, locale=locale, per_user_reports=per_user_reports)
|
||||
|
||||
Reference in New Issue
Block a user