product performance grouped kpi improvements

This commit is contained in:
M_Kececi
2026-07-03 05:25:05 +03:00
parent 5288f19976
commit fd086d668f
2 changed files with 145 additions and 4 deletions
+52 -4
View File
@@ -398,12 +398,24 @@ CREATE TABLE IF NOT EXISTS mk_product_performance_stock_daily (
` `
CREATE TABLE IF NOT EXISTS mk_product_performance_price_dim ( CREATE TABLE IF NOT EXISTS mk_product_performance_price_dim (
product_code TEXT PRIMARY KEY, product_code TEXT PRIMARY KEY,
item_description TEXT NOT NULL DEFAULT '',
kategori TEXT NOT NULL DEFAULT '',
askili_yan TEXT NOT NULL DEFAULT '',
urun_ilk_grubu TEXT NOT NULL DEFAULT '',
urun_ana_grubu TEXT NOT NULL DEFAULT '',
urun_alt_grubu TEXT NOT NULL DEFAULT '',
cost_price_usd NUMERIC(18,6) NOT NULL DEFAULT 0, cost_price_usd NUMERIC(18,6) NOT NULL DEFAULT 0,
base_price_usd NUMERIC(18,6) NOT NULL DEFAULT 0, base_price_usd NUMERIC(18,6) NOT NULL DEFAULT 0,
base_price_try NUMERIC(18,6) NOT NULL DEFAULT 0, base_price_try NUMERIC(18,6) NOT NULL DEFAULT 0,
last_pricing_date DATE, last_pricing_date DATE,
updated_at TIMESTAMPTZ NOT NULL DEFAULT now() updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
)`, )`,
`ALTER TABLE mk_product_performance_price_dim ADD COLUMN IF NOT EXISTS item_description TEXT NOT NULL DEFAULT ''`,
`ALTER TABLE mk_product_performance_price_dim ADD COLUMN IF NOT EXISTS kategori TEXT NOT NULL DEFAULT ''`,
`ALTER TABLE mk_product_performance_price_dim ADD COLUMN IF NOT EXISTS askili_yan TEXT NOT NULL DEFAULT ''`,
`ALTER TABLE mk_product_performance_price_dim ADD COLUMN IF NOT EXISTS urun_ilk_grubu TEXT NOT NULL DEFAULT ''`,
`ALTER TABLE mk_product_performance_price_dim ADD COLUMN IF NOT EXISTS urun_ana_grubu TEXT NOT NULL DEFAULT ''`,
`ALTER TABLE mk_product_performance_price_dim ADD COLUMN IF NOT EXISTS urun_alt_grubu TEXT NOT NULL DEFAULT ''`,
` `
CREATE TABLE IF NOT EXISTS mk_product_performance_kpi_daily ( CREATE TABLE IF NOT EXISTS mk_product_performance_kpi_daily (
kpi_date DATE NOT NULL, kpi_date DATE NOT NULL,
@@ -918,25 +930,37 @@ func refreshProductPerformancePrices(ctx context.Context, tx *sql.Tx, productPre
count := 0 count := 0
for rows.Next() { for rows.Next() {
var code string var code string
var itemDescription, kategori, askiliYan, urunIlkGrubu, urunAnaGrubu, urunAltGrubu string
var cost, usd, tryPrice float64 var cost, usd, tryPrice float64
var lastPricing sql.NullTime var lastPricing sql.NullTime
if err := rows.Scan(&code, &cost, &usd, &tryPrice, &lastPricing); err != nil { if err := rows.Scan(&code, &itemDescription, &kategori, &askiliYan, &urunIlkGrubu, &urunAnaGrubu, &urunAltGrubu, &cost, &usd, &tryPrice, &lastPricing); err != nil {
return err return err
} }
askiliYan = cleanProductPerformanceOptionalAttr(askiliYan)
urunIlkGrubu = cleanProductPerformanceFirstGroup(urunIlkGrubu)
var lp any var lp any
if lastPricing.Valid { if lastPricing.Valid {
lp = lastPricing.Time lp = lastPricing.Time
} }
if _, err := tx.ExecContext(ctx, ` if _, err := tx.ExecContext(ctx, `
INSERT INTO mk_product_performance_price_dim (product_code, cost_price_usd, base_price_usd, base_price_try, last_pricing_date, updated_at) INSERT INTO mk_product_performance_price_dim (
VALUES ($1,$2,$3,$4,$5,now()) product_code, item_description, kategori, askili_yan, urun_ilk_grubu, urun_ana_grubu, urun_alt_grubu,
cost_price_usd, base_price_usd, base_price_try, last_pricing_date, updated_at
)
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,now())
ON CONFLICT (product_code) DO UPDATE SET ON CONFLICT (product_code) DO UPDATE SET
item_description=EXCLUDED.item_description,
kategori=EXCLUDED.kategori,
askili_yan=EXCLUDED.askili_yan,
urun_ilk_grubu=EXCLUDED.urun_ilk_grubu,
urun_ana_grubu=EXCLUDED.urun_ana_grubu,
urun_alt_grubu=EXCLUDED.urun_alt_grubu,
cost_price_usd=EXCLUDED.cost_price_usd, cost_price_usd=EXCLUDED.cost_price_usd,
base_price_usd=EXCLUDED.base_price_usd, base_price_usd=EXCLUDED.base_price_usd,
base_price_try=EXCLUDED.base_price_try, base_price_try=EXCLUDED.base_price_try,
last_pricing_date=EXCLUDED.last_pricing_date, last_pricing_date=EXCLUDED.last_pricing_date,
updated_at=now() updated_at=now()
`, strings.TrimSpace(code), cost, usd, tryPrice, lp); err != nil { `, strings.TrimSpace(code), strings.TrimSpace(itemDescription), strings.TrimSpace(kategori), askiliYan, urunIlkGrubu, strings.TrimSpace(urunAnaGrubu), strings.TrimSpace(urunAltGrubu), cost, usd, tryPrice, lp); err != nil {
return err return err
} }
count++ count++
@@ -959,6 +983,30 @@ func RebuildProductPerformanceKPI(ctx context.Context, exec interface {
if err != nil { if err != nil {
return 0, err return 0, err
} }
if _, err := exec.ExecContext(ctx, `
UPDATE mk_product_performance_kpi_daily k
SET
item_description = CASE WHEN btrim(COALESCE(k.item_description,'')) = '' THEN COALESCE(NULLIF(p.item_description,''), k.item_description) ELSE k.item_description END,
kategori = CASE WHEN btrim(COALESCE(k.kategori,'')) = '' OR btrim(COALESCE(k.kategori,'')) = '-' THEN COALESCE(NULLIF(p.kategori,''), '') ELSE k.kategori END,
askili_yan = CASE WHEN btrim(COALESCE(k.askili_yan,'')) = '' OR btrim(COALESCE(k.askili_yan,'')) = '-' THEN COALESCE(NULLIF(NULLIF(p.askili_yan,''), '-'), '') ELSE k.askili_yan END,
urun_ilk_grubu = CASE WHEN btrim(COALESCE(k.urun_ilk_grubu,'')) = '' OR btrim(COALESCE(k.urun_ilk_grubu,'')) = '-' THEN COALESCE(NULLIF(p.urun_ilk_grubu,''), '') ELSE k.urun_ilk_grubu END,
urun_ana_grubu = CASE WHEN btrim(COALESCE(k.urun_ana_grubu,'')) = '' THEN COALESCE(NULLIF(p.urun_ana_grubu,''), k.urun_ana_grubu) ELSE k.urun_ana_grubu END,
urun_alt_grubu = CASE WHEN btrim(COALESCE(k.urun_alt_grubu,'')) = '' THEN COALESCE(NULLIF(p.urun_alt_grubu,''), k.urun_alt_grubu) ELSE k.urun_alt_grubu END,
updated_at = now()
FROM mk_product_performance_price_dim p
WHERE k.kpi_date = $1
AND p.product_code = k.product_code
AND (
btrim(COALESCE(k.item_description,'')) = ''
OR btrim(COALESCE(k.kategori,'')) IN ('', '-')
OR btrim(COALESCE(k.askili_yan,'')) IN ('', '-')
OR btrim(COALESCE(k.urun_ilk_grubu,'')) IN ('', '-')
OR btrim(COALESCE(k.urun_ana_grubu,'')) = ''
OR btrim(COALESCE(k.urun_alt_grubu,'')) = ''
)
`, kpiDate); err != nil {
return 0, err
}
n, _ := res.RowsAffected() n, _ := res.RowsAffected()
return int(n), nil return int(n), nil
} }
+93
View File
@@ -382,6 +382,22 @@ ORDER BY StockDate, ProductCode, ColorCode, YakaKodu
func productPerformancePriceSQL() string { func productPerformancePriceSQL() string {
return ` return `
;WITH ProductCodes AS ( ;WITH ProductCodes AS (
SELECT DISTINCT ItemCode
FROM cdItem WITH(NOLOCK)
WHERE ItemTypeCode = 1
AND (
LEN(LTRIM(RTRIM(ItemCode))) = 13
AND (
ItemCode LIKE 'S%'
OR ItemCode LIKE 'O%'
OR ItemCode LIKE 'N%'
OR ItemCode LIKE 'X%'
OR ItemCode LIKE 'I%'
OR ItemCode LIKE 'A%'
)
)
AND (@p1 = '' OR ItemCode LIKE @p1 + '%')
UNION
SELECT DISTINCT ItemCode SELECT DISTINCT ItemCode
FROM trPriceListLine WITH(NOLOCK) FROM trPriceListLine WITH(NOLOCK)
WHERE ItemTypeCode = 1 WHERE ItemTypeCode = 1
@@ -460,6 +476,83 @@ Cost AS (
) )
SELECT SELECT
pc.ItemCode, pc.ItemCode,
ItemDescription = dbo.HG_Temizlik(ISNULL((
SELECT ItemDescription
FROM cdItemDesc WITH(NOLOCK)
WHERE cdItemDesc.ItemTypeCode = 1
AND cdItemDesc.ItemCode = pc.ItemCode
AND cdItemDesc.LangCode = 'TR'
), SPACE(0))),
Kategori = dbo.HG_Temizlik(ISNULL((
SELECT AttributeDescription
FROM cdItemAttributeDesc WITH(NOLOCK)
WHERE cdItemAttributeDesc.ItemTypeCode = 1
AND cdItemAttributeDesc.AttributeTypeCode = 44
AND cdItemAttributeDesc.AttributeCode = (
SELECT TOP 1 AttributeCode
FROM prItemAttribute WITH(NOLOCK)
WHERE AttributeTypeCode = 44
AND prItemAttribute.ItemTypeCode = 1
AND prItemAttribute.ItemCode = pc.ItemCode
)
AND cdItemAttributeDesc.LangCode = 'TR'
), SPACE(0))),
AskiliYan = dbo.HG_Temizlik(ISNULL((
SELECT AttributeDescription
FROM cdItemAttributeDesc WITH(NOLOCK)
WHERE cdItemAttributeDesc.ItemTypeCode = 1
AND cdItemAttributeDesc.AttributeTypeCode = 45
AND cdItemAttributeDesc.AttributeCode = (
SELECT TOP 1 AttributeCode
FROM prItemAttribute WITH(NOLOCK)
WHERE AttributeTypeCode = 45
AND prItemAttribute.ItemTypeCode = 1
AND prItemAttribute.ItemCode = pc.ItemCode
)
AND cdItemAttributeDesc.LangCode = 'TR'
), SPACE(0))),
UrunIlkGrubu = dbo.HG_Temizlik(ISNULL((
SELECT AttributeDescription
FROM cdItemAttributeDesc WITH(NOLOCK)
WHERE cdItemAttributeDesc.ItemTypeCode = 1
AND cdItemAttributeDesc.AttributeTypeCode = 42
AND cdItemAttributeDesc.AttributeCode = (
SELECT TOP 1 AttributeCode
FROM prItemAttribute WITH(NOLOCK)
WHERE AttributeTypeCode = 42
AND prItemAttribute.ItemTypeCode = 1
AND prItemAttribute.ItemCode = pc.ItemCode
)
AND cdItemAttributeDesc.LangCode = 'TR'
), SPACE(0))),
UrunAnaGrubu = dbo.HG_Temizlik(ISNULL((
SELECT AttributeDescription
FROM cdItemAttributeDesc WITH(NOLOCK)
WHERE cdItemAttributeDesc.ItemTypeCode = 1
AND cdItemAttributeDesc.AttributeTypeCode = 1
AND cdItemAttributeDesc.AttributeCode = (
SELECT TOP 1 AttributeCode
FROM prItemAttribute WITH(NOLOCK)
WHERE AttributeTypeCode = 1
AND prItemAttribute.ItemTypeCode = 1
AND prItemAttribute.ItemCode = pc.ItemCode
)
AND cdItemAttributeDesc.LangCode = 'TR'
), SPACE(0))),
UrunAltGrubu = dbo.HG_Temizlik(ISNULL((
SELECT AttributeDescription
FROM cdItemAttributeDesc WITH(NOLOCK)
WHERE cdItemAttributeDesc.ItemTypeCode = 1
AND cdItemAttributeDesc.AttributeTypeCode = 2
AND cdItemAttributeDesc.AttributeCode = (
SELECT TOP 1 AttributeCode
FROM prItemAttribute WITH(NOLOCK)
WHERE AttributeTypeCode = 2
AND prItemAttribute.ItemTypeCode = 1
AND prItemAttribute.ItemCode = pc.ItemCode
)
AND cdItemAttributeDesc.LangCode = 'TR'
), SPACE(0))),
CostPriceUsd = ISNULL(c.CostPriceUsd, 0), CostPriceUsd = ISNULL(c.CostPriceUsd, 0),
BasePriceUsd = ISNULL(bp.BasePriceUsd, 0), BasePriceUsd = ISNULL(bp.BasePriceUsd, 0),
BasePriceTry = ISNULL(bp.BasePriceTry, 0), BasePriceTry = ISNULL(bp.BasePriceTry, 0),