package reports import ( "fmt" "time" "git.tjp.lol/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 }