summaryrefslogtreecommitdiff
path: root/internal/reports/unified.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/reports/unified.go')
-rw-r--r--internal/reports/unified.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/internal/reports/unified.go b/internal/reports/unified.go
new file mode 100644
index 0000000..a6eb8c4
--- /dev/null
+++ b/internal/reports/unified.go
@@ -0,0 +1,83 @@
+package reports
+
+import (
+ "fmt"
+ "time"
+
+ "punchcard/internal/queries"
+)
+
+type UnifiedReportData struct {
+ InvoiceData *InvoiceData
+ TimesheetData *TimesheetData
+}
+
+func GenerateUnifiedReportData(
+ invoiceEntries interface{},
+ clientID int64,
+ clientName,
+ projectName string,
+ contractor queries.Contractor,
+ invoiceNumber int64,
+ dateRange DateRange,
+ loc *time.Location,
+) (*UnifiedReportData, error) {
+ // Generate invoice data
+ invoiceData, err := GenerateInvoiceData(invoiceEntries, clientID, clientName, projectName, contractor, invoiceNumber, dateRange)
+ if err != nil {
+ return nil, err
+ }
+
+ // For timesheet data, we need to use the same entries but potentially different types
+ // Convert invoice entries to timesheet entries if needed
+ var timesheetEntries interface{}
+ switch e := invoiceEntries.(type) {
+ case []queries.GetInvoiceDataByClientRow:
+ // Convert to timesheet format
+ converted := make([]queries.GetTimesheetDataByClientRow, len(e))
+ for i, entry := range e {
+ converted[i] = queries.GetTimesheetDataByClientRow{
+ TimeEntryID: entry.TimeEntryID,
+ StartTime: entry.StartTime,
+ EndTime: entry.EndTime,
+ Description: entry.Description,
+ ClientID: entry.ClientID,
+ ClientName: entry.ClientName,
+ ProjectID: entry.ProjectID,
+ ProjectName: entry.ProjectName,
+ DurationSeconds: entry.DurationSeconds,
+ }
+ }
+ timesheetEntries = converted
+ case []queries.GetInvoiceDataByProjectRow:
+ // Convert to timesheet format
+ converted := make([]queries.GetTimesheetDataByProjectRow, len(e))
+ for i, entry := range e {
+ converted[i] = queries.GetTimesheetDataByProjectRow{
+ TimeEntryID: entry.TimeEntryID,
+ StartTime: entry.StartTime,
+ EndTime: entry.EndTime,
+ Description: entry.Description,
+ ClientID: entry.ClientID,
+ ClientName: entry.ClientName,
+ ProjectID: entry.ProjectID,
+ ProjectName: entry.ProjectName,
+ DurationSeconds: entry.DurationSeconds,
+ }
+ }
+ timesheetEntries = converted
+ default:
+ return nil, fmt.Errorf("unsupported entry type for unified report")
+ }
+
+ // Generate timesheet data
+ timesheetData, err := GenerateTimesheetData(timesheetEntries, clientID, clientName, projectName, contractor, dateRange, loc)
+ if err != nil {
+ return nil, err
+ }
+
+ return &UnifiedReportData{
+ InvoiceData: invoiceData,
+ TimesheetData: timesheetData,
+ }, nil
+} \ No newline at end of file