mirror of
https://github.com/muety/wakapi.git
synced 2023-08-10 21:12:56 +03:00
feat: add per weekday stats to report (resolve #493)
This commit is contained in:
parent
35ef323b19
commit
5278dba4f4
File diff suppressed because it is too large
Load Diff
@ -7,4 +7,5 @@ type Report struct {
|
|||||||
To time.Time
|
To time.Time
|
||||||
User *User
|
User *User
|
||||||
Summary *Summary
|
Summary *Summary
|
||||||
|
DailySummaries []*Summary
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
package services
|
package services
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/duke-git/lancet/v2/datetime"
|
||||||
"github.com/duke-git/lancet/v2/slice"
|
"github.com/duke-git/lancet/v2/slice"
|
||||||
"github.com/emvi/logbuch"
|
"github.com/emvi/logbuch"
|
||||||
"github.com/leandro-lugaresi/hub"
|
"github.com/leandro-lugaresi/hub"
|
||||||
"github.com/muety/artifex/v2"
|
"github.com/muety/artifex/v2"
|
||||||
"github.com/muety/wakapi/config"
|
"github.com/muety/wakapi/config"
|
||||||
"github.com/muety/wakapi/models"
|
"github.com/muety/wakapi/models"
|
||||||
|
"github.com/muety/wakapi/utils"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -100,17 +102,34 @@ func (srv *ReportService) SendReport(user *models.User, duration time.Duration)
|
|||||||
end := time.Now().In(user.TZ())
|
end := time.Now().In(user.TZ())
|
||||||
start := time.Now().Add(-1 * duration)
|
start := time.Now().Add(-1 * duration)
|
||||||
|
|
||||||
summary, err := srv.summaryService.Aliased(start, end, user, srv.summaryService.Retrieve, nil, false)
|
fullSummary, err := srv.summaryService.Aliased(start, end, user, srv.summaryService.Retrieve, nil, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
config.Log().Error("failed to generate report for '%s' - %v", user.ID, err)
|
config.Log().Error("failed to generate report for '%s' - %v", user.ID, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// generate per-day summaries
|
||||||
|
dayIntervals := utils.SplitRangeByDays(start, end)
|
||||||
|
dailySummaries := make([]*models.Summary, len(dayIntervals))
|
||||||
|
|
||||||
|
for i, interval := range dayIntervals {
|
||||||
|
from, to := datetime.BeginOfDay(interval[0]), interval[1]
|
||||||
|
summary, err := srv.summaryService.Aliased(from, to, user, srv.summaryService.Retrieve, nil, false)
|
||||||
|
if err != nil {
|
||||||
|
config.Log().Error("failed to generate day summary (%v to %v) for report for '%s' - %v", from, to, user.ID, err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
summary.FromTime = models.CustomTime(from)
|
||||||
|
summary.ToTime = models.CustomTime(to.Add(-1 * time.Second))
|
||||||
|
dailySummaries[i] = summary
|
||||||
|
}
|
||||||
|
|
||||||
report := &models.Report{
|
report := &models.Report{
|
||||||
From: start,
|
From: start,
|
||||||
To: end,
|
To: end,
|
||||||
User: user,
|
User: user,
|
||||||
Summary: summary,
|
Summary: fullSummary,
|
||||||
|
DailySummaries: dailySummaries,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := srv.mailService.SendReport(user, report); err != nil {
|
if err := srv.mailService.SendReport(user, report); err != nil {
|
||||||
|
@ -32,6 +32,20 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
{{ if len .Report.DailySummaries }}
|
||||||
|
<p style="font-family: sans-serif; font-size: 16px; font-weight: 500; margin: 0; Margin-bottom: 15px; Margin-top: 30px;">Weekdays</p>
|
||||||
|
<table border="0" cellpadding="0" cellspacing="0" class="btn btn-primary" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%; box-sizing: border-box;">
|
||||||
|
<tbody>
|
||||||
|
{{ range $i, $summary := .Report.DailySummaries }}
|
||||||
|
<tr>
|
||||||
|
<td align="left" style="width: 300px; font-family: sans-serif; font-size: 14px; vertical-align: top; padding-bottom: 15px; font-weight: 800;">{{ $summary.FromTime.T | date }}:</td>
|
||||||
|
<td align="left" style="font-family: sans-serif; font-size: 14px; vertical-align: top; padding-bottom: 15px;">{{ $summary.TotalTime | duration }}</td>
|
||||||
|
</tr>
|
||||||
|
{{ end }}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
<p style="font-family: sans-serif; font-size: 16px; font-weight: 500; margin: 0; Margin-bottom: 15px; Margin-top: 30px;">Languages</p>
|
<p style="font-family: sans-serif; font-size: 16px; font-weight: 500; margin: 0; Margin-bottom: 15px; Margin-top: 30px;">Languages</p>
|
||||||
<table border="0" cellpadding="0" cellspacing="0" class="btn btn-primary" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%; box-sizing: border-box;">
|
<table border="0" cellpadding="0" cellspacing="0" class="btn btn-primary" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%; box-sizing: border-box;">
|
||||||
<tbody>
|
<tbody>
|
||||||
|
Loading…
Reference in New Issue
Block a user