···
16
+
// this adds to the existing count
17
+
func AddPunch(e Execer, punch Punch) error {
19
+
insert into punchcard (did, date, count)
21
+
on conflict(did, date) do update set
22
+
count = coalesce(punchcard.count, 0) + excluded.count;
23
+
`, punch.Did, punch.Date.Format(time.DateOnly), punch.Count)
27
+
type Punchcard struct {
32
+
func MakePunchcard(e Execer, filters ...filter) (Punchcard, error) {
33
+
punchcard := Punchcard{}
35
+
startOfYear := time.Date(now.Year(), 1, 1, 0, 0, 0, 0, time.UTC)
36
+
endOfYear := time.Date(now.Year(), 12, 31, 0, 0, 0, 0, time.UTC)
37
+
for d := startOfYear; d.Before(endOfYear) || d.Equal(endOfYear); d = d.AddDate(0, 0, 1) {
38
+
punchcard.Punches = append(punchcard.Punches, Punch{
44
+
var conditions []string
46
+
for _, filter := range filters {
47
+
conditions = append(conditions, filter.Condition())
48
+
args = append(args, filter.arg)
52
+
if conditions != nil {
53
+
whereClause = " where " + strings.Join(conditions, " and ")
56
+
query := fmt.Sprintf(`
57
+
select date, sum(count) as total_count
64
+
rows, err := e.Query(query, args...)
66
+
return punchcard, err
73
+
var count sql.NullInt64
74
+
if err := rows.Scan(&date, &count); err != nil {
75
+
return punchcard, err
78
+
punch.Date, err = time.Parse(time.DateOnly, date)
80
+
fmt.Println("invalid date")
81
+
// this punch is not recorded if date is invalid
86
+
punch.Count = int(count.Int64)
89
+
punchcard.Punches[punch.Date.YearDay()] = punch
90
+
punchcard.Total += punch.Count
93
+
return punchcard, nil