mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-24 15:25:43 +00:00
add api summary and update status
This commit is contained in:
@@ -34,6 +34,7 @@ type DailyChecklistService interface {
|
||||
UpdateAssignment(ctx *fiber.Ctx, req *validation.UpdateAssignment) error
|
||||
GetChecklistPhaseIDs(ctx *fiber.Ctx, checklistID uint) ([]uint, error)
|
||||
GetDetail(ctx *fiber.Ctx, id uint) (*DailyChecklistDetail, error)
|
||||
GetSummary(ctx *fiber.Ctx, params *validation.SummaryQuery) ([]DailyChecklistSummary, error)
|
||||
}
|
||||
|
||||
type dailyChecklistService struct {
|
||||
@@ -52,6 +53,18 @@ type DailyChecklistDetail struct {
|
||||
Progress float64
|
||||
}
|
||||
|
||||
type DailyChecklistSummary struct {
|
||||
EmployeeID uint
|
||||
EmployeeName string
|
||||
KandangID uint
|
||||
KandangName string
|
||||
TotalActivity int
|
||||
ActivityDone int
|
||||
ActivityLeft int
|
||||
CompletionRate int
|
||||
LastActivity *time.Time
|
||||
}
|
||||
|
||||
func NewDailyChecklistService(repo repository.DailyChecklistRepository, phaseRepo phaseRepo.PhasesRepository, validate *validator.Validate) DailyChecklistService {
|
||||
return &dailyChecklistService{
|
||||
Log: utils.Log,
|
||||
@@ -202,14 +215,12 @@ func (s dailyChecklistService) UpdateOne(c *fiber.Ctx, req *validation.Update, i
|
||||
return nil, err
|
||||
}
|
||||
|
||||
updateBody := make(map[string]any)
|
||||
|
||||
if req.Name != nil {
|
||||
updateBody["name"] = *req.Name
|
||||
updateBody := map[string]any{
|
||||
"status": req.Status,
|
||||
}
|
||||
|
||||
if len(updateBody) == 0 {
|
||||
return s.GetOne(c, id)
|
||||
if req.RejectReason != nil {
|
||||
updateBody["reject_reason"] = *req.RejectReason
|
||||
}
|
||||
|
||||
if err := s.Repository.PatchOne(c.Context(), id, updateBody, nil); err != nil {
|
||||
@@ -579,3 +590,86 @@ func (s dailyChecklistService) AssignTasks(c *fiber.Ctx, id uint, req *validatio
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s dailyChecklistService) GetSummary(c *fiber.Ctx, params *validation.SummaryQuery) ([]DailyChecklistSummary, error) {
|
||||
if err := s.Validate.Struct(params); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
dateFrom, err := time.Parse("2006-01-02", params.DateFrom)
|
||||
if err != nil {
|
||||
return nil, fiber.NewError(fiber.StatusBadRequest, "invalid date_from format, use YYYY-MM-DD")
|
||||
}
|
||||
|
||||
dateTo, err := time.Parse("2006-01-02", params.DateTo)
|
||||
if err != nil {
|
||||
return nil, fiber.NewError(fiber.StatusBadRequest, "invalid date_to format, use YYYY-MM-DD")
|
||||
}
|
||||
|
||||
type summaryRow struct {
|
||||
EmployeeID uint
|
||||
EmployeeName string
|
||||
KandangID uint
|
||||
KandangName string
|
||||
TotalActivity int64
|
||||
ActivityDone int64
|
||||
ActivityLeft int64
|
||||
LastActivity *time.Time
|
||||
}
|
||||
|
||||
rows := make([]summaryRow, 0)
|
||||
db := s.Repository.DB().WithContext(c.Context()).
|
||||
Table("daily_checklist_activity_task_assignments AS a").
|
||||
Select(`
|
||||
a.employee_id,
|
||||
e.name AS employee_name,
|
||||
d.kandang_id,
|
||||
k.name AS kandang_name,
|
||||
COUNT(*) AS total_activity,
|
||||
SUM(CASE WHEN a.checked THEN 1 ELSE 0 END) AS activity_done,
|
||||
SUM(CASE WHEN NOT a.checked THEN 1 ELSE 0 END) AS activity_left,
|
||||
MAX(a.updated_at) AS last_activity`).
|
||||
Joins("JOIN daily_checklist_activity_tasks t ON t.id = a.task_id").
|
||||
Joins("JOIN daily_checklists d ON d.id = t.checklist_id").
|
||||
Joins("JOIN kandangs k ON k.id = d.kandang_id").
|
||||
Joins("JOIN employees e ON e.id = a.employee_id").
|
||||
Where("d.date BETWEEN ? AND ?", dateFrom, dateTo)
|
||||
|
||||
if params.Category != "" {
|
||||
db = db.Where("d.category = ?", params.Category)
|
||||
}
|
||||
|
||||
if params.KandangID != nil {
|
||||
db = db.Where("d.kandang_id = ?", *params.KandangID)
|
||||
}
|
||||
|
||||
if err := db.
|
||||
Group("a.employee_id, e.name, d.kandang_id, k.name").
|
||||
Order("e.name ASC").
|
||||
Find(&rows).Error; err != nil {
|
||||
s.Log.Errorf("Failed to get daily checklist summary: %+v", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
summaries := make([]DailyChecklistSummary, len(rows))
|
||||
for i, row := range rows {
|
||||
completionRate := 0
|
||||
if row.TotalActivity > 0 {
|
||||
completionRate = int(math.Round(float64(row.ActivityDone) / float64(row.TotalActivity) * 100))
|
||||
}
|
||||
|
||||
summaries[i] = DailyChecklistSummary{
|
||||
EmployeeID: row.EmployeeID,
|
||||
EmployeeName: row.EmployeeName,
|
||||
KandangID: row.KandangID,
|
||||
KandangName: row.KandangName,
|
||||
TotalActivity: int(row.TotalActivity),
|
||||
ActivityDone: int(row.ActivityDone),
|
||||
ActivityLeft: int(row.ActivityLeft),
|
||||
CompletionRate: completionRate,
|
||||
LastActivity: row.LastActivity,
|
||||
}
|
||||
}
|
||||
|
||||
return summaries, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user