-
Notifications
You must be signed in to change notification settings - Fork 1
/
hours.go
160 lines (133 loc) · 3.71 KB
/
hours.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package harvest
import (
_ "log"
"time"
"github.com/polarsquad/harvest/structs"
)
// GetOvertime counts overtime hours from TimeEntries, using also dayTotal function as a helper.
func (entries *TimeEntries) GetOvertime(from time.Time, to time.Time) (totalOvertime float64) {
for d := from; d.Before(to) || d.Equal(to); d = d.AddDate(0, 0, 1) {
_, saldo, overtime := entries.DailyTotals(d)
totalOvertime = totalOvertime + overtime
if saldo != 0 {
totalOvertime = totalOvertime - saldo
}
}
return
}
// TotalHours counts total logged hours from the TimeEntries struct
func (entries *TimeEntries) TotalHours() float64 {
var hours float64
for _, v := range entries.Entries {
hours = hours + v.Hours
}
return hours
}
// Total counts total logged hours from the TimeEntries struct
func (entries *TimeEntries) Total() float64 {
var hours float64
for _, v := range entries.Entries {
hours = hours + v.Hours
}
return hours
}
// DailyTotals counts total logged in hours for selected date.
// Needs daySelector(time.Time) as parameter for selected date.
// Will output hours, saldo and overtime.
// Hours is logged hours excluding spent flexitime.
// Saldo is spent flexitime for that day.
// Overtime is extra time worked for that day.
func (entries *TimeEntries) DailyTotals(daySelector time.Time) (hours float64, saldo float64, overtime float64) {
const fullDay = 7.5
date := daySelector.Format("2006-01-02") // TODO: Switch to get formatter from config
workday := IsWorkday(daySelector)
for _, entry := range entries.Entries {
if entry.SpentDate != date {
continue
}
if workday {
if containsInt(flexitimeIDs, entry.Task.Id) {
saldo = saldo + entry.Hours
} else {
hours = hours + entry.Hours
}
} else {
hours = entry.Hours
overtime = entry.Hours
}
}
if workday && hours+saldo != fullDay {
overtime = (hours + saldo) - fullDay
}
return
}
// DailyHours counts total logged in hours for selected date.
// Needs daySelector(time.Time) as parameter for selected date.
func (entries *TimeEntries) DailyHours(daySelector time.Time) float64 {
var selection Entries
date := daySelector.Format("2006-01-02")
for _, v := range entries.Entries {
if v.SpentDate == date {
selection = append(selection, v)
}
}
dayHours := selection.dayTotal()
return dayHours
}
func (e Entries) dayTotal() float64 {
var hours float64
for _, v := range e {
hours = hours + v.Hours
}
return hours
}
// IsWorkday functions as a helper function, to determine if selected date is workday or not.
func IsWorkday(date time.Time) bool { // Should this be placed in helpers.go?
if date.Weekday().String() != "Saturday" && date.Weekday().String() != "Sunday" {
return true
}
return false
}
// Filter is generic function to filter Entries
func (entries *TimeEntries) Filter(f func(structs.Entries) bool) (ret []structs.Entries) {
for _, v := range entries.Entries {
if f(v) {
ret = append(ret, v)
}
}
return
}
// func (e *TimeEntries) Filter(f func(structs.Entries) bool) []structs.Entries {
// var r Entries
// for _, v := range e.Entries {
// if f(v) == true {
// r = append(r, v)
// }
// }
// return r
// }
// func filter(s []student, f func(student) bool) []student {
// var r []student
// for _, v := range s {
// if f(v) == true {
// r = append(r, v)
// }
// }
// return r
// }
// func (t *TimeEntries) Choose(selector string, test func(string) bool) (ret []structs.Entries) {
// for _, v := range t.Entries {
// if test(s) {
// ret = append(ret, v)
// }
// }
// return
// }
// func (t *TimeEntries) Choose(s string, test func(string) bool) (ret []structs.Entries) {
// for _, v := range t.Entries {
// if test(s) {
// ret = append(ret, v)
// }
// }
// return
// }