diff options
Diffstat (limited to 'internal/reports/unified.go')
-rw-r--r-- | internal/reports/unified.go | 83 |
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 |