|
|
|
@@ -240,22 +240,36 @@ 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" {
|
|
|
|
|
// realized_at: gunakan data DO (mdp.total_price), filter by delivery_date < startDate
|
|
|
|
|
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("DATE(mdp.delivery_date) < ?", startDate)
|
|
|
|
|
} else {
|
|
|
|
|
// sold_at: SO-date sebelum startDate DAN approval terbaru sudah DO — gunakan data DO (mdp.total_price)
|
|
|
|
|
db = r.db.WithContext(ctx).
|
|
|
|
|
Table("marketing_products mp").
|
|
|
|
|
Select("m.customer_id AS customer_id, COALESCE(SUM(mdp.total_price), 0) AS total").
|
|
|
|
|
Joins("INNER JOIN marketings m ON m.id = mp.marketing_id").
|
|
|
|
|
Joins("INNER JOIN marketing_delivery_products mdp ON mdp.marketing_product_id = mp.id").
|
|
|
|
|
Where("m.customer_id IN ?", customerIDs).
|
|
|
|
|
Where("m.deleted_at IS NULL").
|
|
|
|
|
Where("DATE(m.so_date) < ?", startDate).
|
|
|
|
|
Where("(SELECT step_number FROM approvals WHERE approvable_type = 'MARKETINGS' AND approvable_id = mp.marketing_id ORDER BY id DESC LIMIT 1) >= ?", uint16(utils.MarketingDeliveryOrder))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(filters.SalesIDs) > 0 {
|
|
|
|
|
db = db.Where("m.sales_person_id IN ?", filters.SalesIDs)
|
|
|
|
@@ -318,28 +332,46 @@ func (r *balanceMonitoringRepositoryImpl) GetSalesByCategoryInPeriod(ctx context
|
|
|
|
|
return map[uint]BalanceMonitoringCategoryRow{}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dateColumn := resolveBalanceMonitoringDateColumn(filters.FilterBy)
|
|
|
|
|
// Gunakan data DO (mdp) bukan SO (mp) agar nominal/qty/kg mencerminkan nilai aktual DO
|
|
|
|
|
const selectCols = `m.customer_id AS customer_id,
|
|
|
|
|
COALESCE(SUM(CASE WHEN m.marketing_type IN ('AYAM','AYAM_PULLET') THEN (mdp.usage_qty + mdp.pending_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 + mdp.pending_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 + mdp.pending_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`
|
|
|
|
|
|
|
|
|
|
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" {
|
|
|
|
|
// realized_at: FROM mdp langsung, filter by delivery_date in period — data DO
|
|
|
|
|
db = r.db.WithContext(ctx).
|
|
|
|
|
Table("marketing_delivery_products mdp").
|
|
|
|
|
Select(selectCols).
|
|
|
|
|
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("DATE(mdp.delivery_date) >= ?", startDate).
|
|
|
|
|
Where("DATE(mdp.delivery_date) <= ?", endDate)
|
|
|
|
|
} else {
|
|
|
|
|
// sold_at: SO-date dalam period DAN approval terbaru DO — JOIN mdp untuk data DO
|
|
|
|
|
db = r.db.WithContext(ctx).
|
|
|
|
|
Table("marketing_products mp").
|
|
|
|
|
Select(selectCols).
|
|
|
|
|
Joins("INNER JOIN marketings m ON m.id = mp.marketing_id").
|
|
|
|
|
Joins("INNER JOIN marketing_delivery_products mdp ON mdp.marketing_product_id = mp.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("(SELECT step_number FROM approvals WHERE approvable_type = 'MARKETINGS' AND approvable_id = mp.marketing_id ORDER BY id DESC LIMIT 1) >= ?", uint16(utils.MarketingDeliveryOrder))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(filters.SalesIDs) > 0 {
|
|
|
|
|
db = db.Where("m.sales_person_id IN ?", filters.SalesIDs)
|
|
|
|
|