fix balance monitoring

This commit is contained in:
giovanni
2026-05-22 15:55:26 +07:00
parent c9e3905a65
commit 6c7d8ac83e
@@ -240,22 +240,32 @@ func (r *balanceMonitoringRepositoryImpl) GetSalesTotalsBeforeDate(ctx context.C
return map[uint]float64{}, nil return map[uint]float64{}, nil
} }
dateColumn := resolveBalanceMonitoringDateColumn(filters.FilterBy)
type row struct { type row struct {
CustomerID uint `gorm:"column:customer_id"` CustomerID uint `gorm:"column:customer_id"`
Total float64 `gorm:"column:total"` Total float64 `gorm:"column:total"`
} }
rows := make([]row, 0) rows := make([]row, 0)
db := r.db.WithContext(ctx).
Table("marketing_delivery_products mdp"). var db *gorm.DB
Select("m.customer_id AS customer_id, COALESCE(SUM(mdp.total_price), 0) AS total"). if strings.ToLower(strings.TrimSpace(filters.FilterBy)) == "realized_at" {
Joins("INNER JOIN marketing_products mp ON mp.id = mdp.marketing_product_id"). // Count products that have at least one delivery before startDate (no double-counting)
Joins("INNER JOIN marketings m ON m.id = mp.marketing_id"). db = r.db.WithContext(ctx).
Where("m.customer_id IN ?", customerIDs). Table("marketing_products mp").
Where("m.deleted_at IS NULL"). Select("m.customer_id AS customer_id, COALESCE(SUM(mp.total_price), 0) AS total").
Where("mdp.delivery_date IS NOT NULL"). Joins("INNER JOIN marketings m ON m.id = mp.marketing_id").
Where(fmt.Sprintf("DATE(%s) < ?", dateColumn), startDate) 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 { if len(filters.SalesIDs) > 0 {
db = db.Where("m.sales_person_id IN ?", filters.SalesIDs) 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 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) rows := make([]BalanceMonitoringCategoryRow, 0)
db := r.db.WithContext(ctx).
Table("marketing_delivery_products mdp"). var db *gorm.DB
Select(`m.customer_id AS customer_id, if strings.ToLower(strings.TrimSpace(filters.FilterBy)) == "realized_at" {
COALESCE(SUM(CASE WHEN m.marketing_type IN ('AYAM','AYAM_PULLET') THEN mdp.usage_qty ELSE 0 END), 0) AS ayam_qty, // Count products that have at least one delivery in the period (no double-counting)
COALESCE(SUM(CASE WHEN m.marketing_type IN ('AYAM','AYAM_PULLET') THEN mdp.total_weight ELSE 0 END), 0) AS ayam_kg, db = r.db.WithContext(ctx).
COALESCE(SUM(CASE WHEN m.marketing_type IN ('AYAM','AYAM_PULLET') THEN mdp.total_price ELSE 0 END), 0) AS ayam_nominal, Table("marketing_products mp").
COALESCE(SUM(CASE WHEN m.marketing_type = 'TELUR' THEN mdp.usage_qty ELSE 0 END), 0) AS telur_qty, Select(selectCols).
COALESCE(SUM(CASE WHEN m.marketing_type = 'TELUR' THEN mdp.total_weight ELSE 0 END), 0) AS telur_kg, Joins("INNER JOIN marketings m ON m.id = mp.marketing_id").
COALESCE(SUM(CASE WHEN m.marketing_type = 'TELUR' THEN mdp.total_price ELSE 0 END), 0) AS telur_nominal, Where("m.customer_id IN ?", customerIDs).
COALESCE(SUM(CASE WHEN m.marketing_type = 'TRADING' THEN mdp.usage_qty ELSE 0 END), 0) AS trading_qty, Where("m.deleted_at IS NULL").
COALESCE(SUM(CASE WHEN m.marketing_type = 'TRADING' THEN mdp.total_weight ELSE 0 END), 0) AS trading_kg, 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)
COALESCE(SUM(CASE WHEN m.marketing_type = 'TRADING' THEN mdp.total_price ELSE 0 END), 0) AS trading_nominal`). } else {
Joins("INNER JOIN marketing_products mp ON mp.id = mdp.marketing_product_id"). // sold_at: count all SO products placed in the period regardless of delivery status
Joins("INNER JOIN marketings m ON m.id = mp.marketing_id"). db = r.db.WithContext(ctx).
Where("m.customer_id IN ?", customerIDs). Table("marketing_products mp").
Where("m.deleted_at IS NULL"). Select(selectCols).
Where("mdp.delivery_date IS NOT NULL"). Joins("INNER JOIN marketings m ON m.id = mp.marketing_id").
Where(fmt.Sprintf("DATE(%s) >= ?", dateColumn), startDate). Where("m.customer_id IN ?", customerIDs).
Where(fmt.Sprintf("DATE(%s) <= ?", dateColumn), endDate) Where("m.deleted_at IS NULL").
Where("DATE(m.so_date) >= ?", startDate).
Where("DATE(m.so_date) <= ?", endDate)
}
if len(filters.SalesIDs) > 0 { if len(filters.SalesIDs) > 0 {
db = db.Where("m.sales_person_id IN ?", filters.SalesIDs) db = db.Where("m.sales_person_id IN ?", filters.SalesIDs)