From 6c7d8ac83e10d6d9fbbf79f3afdfcded88aff55f Mon Sep 17 00:00:00 2001 From: giovanni Date: Fri, 22 May 2026 15:55:26 +0700 Subject: [PATCH] fix balance monitoring --- .../balance_monitoring.repository.go | 84 ++++++++++++------- 1 file changed, 53 insertions(+), 31 deletions(-) diff --git a/internal/modules/repports/repositories/balance_monitoring.repository.go b/internal/modules/repports/repositories/balance_monitoring.repository.go index e1da6952..7dc69e02 100644 --- a/internal/modules/repports/repositories/balance_monitoring.repository.go +++ b/internal/modules/repports/repositories/balance_monitoring.repository.go @@ -240,22 +240,32 @@ func (r *balanceMonitoringRepositoryImpl) GetSalesTotalsBeforeDate(ctx context.C return map[uint]float64{}, nil } - dateColumn := resolveBalanceMonitoringDateColumn(filters.FilterBy) - type row struct { CustomerID uint `gorm:"column:customer_id"` Total float64 `gorm:"column:total"` } rows := make([]row, 0) - db := r.db.WithContext(ctx). - Table("marketing_delivery_products mdp"). - Select("m.customer_id AS customer_id, COALESCE(SUM(mdp.total_price), 0) AS total"). - Joins("INNER JOIN marketing_products mp ON mp.id = mdp.marketing_product_id"). - Joins("INNER JOIN marketings m ON m.id = mp.marketing_id"). - Where("m.customer_id IN ?", customerIDs). - Where("m.deleted_at IS NULL"). - Where("mdp.delivery_date IS NOT NULL"). - Where(fmt.Sprintf("DATE(%s) < ?", dateColumn), startDate) + + var db *gorm.DB + if strings.ToLower(strings.TrimSpace(filters.FilterBy)) == "realized_at" { + // Count products that have at least one delivery before startDate (no double-counting) + db = r.db.WithContext(ctx). + Table("marketing_products mp"). + Select("m.customer_id AS customer_id, COALESCE(SUM(mp.total_price), 0) AS total"). + Joins("INNER JOIN marketings m ON m.id = mp.marketing_id"). + Where("m.customer_id IN ?", customerIDs). + Where("m.deleted_at IS NULL"). + Where("EXISTS (SELECT 1 FROM marketing_delivery_products mdp WHERE mdp.marketing_product_id = mp.id AND mdp.deleted_at IS NULL AND mdp.delivery_date IS NOT NULL AND DATE(mdp.delivery_date) < ?)", startDate) + } else { + // sold_at: count all SO products ordered before startDate + db = r.db.WithContext(ctx). + Table("marketing_products mp"). + Select("m.customer_id AS customer_id, COALESCE(SUM(mp.total_price), 0) AS total"). + Joins("INNER JOIN marketings m ON m.id = mp.marketing_id"). + Where("m.customer_id IN ?", customerIDs). + Where("m.deleted_at IS NULL"). + Where("DATE(m.so_date) < ?", startDate) + } if len(filters.SalesIDs) > 0 { db = db.Where("m.sales_person_id IN ?", filters.SalesIDs) @@ -318,28 +328,40 @@ func (r *balanceMonitoringRepositoryImpl) GetSalesByCategoryInPeriod(ctx context return map[uint]BalanceMonitoringCategoryRow{}, nil } - dateColumn := resolveBalanceMonitoringDateColumn(filters.FilterBy) + const selectCols = `m.customer_id AS customer_id, + COALESCE(SUM(CASE WHEN m.marketing_type IN ('AYAM','AYAM_PULLET') THEN mp.qty ELSE 0 END), 0) AS ayam_qty, + COALESCE(SUM(CASE WHEN m.marketing_type IN ('AYAM','AYAM_PULLET') THEN mp.total_weight ELSE 0 END), 0) AS ayam_kg, + COALESCE(SUM(CASE WHEN m.marketing_type IN ('AYAM','AYAM_PULLET') THEN mp.total_price ELSE 0 END), 0) AS ayam_nominal, + COALESCE(SUM(CASE WHEN m.marketing_type = 'TELUR' THEN mp.qty ELSE 0 END), 0) AS telur_qty, + COALESCE(SUM(CASE WHEN m.marketing_type = 'TELUR' THEN mp.total_weight ELSE 0 END), 0) AS telur_kg, + COALESCE(SUM(CASE WHEN m.marketing_type = 'TELUR' THEN mp.total_price ELSE 0 END), 0) AS telur_nominal, + COALESCE(SUM(CASE WHEN m.marketing_type = 'TRADING' THEN mp.qty ELSE 0 END), 0) AS trading_qty, + COALESCE(SUM(CASE WHEN m.marketing_type = 'TRADING' THEN mp.total_weight ELSE 0 END), 0) AS trading_kg, + COALESCE(SUM(CASE WHEN m.marketing_type = 'TRADING' THEN mp.total_price ELSE 0 END), 0) AS trading_nominal` rows := make([]BalanceMonitoringCategoryRow, 0) - db := r.db.WithContext(ctx). - Table("marketing_delivery_products mdp"). - Select(`m.customer_id AS customer_id, - COALESCE(SUM(CASE WHEN m.marketing_type IN ('AYAM','AYAM_PULLET') THEN mdp.usage_qty ELSE 0 END), 0) AS ayam_qty, - COALESCE(SUM(CASE WHEN m.marketing_type IN ('AYAM','AYAM_PULLET') THEN mdp.total_weight ELSE 0 END), 0) AS ayam_kg, - COALESCE(SUM(CASE WHEN m.marketing_type IN ('AYAM','AYAM_PULLET') THEN mdp.total_price ELSE 0 END), 0) AS ayam_nominal, - COALESCE(SUM(CASE WHEN m.marketing_type = 'TELUR' THEN mdp.usage_qty ELSE 0 END), 0) AS telur_qty, - COALESCE(SUM(CASE WHEN m.marketing_type = 'TELUR' THEN mdp.total_weight ELSE 0 END), 0) AS telur_kg, - COALESCE(SUM(CASE WHEN m.marketing_type = 'TELUR' THEN mdp.total_price ELSE 0 END), 0) AS telur_nominal, - COALESCE(SUM(CASE WHEN m.marketing_type = 'TRADING' THEN mdp.usage_qty ELSE 0 END), 0) AS trading_qty, - COALESCE(SUM(CASE WHEN m.marketing_type = 'TRADING' THEN mdp.total_weight ELSE 0 END), 0) AS trading_kg, - COALESCE(SUM(CASE WHEN m.marketing_type = 'TRADING' THEN mdp.total_price ELSE 0 END), 0) AS trading_nominal`). - Joins("INNER JOIN marketing_products mp ON mp.id = mdp.marketing_product_id"). - Joins("INNER JOIN marketings m ON m.id = mp.marketing_id"). - Where("m.customer_id IN ?", customerIDs). - Where("m.deleted_at IS NULL"). - Where("mdp.delivery_date IS NOT NULL"). - Where(fmt.Sprintf("DATE(%s) >= ?", dateColumn), startDate). - Where(fmt.Sprintf("DATE(%s) <= ?", dateColumn), endDate) + + var db *gorm.DB + if strings.ToLower(strings.TrimSpace(filters.FilterBy)) == "realized_at" { + // Count products that have at least one delivery in the period (no double-counting) + db = r.db.WithContext(ctx). + Table("marketing_products mp"). + Select(selectCols). + Joins("INNER JOIN marketings m ON m.id = mp.marketing_id"). + Where("m.customer_id IN ?", customerIDs). + Where("m.deleted_at IS NULL"). + Where("EXISTS (SELECT 1 FROM marketing_delivery_products mdp WHERE mdp.marketing_product_id = mp.id AND mdp.deleted_at IS NULL AND mdp.delivery_date IS NOT NULL AND DATE(mdp.delivery_date) >= ? AND DATE(mdp.delivery_date) <= ?)", startDate, endDate) + } else { + // sold_at: count all SO products placed in the period regardless of delivery status + db = r.db.WithContext(ctx). + Table("marketing_products mp"). + Select(selectCols). + Joins("INNER JOIN marketings m ON m.id = mp.marketing_id"). + Where("m.customer_id IN ?", customerIDs). + Where("m.deleted_at IS NULL"). + Where("DATE(m.so_date) >= ?", startDate). + Where("DATE(m.so_date) <= ?", endDate) + } if len(filters.SalesIDs) > 0 { db = db.Where("m.sales_person_id IN ?", filters.SalesIDs)