-
Notifications
You must be signed in to change notification settings - Fork 12
/
console_report.go
95 lines (82 loc) · 3.78 KB
/
console_report.go
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
84
85
86
87
88
89
90
91
92
93
94
95
package report
import (
"fmt"
"sort"
"strings"
"time"
)
type consoleReport struct {
currency string
}
const (
blankLine = ""
separator = " --------------------------------------------------------------------------------------------------------------------------------"
rowFormat = "| %-25s || %7v | %7v | %12v | %13v | %13v | %18v | %9v |"
)
func NewConsoleReport(currency string) Writer {
return &consoleReport{
currency: currency,
}
}
func (r *consoleReport) GenerateReport(data *PrintableData) (string, error) {
fmt.Println(separator)
fmt.Println(fmt.Sprintf("| Generating report(s) from '%s' to '%s'", data.Start.Format("Mon Jan _2 15:04:05 2006"), data.End.Add(time.Second*-1).Format("Mon Jan _2 15:04:05 2006")))
fmt.Println(separator)
for _, scheduleData := range data.SchedulesData {
fmt.Println(blankLine)
fmt.Println(separator)
fmt.Println(fmt.Sprintf("| Schedule: '%s' (%s)", scheduleData.Name, scheduleData.ID))
fmt.Println(separator)
fmt.Println(fmt.Sprintf(rowFormat, "USER", "WEEKDAY", "WEEKEND", "BANK HOLIDAY", "TOTAL WEEKDAY", "TOTAL WEEKEND", "TOTAL BANK HOLIDAY", "TOTAL"))
fmt.Println(fmt.Sprintf(rowFormat, "", "HOURS", "HOURS", "HOURS", "AMOUNT", "AMOUNT", "AMOUNT", "AMOUNT"))
fmt.Println(fmt.Sprintf(rowFormat, "", "DAYS", "DAYS", "DAYS", "", "", "", ""))
fmt.Println(separator)
sort.Slice(scheduleData.RotaUsers, func(i, j int) bool {
return strings.Compare(scheduleData.RotaUsers[i].Name, scheduleData.RotaUsers[j].Name) < 1
})
for _, userData := range scheduleData.RotaUsers {
fmt.Println(fmt.Sprintf(rowFormat, userData.Name,
fmt.Sprintf("%v h", userData.NumWorkHours),
fmt.Sprintf("%v h", userData.NumWeekendHours),
fmt.Sprintf("%v h", userData.NumBankHolidaysHours),
fmt.Sprintf("%s%v", r.currency, userData.TotalAmountWorkHours),
fmt.Sprintf("%s%v", r.currency, userData.TotalAmountWeekendHours),
fmt.Sprintf("%s%v", r.currency, userData.TotalAmountBankHolidaysHours),
fmt.Sprintf("%s%v", r.currency, userData.TotalAmount)))
fmt.Println(fmt.Sprintf(rowFormat, "_________________________",
fmt.Sprintf("%.1f d", userData.NumWorkDays),
fmt.Sprintf("%.1f d", userData.NumWeekendDays),
fmt.Sprintf("%.1f d", userData.NumBankHolidaysDays),
"_____________", "_____________", "__________________", "_________"))
}
fmt.Println(separator)
}
fmt.Println("")
fmt.Println(separator)
fmt.Println("| Users summary")
fmt.Println(separator)
fmt.Println(fmt.Sprintf(rowFormat, "USER", "WEEKDAY", "WEEKEND", "BANK HOLIDAY", "TOTAL WEEKDAY", "TOTAL WEEKEND", "TOTAL BANK HOLIDAY", "TOTAL"))
fmt.Println(fmt.Sprintf(rowFormat, "", "HOURS", "HOURS", "HOURS", "AMOUNT", "AMOUNT", "AMOUNT", "AMOUNT"))
fmt.Println(fmt.Sprintf(rowFormat, "", "DAYS", "DAYS", "DAYS", "", "", "", ""))
fmt.Println(separator)
sort.Slice(data.UsersSchedulesSummary, func(i, j int) bool {
return strings.Compare(data.UsersSchedulesSummary[i].Name, data.UsersSchedulesSummary[j].Name) < 1
})
for _, userData := range data.UsersSchedulesSummary {
fmt.Println(fmt.Sprintf(rowFormat, userData.Name,
fmt.Sprintf("%v h", userData.NumWorkHours),
fmt.Sprintf("%v h", userData.NumWeekendHours),
fmt.Sprintf("%v h", userData.NumBankHolidaysHours),
fmt.Sprintf("%s%v", r.currency, userData.TotalAmountWorkHours),
fmt.Sprintf("%s%v", r.currency, userData.TotalAmountWeekendHours),
fmt.Sprintf("%s%v", r.currency, userData.TotalAmountBankHolidaysHours),
fmt.Sprintf("%s%v", r.currency, userData.TotalAmount)))
fmt.Println(fmt.Sprintf(rowFormat, "_________________________",
fmt.Sprintf("%.1f d", userData.NumWorkDays),
fmt.Sprintf("%.1f d", userData.NumWeekendDays),
fmt.Sprintf("%.1f d", userData.NumBankHolidaysDays),
"_____________", "_____________", "__________________", "_________"))
}
fmt.Println(separator)
return "", nil
}