1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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
}
|