|
|
|
@@ -240,22 +240,33 @@ 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.delivery_date IS NOT NULL AND DATE(mdp.delivery_date) < ?)", startDate)
|
|
|
|
|
} else {
|
|
|
|
|
// sold_at: SO-date sebelum startDate DAN sudah di-approve sebagai Delivery Order (step >= 3)
|
|
|
|
|
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).
|
|
|
|
|
Where("EXISTS (SELECT 1 FROM approvals a WHERE a.approvable_type = 'MARKETINGS' AND a.approvable_id = mp.marketing_id AND a.step_number >= 3)")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(filters.SalesIDs) > 0 {
|
|
|
|
|
db = db.Where("m.sales_person_id IN ?", filters.SalesIDs)
|
|
|
|
@@ -318,28 +329,41 @@ 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.delivery_date IS NOT NULL AND DATE(mdp.delivery_date) >= ? AND DATE(mdp.delivery_date) <= ?)", startDate, endDate)
|
|
|
|
|
} else {
|
|
|
|
|
// sold_at: SO-date dalam period DAN sudah di-approve sebagai Delivery Order (step >= 3)
|
|
|
|
|
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).
|
|
|
|
|
Where("EXISTS (SELECT 1 FROM approvals a WHERE a.approvable_type = 'MARKETINGS' AND a.approvable_id = mp.marketing_id AND a.step_number >= 3)")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(filters.SalesIDs) > 0 {
|
|
|
|
|
db = db.Where("m.sales_person_id IN ?", filters.SalesIDs)
|
|
|
|
|