Merge branch 'feat/BE/US-281-uniformity' into 'development'

Feat/be/us 281 uniformity

See merge request mbugroup/lti-api!145
This commit is contained in:
Hafizh A. Y.
2026-01-09 03:52:26 +00:00
@@ -199,14 +199,26 @@ func (s uniformityService) MapCharts(c *fiber.Ctx, items []entity.ProjectFlockKa
for _, group := range grouped {
allWeeks := make(map[int]utypes.UniformityChartWeek)
weekOrder := make([]int, 0, len(group))
weekSeen := make(map[int]struct{}, len(group))
weeksWithData := 0
gaugeWeeks := make([]utypes.UniformityChartGaugeWeek, 0, len(group))
latestByWeek := make(map[int]entity.ProjectFlockKandangUniformity)
for _, item := range group {
if item.Week == 0 {
continue
}
if existing, ok := latestByWeek[item.Week]; !ok || isUniformityNewer(item, existing) {
latestByWeek[item.Week] = item
}
}
for week := range latestByWeek {
weekOrder = append(weekOrder, week)
}
sort.Ints(weekOrder)
for _, week := range weekOrder {
item := latestByWeek[week]
var weekSummary utypes.UniformityChartWeek
if len(item.ChartData) > 0 {
if err := json.Unmarshal(item.ChartData, &weekSummary); err != nil {
@@ -222,16 +234,11 @@ func (s uniformityService) MapCharts(c *fiber.Ctx, items []entity.ProjectFlockKa
if weekSummary.HasData {
weeksWithData++
}
allWeeks[item.Week] = weekSummary
if _, ok := weekSeen[item.Week]; !ok {
weekSeen[item.Week] = struct{}{}
weekOrder = append(weekOrder, item.Week)
}
allWeeks[week] = weekSummary
hasData := item.ChickQtyOfWeight > 0
gaugeWeeks = append(gaugeWeeks, utypes.UniformityChartGaugeWeek{
Week: item.Week,
Week: week,
UniformityPercent: item.Uniformity,
IdealCount: item.UniformQty,
OutsideIdealCount: item.NotUniformQty,
@@ -240,11 +247,6 @@ func (s uniformityService) MapCharts(c *fiber.Ctx, items []entity.ProjectFlockKa
})
}
sort.Ints(weekOrder)
sort.Slice(gaugeWeeks, func(i, j int) bool {
return gaugeWeeks[i].Week < gaugeWeeks[j].Week
})
weekIndex := make(map[int]int, len(weekOrder))
for idx, week := range weekOrder {
weekIndex[week] = idx
@@ -280,6 +282,23 @@ func (s uniformityService) MapCharts(c *fiber.Ctx, items []entity.ProjectFlockKa
return result, nil
}
func isUniformityNewer(a, b entity.ProjectFlockKandangUniformity) bool {
var aDate, bDate time.Time
if a.UniformDate != nil {
aDate = *a.UniformDate
}
if b.UniformDate != nil {
bDate = *b.UniformDate
}
if !aDate.IsZero() || !bDate.IsZero() {
if aDate.Equal(bDate) {
return a.Id > b.Id
}
return aDate.After(bDate)
}
return a.Id > b.Id
}
func (s uniformityService) MapDocuments(c *fiber.Ctx, items []entity.ProjectFlockKandangUniformity) (map[uint]string, error) {
if s.DocumentSvc == nil || len(items) == 0 {
return map[uint]string{}, nil
@@ -586,13 +605,13 @@ func (s uniformityService) UpdateOne(c *fiber.Ctx, req *validation.Update, id ui
}
func (s *uniformityService) ensureUniqueUniformity(ctx context.Context, id uint, projectFlockKandangID uint, week int, uniformDate *time.Time) error {
if projectFlockKandangID == 0 || week == 0 || uniformDate == nil || uniformDate.IsZero() {
if projectFlockKandangID == 0 || week == 0 {
return nil
}
query := s.Repository.DB().WithContext(ctx).
Model(&entity.ProjectFlockKandangUniformity{}).
Where("project_flock_kandang_id = ? AND week = ? AND uniform_date = ?", projectFlockKandangID, week, *uniformDate)
Where("project_flock_kandang_id = ? AND week = ?", projectFlockKandangID, week)
if id != 0 {
query = query.Where("id <> ?", id)
}
@@ -602,7 +621,7 @@ func (s *uniformityService) ensureUniqueUniformity(ctx context.Context, id uint,
return fiber.NewError(fiber.StatusInternalServerError, "Failed to validate uniformity uniqueness")
}
if count > 0 {
return fiber.NewError(fiber.StatusConflict, "Uniformity already exists for the same project flock kandang, week, and date")
return fiber.NewError(fiber.StatusConflict, "Uniformity already exists for the same project flock kandang and week")
}
return nil
}