From f7522636e242a121bb9103765889e7c923b1913f Mon Sep 17 00:00:00 2001 From: ragilap Date: Fri, 9 Jan 2026 09:27:49 +0700 Subject: [PATCH 1/3] feat(BE-281): unique uniformity weeks --- .../services/uniformity.service.go | 45 +++++++++++++------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/internal/modules/production/uniformities/services/uniformity.service.go b/internal/modules/production/uniformities/services/uniformity.service.go index cde86694..6e03795d 100644 --- a/internal/modules/production/uniformities/services/uniformity.service.go +++ b/internal/modules/production/uniformities/services/uniformity.service.go @@ -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.CreatedAt.After(b.CreatedAt) + } + return aDate.After(bDate) + } + return a.CreatedAt.After(b.CreatedAt) +} + 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 From 338312edd11513764df35fcccfe3e2359c68b87f Mon Sep 17 00:00:00 2001 From: ragilap Date: Fri, 9 Jan 2026 10:04:31 +0700 Subject: [PATCH 2/3] feat(BE-281): unique uniformity weeks --- .../production/uniformities/services/uniformity.service.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/modules/production/uniformities/services/uniformity.service.go b/internal/modules/production/uniformities/services/uniformity.service.go index 6e03795d..3c021a17 100644 --- a/internal/modules/production/uniformities/services/uniformity.service.go +++ b/internal/modules/production/uniformities/services/uniformity.service.go @@ -605,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) } @@ -621,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 } From 43eb1df118f16d823dc01a081f7266ea3aa9cb5e Mon Sep 17 00:00:00 2001 From: ragilap Date: Fri, 9 Jan 2026 10:06:22 +0700 Subject: [PATCH 3/3] feat(BE-281): fixing duplicate --- .../production/uniformities/services/uniformity.service.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/modules/production/uniformities/services/uniformity.service.go b/internal/modules/production/uniformities/services/uniformity.service.go index 3c021a17..92db84a3 100644 --- a/internal/modules/production/uniformities/services/uniformity.service.go +++ b/internal/modules/production/uniformities/services/uniformity.service.go @@ -292,11 +292,11 @@ func isUniformityNewer(a, b entity.ProjectFlockKandangUniformity) bool { } if !aDate.IsZero() || !bDate.IsZero() { if aDate.Equal(bDate) { - return a.CreatedAt.After(b.CreatedAt) + return a.Id > b.Id } return aDate.After(bDate) } - return a.CreatedAt.After(b.CreatedAt) + return a.Id > b.Id } func (s uniformityService) MapDocuments(c *fiber.Ctx, items []entity.ProjectFlockKandangUniformity) (map[uint]string, error) {