codex/fix: uniformity week calculation

This commit is contained in:
Adnan Zahir
2026-04-14 13:09:47 +07:00
parent 7638c183f5
commit ca698ff2ae
6 changed files with 236 additions and 76 deletions
@@ -6,6 +6,7 @@ import (
"strings"
"time"
"gitlab.com/mbugroup/lti-api.git/internal/config"
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
validation "gitlab.com/mbugroup/lti-api.git/internal/modules/dashboards/validations"
"gitlab.com/mbugroup/lti-api.git/internal/utils"
@@ -104,6 +105,15 @@ func applyDashboardFilters(db *gorm.DB, filters *validation.DashboardFilter) *go
return db
}
func dashboardUniformityWeekExpr() string {
return fmt.Sprintf(`CASE
WHEN u.uniform_date IS NULL OR pc.chick_in_date IS NULL THEN 0
WHEN u.uniform_date::date < pc.chick_in_date THEN 0
WHEN UPPER(pf.category) = 'LAYING' THEN (((u.uniform_date::date - pc.chick_in_date)::int) / 7) + %d
ELSE (((u.uniform_date::date - pc.chick_in_date)::int) / 7) + 1
END`, config.LayingWeekStart())
}
func (r *DashboardRepositoryImpl) GetRecordingWeeklyMetrics(ctx context.Context, start, end time.Time, filters *validation.DashboardFilter) ([]RecordingWeeklyMetric, error) {
var rows []RecordingWeeklyMetric
@@ -139,20 +149,29 @@ func (r *DashboardRepositoryImpl) GetRecordingWeeklyMetrics(ctx context.Context,
func (r *DashboardRepositoryImpl) GetUniformityWeeklyMetrics(ctx context.Context, start, end time.Time, filters *validation.DashboardFilter) ([]UniformityWeeklyMetric, error) {
var rows []UniformityWeeklyMetric
weekExpr := dashboardUniformityWeekExpr()
db := r.DB().WithContext(ctx).
Table("project_flock_kandang_uniformity AS u").
Select(`u.week AS week,
Select(fmt.Sprintf(`%s AS week,
COALESCE(AVG(u.uniformity), 0) AS uniformity,
COALESCE(AVG((u.chart_data->'statistics'->>'average_weight')::numeric), 0) AS average_weight`).
COALESCE(AVG((u.chart_data->'statistics'->>'average_weight')::numeric), 0) AS average_weight`, weekExpr)).
Joins("JOIN project_flock_kandangs AS pfk ON pfk.id = u.project_flock_kandang_id").
Joins("JOIN project_flocks AS pf ON pf.id = pfk.project_flock_id").
Joins("JOIN kandangs AS k ON k.id = pfk.kandang_id").
Joins(`JOIN (
SELECT project_flock_kandang_id, MIN(chick_in_date)::date AS chick_in_date
FROM project_chickins
WHERE deleted_at IS NULL
GROUP BY project_flock_kandang_id
) AS pc ON pc.project_flock_kandang_id = u.project_flock_kandang_id`).
Where("u.uniform_date IS NOT NULL").
Where("u.uniform_date >= ? AND u.uniform_date < ?", start, end)
Where("u.uniform_date >= ? AND u.uniform_date < ?", start, end).
Where("u.uniform_date::date >= pc.chick_in_date")
db = applyDashboardFilters(db, filters)
if err := db.Group("u.week").Order("u.week ASC").Scan(&rows).Error; err != nil {
if err := db.Group("week").Order("week ASC").Scan(&rows).Error; err != nil {
return nil, err
}
@@ -518,23 +537,31 @@ func (r *DashboardRepositoryImpl) GetComparisonWeeklyUniformityMetrics(ctx conte
}
var rows []ComparisonUniformityMetric
weekExpr := dashboardUniformityWeekExpr()
db := r.DB().WithContext(ctx).
Table("project_flock_kandang_uniformity AS u").
Select(fmt.Sprintf(`u.week AS week,
Select(fmt.Sprintf(`%s AS week,
%s AS series_id,
COALESCE(AVG(u.uniformity), 0) AS uniformity,
COALESCE(AVG((u.chart_data->'statistics'->>'average_weight')::numeric), 0) AS average_weight`, seriesExpr)).
COALESCE(AVG((u.chart_data->'statistics'->>'average_weight')::numeric), 0) AS average_weight`, weekExpr, seriesExpr)).
Joins("JOIN project_flock_kandangs AS pfk ON pfk.id = u.project_flock_kandang_id").
Joins("JOIN kandangs AS k ON k.id = pfk.kandang_id").
Joins("JOIN project_flocks AS pf ON pf.id = pfk.project_flock_id").
Joins("JOIN locations AS loc ON loc.id = k.location_id").
Joins(`JOIN (
SELECT project_flock_kandang_id, MIN(chick_in_date)::date AS chick_in_date
FROM project_chickins
WHERE deleted_at IS NULL
GROUP BY project_flock_kandang_id
) AS pc ON pc.project_flock_kandang_id = u.project_flock_kandang_id`).
Where("u.uniform_date IS NOT NULL").
Where("u.uniform_date >= ? AND u.uniform_date < ?", start, end)
Where("u.uniform_date >= ? AND u.uniform_date < ?", start, end).
Where("u.uniform_date::date >= pc.chick_in_date")
db = applyDashboardFilters(db, filters)
groupBy := fmt.Sprintf("u.week, %s", groupExpr)
orderBy := fmt.Sprintf("u.week ASC, %s", orderExpr)
groupBy := fmt.Sprintf("week, %s", groupExpr)
orderBy := fmt.Sprintf("week ASC, %s", orderExpr)
if err := db.Group(groupBy).Order(orderBy).Scan(&rows).Error; err != nil {
return nil, err
}