From 82f0db107afae96b1c4dc39321a156315f0a0ee8 Mon Sep 17 00:00:00 2001 From: ragilap Date: Tue, 3 Feb 2026 11:17:11 +0700 Subject: [PATCH] [FEAT/BE]Fix create avaible qty --- .../recordings/services/recording.service.go | 40 ++++++++++++++----- internal/utils/recording/util.recording.go | 20 ++++++++-- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/internal/modules/production/recordings/services/recording.service.go b/internal/modules/production/recordings/services/recording.service.go index c5537b53..29f9cffc 100644 --- a/internal/modules/production/recordings/services/recording.service.go +++ b/internal/modules/production/recordings/services/recording.service.go @@ -1073,19 +1073,37 @@ func (s *recordingService) computeAndUpdateMetrics(ctx context.Context, tx *gorm var remainingChick float64 if totalChick > 0 { totalChickFloat := float64(totalChick) - remainingChick = totalChickFloat - cumDepletionQty - if remainingChick < 0 { - remainingChick = 0 - } - updates["total_chick_qty"] = remainingChick - recording.TotalChickQty = &remainingChick + if s.FifoSvc != nil { + // totalChick already represents available qty (total_qty - total_used_qty). + remainingChick = totalChickFloat + updates["total_chick_qty"] = remainingChick + recording.TotalChickQty = &remainingChick - cumRate := 0.0 - if totalChickFloat > 0 { - cumRate = (cumDepletionQty / totalChickFloat) * 100 + baseChick := initialChickin + if baseChick <= 0 { + baseChick = totalChickFloat + cumDepletionQty + } + cumRate := 0.0 + if baseChick > 0 { + cumRate = (cumDepletionQty / baseChick) * 100 + } + updates["cum_depletion_rate"] = cumRate + recording.CumDepletionRate = &cumRate + } else { + remainingChick = totalChickFloat - cumDepletionQty + if remainingChick < 0 { + remainingChick = 0 + } + updates["total_chick_qty"] = remainingChick + recording.TotalChickQty = &remainingChick + + cumRate := 0.0 + if totalChickFloat > 0 { + cumRate = (cumDepletionQty / totalChickFloat) * 100 + } + updates["cum_depletion_rate"] = cumRate + recording.CumDepletionRate = &cumRate } - updates["cum_depletion_rate"] = cumRate - recording.CumDepletionRate = &cumRate } else { updates["total_chick_qty"] = gorm.Expr("NULL") updates["cum_depletion_rate"] = gorm.Expr("NULL") diff --git a/internal/utils/recording/util.recording.go b/internal/utils/recording/util.recording.go index f40818bf..2b146f5f 100644 --- a/internal/utils/recording/util.recording.go +++ b/internal/utils/recording/util.recording.go @@ -28,12 +28,26 @@ func MapDepletions(recordingID uint, items []validation.Depletion) []entity.Reco return nil } - result := make([]entity.RecordingDepletion, 0, len(items)) + aggregate := make(map[uint]float64, len(items)) for _, item := range items { + if item.ProductWarehouseId == 0 || item.Qty == 0 { + continue + } + aggregate[item.ProductWarehouseId] += item.Qty + } + if len(aggregate) == 0 { + return nil + } + + result := make([]entity.RecordingDepletion, 0, len(aggregate)) + for warehouseID, qty := range aggregate { + if qty == 0 { + continue + } result = append(result, entity.RecordingDepletion{ RecordingId: recordingID, - ProductWarehouseId: item.ProductWarehouseId, - Qty: item.Qty, + ProductWarehouseId: warehouseID, + Qty: qty, }) } return result