product performance grouped kpi improvements
This commit is contained in:
@@ -349,7 +349,12 @@ CREATE TABLE IF NOT EXISTS mk_product_performance_sales_daily (
|
||||
`
|
||||
UPDATE mk_product_performance_sales_daily
|
||||
SET urun_ilk_grubu = '', updated_at = now()
|
||||
WHERE upper(translate(btrim(urun_ilk_grubu), 'İŞĞÜÖÇ', 'ISGUOC')) IN ('YETISKIN', 'YETISKIN/GARSON', 'GARSON')`,
|
||||
WHERE btrim(urun_ilk_grubu) = '-'
|
||||
OR upper(translate(btrim(urun_ilk_grubu), 'İŞĞÜÖÇ', 'ISGUOC')) IN ('YETISKIN', 'YETISKIN/GARSON', 'GARSON')`,
|
||||
`
|
||||
UPDATE mk_product_performance_sales_daily
|
||||
SET askili_yan = '', updated_at = now()
|
||||
WHERE btrim(askili_yan) = '-'`,
|
||||
`
|
||||
DO $$
|
||||
BEGIN
|
||||
@@ -464,7 +469,12 @@ CREATE TABLE IF NOT EXISTS mk_product_performance_kpi_daily (
|
||||
`
|
||||
UPDATE mk_product_performance_kpi_daily
|
||||
SET urun_ilk_grubu = '', updated_at = now()
|
||||
WHERE upper(translate(btrim(urun_ilk_grubu), 'İŞĞÜÖÇ', 'ISGUOC')) IN ('YETISKIN', 'YETISKIN/GARSON', 'GARSON')`,
|
||||
WHERE btrim(urun_ilk_grubu) = '-'
|
||||
OR upper(translate(btrim(urun_ilk_grubu), 'İŞĞÜÖÇ', 'ISGUOC')) IN ('YETISKIN', 'YETISKIN/GARSON', 'GARSON')`,
|
||||
`
|
||||
UPDATE mk_product_performance_kpi_daily
|
||||
SET askili_yan = '', updated_at = now()
|
||||
WHERE btrim(askili_yan) = '-'`,
|
||||
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS sales_qty_180d NUMERIC(18,4) NOT NULL DEFAULT 0`,
|
||||
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS sales_usd_180d NUMERIC(18,4) NOT NULL DEFAULT 0`,
|
||||
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS avg_daily_sales_180d NUMERIC(18,6) NOT NULL DEFAULT 0`,
|
||||
@@ -675,6 +685,7 @@ func refreshProductPerformanceSales(ctx context.Context, tx *sql.Tx, startDate,
|
||||
); err != nil {
|
||||
return count, err
|
||||
}
|
||||
r.AskiliYan = cleanProductPerformanceOptionalAttr(r.AskiliYan)
|
||||
r.UrunIlkGrubu = cleanProductPerformanceFirstGroup(r.UrunIlkGrubu)
|
||||
if _, err := tx.ExecContext(ctx, `
|
||||
INSERT INTO mk_product_performance_sales_daily (
|
||||
@@ -1112,7 +1123,7 @@ SalesAgg AS (
|
||||
MAX(kategori) AS kategori,
|
||||
MAX(seri) AS seri,
|
||||
MAX(yas_grubu) AS yas_grubu,
|
||||
MAX(askili_yan) AS askili_yan,
|
||||
COALESCE(MAX(NULLIF(askili_yan, '-')), '') AS askili_yan,
|
||||
MAX(urun_ilk_grubu) AS urun_ilk_grubu,
|
||||
MAX(urun_ana_grubu) AS urun_ana_grubu,
|
||||
MAX(urun_alt_grubu) AS urun_alt_grubu,
|
||||
@@ -1146,7 +1157,7 @@ Dim AS (
|
||||
COALESCE(kategori,'') AS kategori,
|
||||
seri,
|
||||
yas_grubu,
|
||||
askili_yan,
|
||||
CASE WHEN btrim(COALESCE(askili_yan,'')) = '-' THEN '' ELSE COALESCE(askili_yan,'') END AS askili_yan,
|
||||
urun_ilk_grubu,
|
||||
urun_ana_grubu,
|
||||
urun_alt_grubu
|
||||
@@ -1175,7 +1186,7 @@ Dim AS (
|
||||
MAX(kategori) AS kategori,
|
||||
MAX(seri) AS seri,
|
||||
MAX(yas_grubu) AS yas_grubu,
|
||||
MAX(askili_yan) AS askili_yan,
|
||||
COALESCE(MAX(NULLIF(askili_yan, '-')), '') AS askili_yan,
|
||||
MAX(urun_ilk_grubu) AS urun_ilk_grubu,
|
||||
MAX(urun_ana_grubu) AS urun_ana_grubu,
|
||||
MAX(urun_alt_grubu) AS urun_alt_grubu,
|
||||
@@ -1195,7 +1206,7 @@ StockOnly AS (
|
||||
COALESCE(MAX(d.kategori),'') AS kategori,
|
||||
COALESCE(MAX(d.seri),'') AS seri,
|
||||
COALESCE(MAX(d.yas_grubu),'') AS yas_grubu,
|
||||
COALESCE(MAX(d.askili_yan),'') AS askili_yan,
|
||||
COALESCE(MAX(NULLIF(d.askili_yan, '-')),'') AS askili_yan,
|
||||
COALESCE(MAX(d.urun_ilk_grubu),'') AS urun_ilk_grubu,
|
||||
COALESCE(MAX(d.urun_ana_grubu),'') AS urun_ana_grubu,
|
||||
COALESCE(MAX(d.urun_alt_grubu),'') AS urun_alt_grubu,
|
||||
@@ -1542,7 +1553,7 @@ SELECT TOP (@p1)
|
||||
Kategori = MAX(o.Kategori),
|
||||
Seri = MAX(o.Seri),
|
||||
YasGrubu = MAX(o.YasGrubu),
|
||||
AskiliYan = MAX(o.AskiliYan),
|
||||
AskiliYan = ISNULL(NULLIF(MAX(o.AskiliYan), '-'), ''),
|
||||
UrunIlkGrubu = MAX(o.UrunIlkGrubu),
|
||||
UrunAnaGrubu = MAX(o.UrunAnaGrubu),
|
||||
UrunAltGrubu = MAX(o.UrunAltGrubu),
|
||||
@@ -1585,6 +1596,7 @@ ORDER BY SUM(o.AmountUSD) DESC, SUM(o.Qty) DESC, o.ProductCode, o.ColorCode, o.Y
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r.AskiliYan = cleanProductPerformanceOptionalAttr(r.AskiliYan)
|
||||
out = append(out, r)
|
||||
if !seenProducts[r.ProductCode] {
|
||||
seenProducts[r.ProductCode] = true
|
||||
@@ -1622,8 +1634,9 @@ ORDER BY SUM(o.AmountUSD) DESC, SUM(o.Qty) DESC, o.ProductCode, o.ColorCode, o.Y
|
||||
if strings.TrimSpace(row.Kategori) == "" {
|
||||
row.Kategori = attr.kategori
|
||||
}
|
||||
row.AskiliYan = cleanProductPerformanceOptionalAttr(row.AskiliYan)
|
||||
if strings.TrimSpace(row.AskiliYan) == "" {
|
||||
row.AskiliYan = attr.askiliYan
|
||||
row.AskiliYan = cleanProductPerformanceOptionalAttr(attr.askiliYan)
|
||||
}
|
||||
if strings.TrimSpace(row.UrunIlkGrubu) == "" {
|
||||
row.UrunIlkGrubu = attr.urunIlkGrubu
|
||||
@@ -2003,7 +2016,7 @@ ORDER BY SUM(AmountUSD) DESC, SUM(Qty) DESC
|
||||
row.ItemDescription = attr.itemDescription
|
||||
}
|
||||
row.Kategori = attr.kategori
|
||||
row.AskiliYan = attr.askiliYan
|
||||
row.AskiliYan = cleanProductPerformanceOptionalAttr(attr.askiliYan)
|
||||
row.UrunIlkGrubu = attr.urunIlkGrubu
|
||||
row.UrunAnaGrubu = attr.urunAnaGrubu
|
||||
row.UrunAltGrubu = attr.urunAltGrubu
|
||||
@@ -2147,7 +2160,7 @@ SELECT
|
||||
MAX(kategori) AS kategori,
|
||||
MAX(seri) AS seri,
|
||||
MAX(yas_grubu) AS yas_grubu,
|
||||
MAX(askili_yan) AS askili_yan,
|
||||
COALESCE(MAX(NULLIF(askili_yan, '-')), '') AS askili_yan,
|
||||
MAX(urun_ilk_grubu) AS urun_ilk_grubu,
|
||||
MAX(urun_ana_grubu) AS urun_ana_grubu,
|
||||
MAX(urun_alt_grubu) AS urun_alt_grubu,
|
||||
@@ -2335,8 +2348,8 @@ func ListProductPerformanceSalesBreakdown(ctx context.Context, pg *sql.DB, break
|
||||
"yaka_kodu": "s.yaka_kodu",
|
||||
"item_description": "MAX(s.item_description)",
|
||||
"kategori": "COALESCE(MAX(s.kategori),'')",
|
||||
"askili_yan": "MAX(s.askili_yan)",
|
||||
"urun_ilk_grubu": "COALESCE(MAX(CASE WHEN upper(translate(btrim(COALESCE(s.urun_ilk_grubu,'')), 'İŞĞÜÖÇ', 'ISGUOC')) IN ('YETISKIN', 'YETISKIN/GARSON', 'GARSON') THEN '' ELSE s.urun_ilk_grubu END),'')",
|
||||
"askili_yan": "COALESCE(MAX(CASE WHEN btrim(COALESCE(s.askili_yan,'')) = '-' THEN '' ELSE s.askili_yan END),'')",
|
||||
"urun_ilk_grubu": "COALESCE(MAX(CASE WHEN btrim(COALESCE(s.urun_ilk_grubu,'')) = '-' THEN '' WHEN upper(translate(btrim(COALESCE(s.urun_ilk_grubu,'')), 'İŞĞÜÖÇ', 'ISGUOC')) IN ('YETISKIN', 'YETISKIN/GARSON', 'GARSON') THEN '' ELSE s.urun_ilk_grubu END),'')",
|
||||
"urun_ana_grubu": "COALESCE(MAX(s.urun_ana_grubu),'')",
|
||||
"urun_alt_grubu": "MAX(s.urun_alt_grubu)",
|
||||
"market_key": "s.market_key",
|
||||
@@ -2363,7 +2376,7 @@ func ListProductPerformanceSalesBreakdown(ctx context.Context, pg *sql.DB, break
|
||||
selected["market_key"] = true
|
||||
selected["customer_code"] = true
|
||||
selected["customer_name"] = true
|
||||
groupCols = []string{"CASE WHEN upper(translate(btrim(COALESCE(s.urun_ilk_grubu,'')), 'İŞĞÜÖÇ', 'ISGUOC')) IN ('YETISKIN', 'YETISKIN/GARSON', 'GARSON') THEN '' ELSE s.urun_ilk_grubu END", "s.color_code", "s.yaka_kodu", "s.askili_yan", "s.kategori", "s.urun_ana_grubu", "s.urun_alt_grubu", "s.product_code", "s.customer_country", "s.market_key", "s.customer_segment", "s.customer_code"}
|
||||
groupCols = []string{"CASE WHEN btrim(COALESCE(s.urun_ilk_grubu,'')) = '-' THEN '' WHEN upper(translate(btrim(COALESCE(s.urun_ilk_grubu,'')), 'İŞĞÜÖÇ', 'ISGUOC')) IN ('YETISKIN', 'YETISKIN/GARSON', 'GARSON') THEN '' ELSE s.urun_ilk_grubu END", "s.color_code", "s.yaka_kodu", "CASE WHEN btrim(COALESCE(s.askili_yan,'')) = '-' THEN '' ELSE s.askili_yan END", "s.kategori", "s.urun_ana_grubu", "s.urun_alt_grubu", "s.product_code", "s.customer_country", "s.market_key", "s.customer_segment", "s.customer_code"}
|
||||
case "product_country_segment_market_customer":
|
||||
selected["product_code"] = true
|
||||
selected["item_description"] = true
|
||||
@@ -2426,7 +2439,7 @@ func ListProductPerformanceSalesBreakdown(ctx context.Context, pg *sql.DB, break
|
||||
selected["market_key"] = true
|
||||
selected["customer_code"] = true
|
||||
selected["customer_name"] = true
|
||||
groupCols = []string{"CASE WHEN upper(translate(btrim(COALESCE(s.urun_ilk_grubu,'')), 'İŞĞÜÖÇ', 'ISGUOC')) IN ('YETISKIN', 'YETISKIN/GARSON', 'GARSON') THEN '' ELSE s.urun_ilk_grubu END", "s.color_code", "s.yaka_kodu", "s.askili_yan", "s.kategori", "s.urun_ana_grubu", "s.urun_alt_grubu", "s.product_code", "s.customer_country", "s.market_key", "s.customer_segment", "s.customer_code"}
|
||||
groupCols = []string{"CASE WHEN btrim(COALESCE(s.urun_ilk_grubu,'')) = '-' THEN '' WHEN upper(translate(btrim(COALESCE(s.urun_ilk_grubu,'')), 'İŞĞÜÖÇ', 'ISGUOC')) IN ('YETISKIN', 'YETISKIN/GARSON', 'GARSON') THEN '' ELSE s.urun_ilk_grubu END", "s.color_code", "s.yaka_kodu", "CASE WHEN btrim(COALESCE(s.askili_yan,'')) = '-' THEN '' ELSE s.askili_yan END", "s.kategori", "s.urun_ana_grubu", "s.urun_alt_grubu", "s.product_code", "s.customer_country", "s.market_key", "s.customer_segment", "s.customer_code"}
|
||||
}
|
||||
|
||||
selectExpr := func(name string) string {
|
||||
@@ -2443,8 +2456,9 @@ WITH LatestKPI AS (
|
||||
color_code,
|
||||
yaka_kodu,
|
||||
COALESCE(kategori,'') AS kategori,
|
||||
askili_yan,
|
||||
CASE WHEN btrim(COALESCE(askili_yan,'')) = '-' THEN '' ELSE COALESCE(askili_yan,'') END AS askili_yan,
|
||||
CASE
|
||||
WHEN btrim(COALESCE(urun_ilk_grubu,'')) = '-' THEN ''
|
||||
WHEN upper(translate(btrim(COALESCE(urun_ilk_grubu,'')), 'İŞĞÜÖÇ', 'ISGUOC')) IN ('YETISKIN', 'YETISKIN/GARSON', 'GARSON') THEN ''
|
||||
ELSE COALESCE(urun_ilk_grubu,'')
|
||||
END AS urun_ilk_grubu,
|
||||
@@ -2799,7 +2813,7 @@ func ListProductPerformanceGrouped(ctx context.Context, pg *sql.DB, req ProductP
|
||||
return nil, err
|
||||
}
|
||||
out := make([]map[string]any, 0, len(sourceRows))
|
||||
appendProductPerformanceGroupedRows(&out, sourceRows, levels, 0, []string{"tab:" + req.Mode}, req.ExpandedKeys)
|
||||
appendProductPerformanceGroupedRows(&out, sourceRows, levels, 0, 0, []string{"tab:" + req.Mode}, req.ExpandedKeys)
|
||||
return out, nil
|
||||
}
|
||||
|
||||
@@ -2817,11 +2831,11 @@ func listProductPerformanceGroupedSQL(ctx context.Context, pg *sql.DB, req Produ
|
||||
return nil, true, err
|
||||
}
|
||||
out := make([]map[string]any, 0, 512)
|
||||
err := appendProductPerformanceGroupedSQLRows(ctx, pg, &out, mode, levels, 0, []string{"tab:" + mode}, nil, req.ExpandedKeys, req.Limit)
|
||||
err := appendProductPerformanceGroupedSQLRows(ctx, pg, &out, mode, levels, 0, 0, []string{"tab:" + mode}, nil, req.ExpandedKeys, req.Limit)
|
||||
return out, true, err
|
||||
}
|
||||
|
||||
func appendProductPerformanceGroupedSQLRows(ctx context.Context, pg *sql.DB, out *[]map[string]any, mode string, levels []string, level int, parentKeys []string, filters []productPerformanceSQLGroupFilter, expandedKeys map[string]bool, limit int) error {
|
||||
func appendProductPerformanceGroupedSQLRows(ctx context.Context, pg *sql.DB, out *[]map[string]any, mode string, levels []string, level int, visualLevel int, parentKeys []string, filters []productPerformanceSQLGroupFilter, expandedKeys map[string]bool, limit int) error {
|
||||
if level >= len(levels) {
|
||||
rows, err := queryProductPerformanceSQLLeafRows(ctx, pg, mode, filters, limit)
|
||||
if err != nil {
|
||||
@@ -2838,11 +2852,18 @@ func appendProductPerformanceGroupedSQLRows(ctx context.Context, pg *sql.DB, out
|
||||
}
|
||||
for _, row := range rows {
|
||||
value := stringFromMap(row, "group_value")
|
||||
if shouldSkipProductPerformanceGroupValue(field, value) {
|
||||
nextFilters := append(append([]productPerformanceSQLGroupFilter{}, filters...), productPerformanceSQLGroupFilter{Field: field, Value: value})
|
||||
if err := appendProductPerformanceGroupedSQLRows(ctx, pg, out, mode, levels, level+1, visualLevel, parentKeys, nextFilters, expandedKeys, limit); err != nil {
|
||||
return err
|
||||
}
|
||||
continue
|
||||
}
|
||||
keyPart := field + ":" + value
|
||||
key := strings.Join(append(parentKeys, keyPart), "|")
|
||||
row["row_key"] = "group|" + key
|
||||
row["key"] = key
|
||||
row["level"] = level
|
||||
row["level"] = visualLevel
|
||||
row["group_field"] = field
|
||||
row["group_value"] = value
|
||||
row["label"] = value
|
||||
@@ -2851,7 +2872,7 @@ func appendProductPerformanceGroupedSQLRows(ctx context.Context, pg *sql.DB, out
|
||||
*out = append(*out, row)
|
||||
if expandedKeys[key] {
|
||||
nextFilters := append(append([]productPerformanceSQLGroupFilter{}, filters...), productPerformanceSQLGroupFilter{Field: field, Value: value})
|
||||
if err := appendProductPerformanceGroupedSQLRows(ctx, pg, out, mode, levels, level+1, append(parentKeys, keyPart), nextFilters, expandedKeys, limit); err != nil {
|
||||
if err := appendProductPerformanceGroupedSQLRows(ctx, pg, out, mode, levels, level+1, visualLevel+1, append(parentKeys, keyPart), nextFilters, expandedKeys, limit); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -2931,7 +2952,7 @@ FROM (
|
||||
COALESCE((ARRAY_AGG(NULLIF(yaka_kodu,'') ORDER BY performance_score DESC NULLS LAST))[1], '') AS yaka_kodu,
|
||||
COALESCE((ARRAY_AGG(NULLIF(item_description,'') ORDER BY performance_score DESC NULLS LAST))[1], '') AS item_description,
|
||||
COALESCE((ARRAY_AGG(NULLIF(kategori,'') ORDER BY performance_score DESC NULLS LAST))[1], '') AS kategori,
|
||||
COALESCE((ARRAY_AGG(NULLIF(askili_yan,'') ORDER BY performance_score DESC NULLS LAST))[1], '') AS askili_yan,
|
||||
COALESCE((ARRAY_AGG(NULLIF(NULLIF(askili_yan,''), '-') ORDER BY performance_score DESC NULLS LAST))[1], '') AS askili_yan,
|
||||
COALESCE((ARRAY_AGG(NULLIF(urun_ilk_grubu,'') ORDER BY performance_score DESC NULLS LAST))[1], '') AS urun_ilk_grubu,
|
||||
COALESCE((ARRAY_AGG(NULLIF(urun_ana_grubu,'') ORDER BY performance_score DESC NULLS LAST))[1], '') AS urun_ana_grubu,
|
||||
COALESCE((ARRAY_AGG(NULLIF(urun_alt_grubu,'') ORDER BY performance_score DESC NULLS LAST))[1], '') AS urun_alt_grubu,
|
||||
@@ -3041,8 +3062,9 @@ WITH Source AS (
|
||||
kategori,
|
||||
seri,
|
||||
yas_grubu,
|
||||
askili_yan,
|
||||
CASE WHEN btrim(COALESCE(askili_yan,'')) = '-' THEN '' ELSE COALESCE(askili_yan,'') END AS askili_yan,
|
||||
CASE
|
||||
WHEN btrim(COALESCE(urun_ilk_grubu,'')) = '-' THEN ''
|
||||
WHEN upper(translate(btrim(COALESCE(urun_ilk_grubu,'')), 'İŞĞÜÖÇ', 'ISGUOC')) IN ('YETISKIN', 'YETISKIN/GARSON', 'GARSON') THEN ''
|
||||
ELSE COALESCE(urun_ilk_grubu,'')
|
||||
END AS urun_ilk_grubu,
|
||||
@@ -3085,8 +3107,10 @@ WITH Source AS (
|
||||
func productPerformanceSQLGroupExpr(field string) (string, bool) {
|
||||
switch field {
|
||||
case "urun_ilk_grubu":
|
||||
return "CASE WHEN upper(translate(btrim(COALESCE(urun_ilk_grubu,'')), 'İŞĞÜÖÇ', 'ISGUOC')) IN ('YETISKIN', 'YETISKIN/GARSON', 'GARSON') THEN '' ELSE COALESCE(urun_ilk_grubu,'') END", true
|
||||
case "kategori", "askili_yan", "urun_ana_grubu", "urun_alt_grubu", "product_code", "item_description", "color_code", "yaka_kodu":
|
||||
return "CASE WHEN btrim(COALESCE(urun_ilk_grubu,'')) = '-' THEN '' WHEN upper(translate(btrim(COALESCE(urun_ilk_grubu,'')), 'İŞĞÜÖÇ', 'ISGUOC')) IN ('YETISKIN', 'YETISKIN/GARSON', 'GARSON') THEN '' ELSE COALESCE(urun_ilk_grubu,'') END", true
|
||||
case "askili_yan":
|
||||
return "CASE WHEN btrim(COALESCE(askili_yan,'')) = '-' THEN '' ELSE COALESCE(askili_yan,'') END", true
|
||||
case "kategori", "urun_ana_grubu", "urun_alt_grubu", "product_code", "item_description", "color_code", "yaka_kodu":
|
||||
return field, true
|
||||
case "market_key":
|
||||
return "btrim(regexp_replace(COALESCE(market_key,''), '^.*\\|', ''))", true
|
||||
@@ -3095,6 +3119,15 @@ func productPerformanceSQLGroupExpr(field string) (string, bool) {
|
||||
}
|
||||
}
|
||||
|
||||
func shouldSkipProductPerformanceGroupValue(field, value string) bool {
|
||||
switch field {
|
||||
case "urun_ilk_grubu", "askili_yan":
|
||||
return strings.TrimSpace(value) == ""
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func productPerformanceSQLFilterWhere(filters []productPerformanceSQLGroupFilter) (string, []any, error) {
|
||||
if len(filters) == 0 {
|
||||
return "", nil, nil
|
||||
@@ -3172,7 +3205,7 @@ func productPerformanceIdleSourceRows(rows []map[string]any) []map[string]any {
|
||||
return out
|
||||
}
|
||||
|
||||
func appendProductPerformanceGroupedRows(out *[]map[string]any, sourceRows []map[string]any, levels []string, level int, parentKeys []string, expandedKeys map[string]bool) {
|
||||
func appendProductPerformanceGroupedRows(out *[]map[string]any, sourceRows []map[string]any, levels []string, level int, visualLevel int, parentKeys []string, expandedKeys map[string]bool) {
|
||||
if level >= len(levels) {
|
||||
*out = append(*out, sourceRows...)
|
||||
return
|
||||
@@ -3194,12 +3227,16 @@ func appendProductPerformanceGroupedRows(out *[]map[string]any, sourceRows []map
|
||||
})
|
||||
|
||||
for _, value := range values {
|
||||
groupRows := grouped[value]
|
||||
if shouldSkipProductPerformanceGroupValue(field, value) {
|
||||
appendProductPerformanceGroupedRows(out, groupRows, levels, level+1, visualLevel, parentKeys, expandedKeys)
|
||||
continue
|
||||
}
|
||||
keyPart := field + ":" + value
|
||||
key := strings.Join(append(parentKeys, keyPart), "|")
|
||||
groupRows := grouped[value]
|
||||
*out = append(*out, makeProductPerformanceGroupedRow(key, level, field, value, groupRows))
|
||||
*out = append(*out, makeProductPerformanceGroupedRow(key, visualLevel, field, value, groupRows))
|
||||
if expandedKeys[key] {
|
||||
appendProductPerformanceGroupedRows(out, groupRows, levels, level+1, append(parentKeys, keyPart), expandedKeys)
|
||||
appendProductPerformanceGroupedRows(out, groupRows, levels, level+1, visualLevel+1, append(parentKeys, keyPart), expandedKeys)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3668,6 +3705,9 @@ func stringFromMap(row map[string]any, field string) string {
|
||||
|
||||
func cleanProductPerformanceFirstGroup(value string) string {
|
||||
value = strings.TrimSpace(value)
|
||||
if value == "-" {
|
||||
return ""
|
||||
}
|
||||
normalized := strings.ToUpper(value)
|
||||
normalized = strings.NewReplacer("İ", "I", "Ş", "S", "Ğ", "G", "Ü", "U", "Ö", "O", "Ç", "C").Replace(normalized)
|
||||
switch normalized {
|
||||
@@ -3678,6 +3718,14 @@ func cleanProductPerformanceFirstGroup(value string) string {
|
||||
}
|
||||
}
|
||||
|
||||
func cleanProductPerformanceOptionalAttr(value string) string {
|
||||
value = strings.TrimSpace(value)
|
||||
if value == "-" {
|
||||
return ""
|
||||
}
|
||||
return value
|
||||
}
|
||||
|
||||
func floatFromMap(row map[string]any, field string) float64 {
|
||||
return floatFromAny(row[field])
|
||||
}
|
||||
@@ -3720,7 +3768,7 @@ FROM mk_product_performance_sales_daily
|
||||
WHERE product_code=$1
|
||||
AND color_code=$2
|
||||
AND yaka_kodu=$3
|
||||
ORDER BY sales_date DESC, sales_usd DESC
|
||||
ORDER BY sales_usd DESC, sales_date DESC
|
||||
LIMIT $4
|
||||
`, strings.TrimSpace(productCode), strings.TrimSpace(colorCode), strings.TrimSpace(yakaKodu), limit)
|
||||
if err != nil {
|
||||
@@ -3982,7 +4030,7 @@ SELECT DISTINCT ON (product_code, color_code, yaka_kodu)
|
||||
yaka_kodu,
|
||||
COALESCE(item_description,'') AS item_description,
|
||||
COALESCE(kategori,'') AS kategori,
|
||||
COALESCE(askili_yan,'') AS askili_yan,
|
||||
CASE WHEN btrim(COALESCE(askili_yan,'')) = '-' THEN '' ELSE COALESCE(askili_yan,'') END AS askili_yan,
|
||||
COALESCE(urun_ilk_grubu,'') AS urun_ilk_grubu,
|
||||
COALESCE(urun_ana_grubu,'') AS urun_ana_grubu,
|
||||
COALESCE(urun_alt_grubu,'') AS urun_alt_grubu
|
||||
@@ -4001,6 +4049,7 @@ ORDER BY product_code, color_code, yaka_kodu, performance_score DESC
|
||||
if err := rows.Scan(&productCode, &colorCode, &yakaKodu, &p.itemDescription, &p.kategori, &p.askiliYan, &p.urunIlkGrubu, &p.urunAnaGrubu, &p.urunAltGrubu); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
p.askiliYan = cleanProductPerformanceOptionalAttr(p.askiliYan)
|
||||
p.urunIlkGrubu = cleanProductPerformanceFirstGroup(p.urunIlkGrubu)
|
||||
out[productPerformanceVariantKey(productCode, colorCode, yakaKodu)] = p
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user