summaryrefslogtreecommitdiff
path: root/internal/reports/unified.go
blob: a6eb8c4292c5013d34587ab82642cedf4c17d2ec (plain)
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
}