From 58aed76bbb9666bd4cefef89e6ce33d167b0d47a Mon Sep 17 00:00:00 2001 From: giovanni Date: Fri, 6 Feb 2026 10:58:54 +0700 Subject: [PATCH] add query for feed supplier --- .../hpp_per_kandang.repository.go | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/internal/modules/repports/repositories/hpp_per_kandang.repository.go b/internal/modules/repports/repositories/hpp_per_kandang.repository.go index eeb09e92..e13d3f17 100644 --- a/internal/modules/repports/repositories/hpp_per_kandang.repository.go +++ b/internal/modules/repports/repositories/hpp_per_kandang.repository.go @@ -6,6 +6,7 @@ import ( entity "gitlab.com/mbugroup/lti-api.git/internal/entities" "gitlab.com/mbugroup/lti-api.git/internal/utils" + "gitlab.com/mbugroup/lti-api.git/internal/utils/fifo" "gorm.io/gorm" ) @@ -208,6 +209,75 @@ func (r *hppPerKandangRepository) GetFeedOvkDocCostByPeriod(ctx context.Context, } } + feedRows := make([]struct { + ProjectFlockKandangID uint + FeedCost float64 + SupplierID *uint + SupplierName *string + SupplierAlias *string + }, 0) + + feedQuery := r.db.WithContext(ctx). + Table("recordings AS r"). + Select(` + r.project_flock_kandangs_id AS project_flock_kandang_id, + s.id AS supplier_id, + s.name AS supplier_name, + s.alias AS supplier_alias`). + Joins("JOIN recording_stocks AS rs ON rs.recording_id = r.id"). + Joins("JOIN product_warehouses AS pw ON pw.id = rs.product_warehouse_id"). + Joins("JOIN flags AS f ON f.flagable_id = pw.product_id AND f.flagable_type = ?", entity.FlagableTypeProduct). + Joins("JOIN stock_allocations AS sa ON sa.usable_type = ? AND sa.usable_id = rs.id AND sa.stockable_type = ?", fifo.UsableKeyRecordingStock.String(), fifo.StockableKeyPurchaseItems.String()). + Joins("JOIN purchase_items AS pi ON pi.id = sa.stockable_id"). + Joins("LEFT JOIN purchases AS pur ON pur.id = pi.purchase_id"). + Joins("LEFT JOIN suppliers AS s ON s.id = pur.supplier_id"). + Where("r.project_flock_kandangs_id IN ?", projectFlockKandangIDs). + Where("r.record_datetime >= ? AND r.record_datetime < ?", start, end). + Where("f.name = ?", utils.FlagPakan). + Group("r.project_flock_kandangs_id, s.id, s.name, s.alias") + + if err := feedQuery.Scan(&feedRows).Error; err != nil { + return nil, nil, err + } + + feedSuppliers := make([]HppPerKandangSupplierRow, 0) + feedSeen := make(map[uint]map[uint]bool) + for _, feed := range feedRows { + entry, ok := costMap[feed.ProjectFlockKandangID] + if !ok { + rows = append(rows, HppPerKandangCostRow{ + ProjectFlockKandangID: feed.ProjectFlockKandangID, + }) + entry = &rows[len(rows)-1] + costMap[feed.ProjectFlockKandangID] = entry + } + entry.FeedCost += feed.FeedCost + if feed.SupplierID != nil { + if feedSeen[feed.ProjectFlockKandangID] == nil { + feedSeen[feed.ProjectFlockKandangID] = make(map[uint]bool) + } + if !feedSeen[feed.ProjectFlockKandangID][*feed.SupplierID] { + feedSeen[feed.ProjectFlockKandangID][*feed.SupplierID] = true + supplierName := "" + if feed.SupplierName != nil { + supplierName = *feed.SupplierName + } + supplierAlias := "" + if feed.SupplierAlias != nil { + supplierAlias = *feed.SupplierAlias + } + feedSuppliers = append(feedSuppliers, HppPerKandangSupplierRow{ + ProjectFlockKandangID: feed.ProjectFlockKandangID, + SupplierID: *feed.SupplierID, + SupplierName: supplierName, + SupplierAlias: supplierAlias, + Category: "FEED", + }) + } + } + } + + docSuppliers = append(docSuppliers, feedSuppliers...) return rows, docSuppliers, nil }