product performance grouped kpi improvements

This commit is contained in:
M_Kececi
2026-07-03 17:12:30 +03:00
parent 95d72ec74b
commit 9fee8c8ab2
6 changed files with 379 additions and 159 deletions
+61 -51
View File
@@ -1,57 +1,67 @@
package models package models
type ProductPerformanceRow struct { type ProductPerformanceRow struct {
KpiDate string `json:"kpi_date"` KpiDate string `json:"kpi_date"`
ProductCode string `json:"product_code"` ProductCode string `json:"product_code"`
ColorCode string `json:"color_code"` ColorCode string `json:"color_code"`
YakaKodu string `json:"yaka_kodu"` YakaKodu string `json:"yaka_kodu"`
ItemDescription string `json:"item_description"` ItemDescription string `json:"item_description"`
Kategori string `json:"kategori"` Kategori string `json:"kategori"`
Seri string `json:"seri"` Seri string `json:"seri"`
YasGrubu string `json:"yas_grubu"` YasGrubu string `json:"yas_grubu"`
AskiliYan string `json:"askili_yan"` AskiliYan string `json:"askili_yan"`
UrunIlkGrubu string `json:"urun_ilk_grubu"` UrunIlkGrubu string `json:"urun_ilk_grubu"`
UrunAnaGrubu string `json:"urun_ana_grubu"` UrunAnaGrubu string `json:"urun_ana_grubu"`
UrunAltGrubu string `json:"urun_alt_grubu"` UrunAltGrubu string `json:"urun_alt_grubu"`
MarketKey string `json:"market_key"` MarketKey string `json:"market_key"`
StockQty float64 `json:"stock_qty"` StockQty float64 `json:"stock_qty"`
SalesQty30 float64 `json:"sales_qty_30d"` SalesQty30 float64 `json:"sales_qty_30d"`
SalesQty90 float64 `json:"sales_qty_90d"` SalesQty90 float64 `json:"sales_qty_90d"`
SalesQty180 float64 `json:"sales_qty_180d"` SalesQty180 float64 `json:"sales_qty_180d"`
SalesQty365 float64 `json:"sales_qty_365d"` SalesQty365 float64 `json:"sales_qty_365d"`
SalesQty730 float64 `json:"sales_qty_730d"` SalesQty730 float64 `json:"sales_qty_730d"`
SalesUSD30 float64 `json:"sales_usd_30d"` SalesQtyTotal float64 `json:"sales_qty_total"`
SalesUSD90 float64 `json:"sales_usd_90d"` SalesUSD30 float64 `json:"sales_usd_30d"`
SalesUSD180 float64 `json:"sales_usd_180d"` SalesUSD90 float64 `json:"sales_usd_90d"`
SalesUSD365 float64 `json:"sales_usd_365d"` SalesUSD180 float64 `json:"sales_usd_180d"`
AvgDailySales90 float64 `json:"avg_daily_sales_90d"` SalesUSD365 float64 `json:"sales_usd_365d"`
AvgDailySales180 float64 `json:"avg_daily_sales_180d"` SalesUSDTotal float64 `json:"sales_usd_total"`
StockDays90 float64 `json:"stock_days_90d"` AvgDailySales90 float64 `json:"avg_daily_sales_90d"`
StockDays180 float64 `json:"stock_days_180d"` AvgDailySales180 float64 `json:"avg_daily_sales_180d"`
AvgPriceUSD90 float64 `json:"avg_price_usd_90d"` AvgDailySales365 float64 `json:"avg_daily_sales_365d"`
AvgPriceUSD180 float64 `json:"avg_price_usd_180d"` AvgDailySalesTotal float64 `json:"avg_daily_sales_total"`
CostPriceUSD float64 `json:"cost_price_usd"` StockDays90 float64 `json:"stock_days_90d"`
BasePriceUSD float64 `json:"base_price_usd"` StockDays180 float64 `json:"stock_days_180d"`
BasePriceTRY float64 `json:"base_price_try"` StockDays365 float64 `json:"stock_days_365d"`
GrossProfitUSD90 float64 `json:"gross_profit_usd_90d"` StockDaysTotal float64 `json:"stock_days_total"`
GrossProfitUSD180 float64 `json:"gross_profit_usd_180d"` StockTurnover90 float64 `json:"stock_turnover_90d"`
GrossMargin90 float64 `json:"gross_margin_90d"` StockTurnover180 float64 `json:"stock_turnover_180d"`
GrossMargin180 float64 `json:"gross_margin_180d"` StockTurnover365 float64 `json:"stock_turnover_365d"`
UnitProfitCost90 float64 `json:"unit_profit_cost_90d"` StockTurnoverTotal float64 `json:"stock_turnover_total"`
UnitProfitCost180 float64 `json:"unit_profit_cost_180d"` AvgPriceUSD90 float64 `json:"avg_price_usd_90d"`
UnitProfitBase90 float64 `json:"unit_profit_base_90d"` AvgPriceUSD180 float64 `json:"avg_price_usd_180d"`
UnitProfitBase180 float64 `json:"unit_profit_base_180d"` CostPriceUSD float64 `json:"cost_price_usd"`
MarketCount90 int `json:"market_count_90d"` BasePriceUSD float64 `json:"base_price_usd"`
CustomerCount90 int `json:"customer_count_90d"` BasePriceTRY float64 `json:"base_price_try"`
SalesIndex90 float64 `json:"sales_index_90d"` GrossProfitUSD90 float64 `json:"gross_profit_usd_90d"`
PriceIndex90 float64 `json:"price_index_90d"` GrossProfitUSD180 float64 `json:"gross_profit_usd_180d"`
MarginIndex90 float64 `json:"margin_index_90d"` GrossMargin90 float64 `json:"gross_margin_90d"`
PerformanceScore float64 `json:"performance_score"` GrossMargin180 float64 `json:"gross_margin_180d"`
PerformanceBucket string `json:"performance_bucket"` UnitProfitCost90 float64 `json:"unit_profit_cost_90d"`
Recommendation string `json:"recommendation"` UnitProfitCost180 float64 `json:"unit_profit_cost_180d"`
LastSaleDate string `json:"last_sale_date"` UnitProfitBase90 float64 `json:"unit_profit_base_90d"`
LastRefNumber string `json:"last_ref_number"` UnitProfitBase180 float64 `json:"unit_profit_base_180d"`
UpdatedAt string `json:"updated_at"` MarketCount90 int `json:"market_count_90d"`
CustomerCount90 int `json:"customer_count_90d"`
SalesIndex90 float64 `json:"sales_index_90d"`
PriceIndex90 float64 `json:"price_index_90d"`
MarginIndex90 float64 `json:"margin_index_90d"`
PerformanceScore float64 `json:"performance_score"`
PerformanceBucket string `json:"performance_bucket"`
Recommendation string `json:"recommendation"`
LastSaleDate string `json:"last_sale_date"`
LastRefNumber string `json:"last_ref_number"`
UpdatedAt string `json:"updated_at"`
} }
type ProductPerformanceSummary struct { type ProductPerformanceSummary struct {
+173 -21
View File
@@ -505,9 +505,19 @@ UPDATE mk_product_performance_kpi_daily
SET askili_yan = '', updated_at = now() SET askili_yan = '', updated_at = now()
WHERE btrim(askili_yan) = '-'`, 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_qty_180d NUMERIC(18,4) NOT NULL DEFAULT 0`,
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS sales_qty_total 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 sales_usd_180d NUMERIC(18,4) NOT NULL DEFAULT 0`,
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS sales_usd_total 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`, `ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS avg_daily_sales_180d NUMERIC(18,6) NOT NULL DEFAULT 0`,
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS avg_daily_sales_365d NUMERIC(18,6) NOT NULL DEFAULT 0`,
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS avg_daily_sales_total NUMERIC(18,6) NOT NULL DEFAULT 0`,
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS stock_days_180d NUMERIC(18,6) NOT NULL DEFAULT 0`, `ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS stock_days_180d NUMERIC(18,6) NOT NULL DEFAULT 0`,
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS stock_days_365d NUMERIC(18,6) NOT NULL DEFAULT 0`,
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS stock_days_total NUMERIC(18,6) NOT NULL DEFAULT 0`,
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS stock_turnover_90d NUMERIC(18,6) NOT NULL DEFAULT 0`,
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS stock_turnover_180d NUMERIC(18,6) NOT NULL DEFAULT 0`,
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS stock_turnover_365d NUMERIC(18,6) NOT NULL DEFAULT 0`,
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS stock_turnover_total NUMERIC(18,6) NOT NULL DEFAULT 0`,
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS avg_price_usd_180d NUMERIC(18,6) NOT NULL DEFAULT 0`, `ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS avg_price_usd_180d NUMERIC(18,6) NOT NULL DEFAULT 0`,
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS gross_profit_usd_180d NUMERIC(18,4) NOT NULL DEFAULT 0`, `ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS gross_profit_usd_180d NUMERIC(18,4) NOT NULL DEFAULT 0`,
`ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS gross_margin_180d NUMERIC(18,6) NOT NULL DEFAULT 0`, `ALTER TABLE mk_product_performance_kpi_daily ADD COLUMN IF NOT EXISTS gross_margin_180d NUMERIC(18,6) NOT NULL DEFAULT 0`,
@@ -1073,9 +1083,12 @@ func ListProductPerformance(ctx context.Context, pg *sql.DB, f ProductPerformanc
SELECT SELECT
to_char(kpi_date,'YYYY-MM-DD'), product_code, color_code, yaka_kodu, item_description, to_char(kpi_date,'YYYY-MM-DD'), product_code, color_code, yaka_kodu, item_description,
kategori, seri, yas_grubu, askili_yan, urun_ilk_grubu, urun_ana_grubu, urun_alt_grubu, market_key, stock_qty, kategori, seri, yas_grubu, askili_yan, urun_ilk_grubu, urun_ana_grubu, urun_alt_grubu, market_key, stock_qty,
sales_qty_30d, sales_qty_90d, sales_qty_180d, sales_qty_365d, sales_qty_730d, sales_qty_30d, sales_qty_90d, sales_qty_180d, sales_qty_365d, sales_qty_730d, sales_qty_total,
sales_usd_30d, sales_usd_90d, sales_usd_180d, sales_usd_365d, avg_daily_sales_90d, avg_daily_sales_180d, sales_usd_30d, sales_usd_90d, sales_usd_180d, sales_usd_365d, sales_usd_total,
stock_days_90d, stock_days_180d, avg_price_usd_90d, avg_price_usd_180d, cost_price_usd, base_price_usd, base_price_try, avg_daily_sales_90d, avg_daily_sales_180d, avg_daily_sales_365d, avg_daily_sales_total,
stock_days_90d, stock_days_180d, stock_days_365d, stock_days_total,
stock_turnover_90d, stock_turnover_180d, stock_turnover_365d, stock_turnover_total,
avg_price_usd_90d, avg_price_usd_180d, cost_price_usd, base_price_usd, base_price_try,
gross_profit_usd_90d, gross_profit_usd_180d, gross_margin_90d, gross_margin_180d, gross_profit_usd_90d, gross_profit_usd_180d, gross_margin_90d, gross_margin_180d,
unit_profit_cost_90d, unit_profit_cost_180d, unit_profit_base_90d, unit_profit_base_180d, market_count_90d, customer_count_90d, sales_index_90d, unit_profit_cost_90d, unit_profit_cost_180d, unit_profit_base_90d, unit_profit_base_180d, market_count_90d, customer_count_90d, sales_index_90d,
price_index_90d, margin_index_90d, performance_score, performance_bucket, price_index_90d, margin_index_90d, performance_score, performance_bucket,
@@ -1095,9 +1108,12 @@ LIMIT $`+fmt.Sprint(len(args)-1)+` OFFSET $`+fmt.Sprint(len(args)), args...)
if err := rows.Scan( if err := rows.Scan(
&r.KpiDate, &r.ProductCode, &r.ColorCode, &r.YakaKodu, &r.ItemDescription, &r.KpiDate, &r.ProductCode, &r.ColorCode, &r.YakaKodu, &r.ItemDescription,
&r.Kategori, &r.Seri, &r.YasGrubu, &r.AskiliYan, &r.UrunIlkGrubu, &r.UrunAnaGrubu, &r.UrunAltGrubu, &r.MarketKey, &r.StockQty, &r.Kategori, &r.Seri, &r.YasGrubu, &r.AskiliYan, &r.UrunIlkGrubu, &r.UrunAnaGrubu, &r.UrunAltGrubu, &r.MarketKey, &r.StockQty,
&r.SalesQty30, &r.SalesQty90, &r.SalesQty180, &r.SalesQty365, &r.SalesQty730, &r.SalesQty30, &r.SalesQty90, &r.SalesQty180, &r.SalesQty365, &r.SalesQty730, &r.SalesQtyTotal,
&r.SalesUSD30, &r.SalesUSD90, &r.SalesUSD180, &r.SalesUSD365, &r.AvgDailySales90, &r.AvgDailySales180, &r.SalesUSD30, &r.SalesUSD90, &r.SalesUSD180, &r.SalesUSD365, &r.SalesUSDTotal,
&r.StockDays90, &r.StockDays180, &r.AvgPriceUSD90, &r.AvgPriceUSD180, &r.CostPriceUSD, &r.BasePriceUSD, &r.BasePriceTRY, &r.AvgDailySales90, &r.AvgDailySales180, &r.AvgDailySales365, &r.AvgDailySalesTotal,
&r.StockDays90, &r.StockDays180, &r.StockDays365, &r.StockDaysTotal,
&r.StockTurnover90, &r.StockTurnover180, &r.StockTurnover365, &r.StockTurnoverTotal,
&r.AvgPriceUSD90, &r.AvgPriceUSD180, &r.CostPriceUSD, &r.BasePriceUSD, &r.BasePriceTRY,
&r.GrossProfitUSD90, &r.GrossProfitUSD180, &r.GrossMargin90, &r.GrossMargin180, &r.GrossProfitUSD90, &r.GrossProfitUSD180, &r.GrossMargin90, &r.GrossMargin180,
&r.UnitProfitCost90, &r.UnitProfitCost180, &r.UnitProfitBase90, &r.UnitProfitBase180, &r.MarketCount90, &r.CustomerCount90, &r.SalesIndex90, &r.UnitProfitCost90, &r.UnitProfitCost180, &r.UnitProfitBase90, &r.UnitProfitBase180, &r.MarketCount90, &r.CustomerCount90, &r.SalesIndex90,
&r.PriceIndex90, &r.MarginIndex90, &r.PerformanceScore, &r.PerformanceBucket, &r.PriceIndex90, &r.MarginIndex90, &r.PerformanceScore, &r.PerformanceBucket,
@@ -1232,6 +1248,16 @@ StockAgg AS (
WHERE s.stock_date = (SELECT stock_date FROM LatestStockDate) WHERE s.stock_date = (SELECT stock_date FROM LatestStockDate)
GROUP BY s.product_code, s.color_code, s.yaka_kodu GROUP BY s.product_code, s.color_code, s.yaka_kodu
), ),
StockTotalStart AS (
SELECT DISTINCT ON (s.product_code, s.color_code, s.yaka_kodu)
s.product_code,
s.color_code,
s.yaka_kodu,
s.stock_qty
FROM mk_product_performance_stock_daily s
WHERE s.stock_date <= DATE '2022-01-01'
ORDER BY s.product_code, s.color_code, s.yaka_kodu, s.stock_date DESC
),
Dim AS ( Dim AS (
SELECT DISTINCT ON (product_code, color_code, yaka_kodu) SELECT DISTINCT ON (product_code, color_code, yaka_kodu)
product_code, product_code,
@@ -1354,7 +1380,7 @@ Scored AS (
b.sales_qty_total / GREATEST(1, (Bounds.period_end - Bounds.period_start + 1)) AS avg_daily_sales_total, b.sales_qty_total / GREATEST(1, (Bounds.period_end - Bounds.period_start + 1)) AS avg_daily_sales_total,
CASE CASE
WHEN b.sales_qty_total <= 0 THEN 9999 WHEN b.sales_qty_total <= 0 THEN 9999
ELSE COALESCE(st.stock_qty, 0) / NULLIF(b.sales_qty_total / GREATEST(1, (Bounds.period_end - Bounds.period_start + 1)), 0) ELSE ((COALESCE(st_start.stock_qty, 0) + COALESCE(st.stock_qty, 0)) / 2.0) / NULLIF(b.sales_qty_total / GREATEST(1, (Bounds.period_end - Bounds.period_start + 1)), 0)
END AS stock_days_total, END AS stock_days_total,
CASE WHEN b.sales_qty_total <= 0 THEN 0 ELSE b.sales_usd_total / NULLIF(b.sales_qty_total,0) END AS avg_price_usd_total, CASE WHEN b.sales_qty_total <= 0 THEN 0 ELSE b.sales_usd_total / NULLIF(b.sales_qty_total,0) END AS avg_price_usd_total,
COALESCE(pd.cost_price_usd,0) AS cost_price_usd, COALESCE(pd.cost_price_usd,0) AS cost_price_usd,
@@ -1379,6 +1405,10 @@ Scored AS (
ON st.product_code = b.product_code ON st.product_code = b.product_code
AND st.color_code = b.color_code AND st.color_code = b.color_code
AND st.yaka_kodu = b.yaka_kodu AND st.yaka_kodu = b.yaka_kodu
LEFT JOIN StockTotalStart st_start
ON st_start.product_code = b.product_code
AND st_start.color_code = b.color_code
AND st_start.yaka_kodu = b.yaka_kodu
LEFT JOIN mk_product_performance_price_dim pd ON pd.product_code = b.product_code LEFT JOIN mk_product_performance_price_dim pd ON pd.product_code = b.product_code
LEFT JOIN Spread sp LEFT JOIN Spread sp
ON sp.product_code = b.product_code ON sp.product_code = b.product_code
@@ -2548,6 +2578,46 @@ StockAgg AS (
WHERE stock_date = (SELECT MAX(stock_date) FROM mk_product_performance_stock_daily) WHERE stock_date = (SELECT MAX(stock_date) FROM mk_product_performance_stock_daily)
GROUP BY product_code, color_code, yaka_kodu GROUP BY product_code, color_code, yaka_kodu
), ),
Stock90Start AS (
SELECT DISTINCT ON (product_code, color_code, yaka_kodu)
product_code,
color_code,
yaka_kodu,
stock_qty
FROM mk_product_performance_stock_daily
WHERE stock_date <= current_date - INTERVAL '89 days'
ORDER BY product_code, color_code, yaka_kodu, stock_date DESC
),
Stock180Start AS (
SELECT DISTINCT ON (product_code, color_code, yaka_kodu)
product_code,
color_code,
yaka_kodu,
stock_qty
FROM mk_product_performance_stock_daily
WHERE stock_date <= current_date - INTERVAL '179 days'
ORDER BY product_code, color_code, yaka_kodu, stock_date DESC
),
Stock365Start AS (
SELECT DISTINCT ON (product_code, color_code, yaka_kodu)
product_code,
color_code,
yaka_kodu,
stock_qty
FROM mk_product_performance_stock_daily
WHERE stock_date <= current_date - INTERVAL '359 days'
ORDER BY product_code, color_code, yaka_kodu, stock_date DESC
),
StockTotalStart AS (
SELECT DISTINCT ON (product_code, color_code, yaka_kodu)
product_code,
color_code,
yaka_kodu,
stock_qty
FROM mk_product_performance_stock_daily
WHERE stock_date <= DATE '2022-01-01'
ORDER BY product_code, color_code, yaka_kodu, stock_date DESC
),
Agg AS ( Agg AS (
SELECT SELECT
$2::text AS breakdown, $2::text AS breakdown,
@@ -2567,6 +2637,10 @@ Agg AS (
%s, %s,
COUNT(DISTINCT product_code) AS product_count, COUNT(DISTINCT product_code) AS product_count,
COALESCE(MAX(stock_qty),0) AS stock_qty, COALESCE(MAX(stock_qty),0) AS stock_qty,
COALESCE(MAX(avg_stock_90d),0) AS avg_stock_90d,
COALESCE(MAX(avg_stock_180d),0) AS avg_stock_180d,
COALESCE(MAX(avg_stock_365d),0) AS avg_stock_365d,
COALESCE(MAX(avg_stock_total),0) AS avg_stock_total,
COUNT(DISTINCT customer_code) FILTER (WHERE sales_date >= current_date - INTERVAL '89 days' AND COALESCE(customer_code,'') <> '')::integer AS customer_count_90d, COUNT(DISTINCT customer_code) FILTER (WHERE sales_date >= current_date - INTERVAL '89 days' AND COALESCE(customer_code,'') <> '')::integer AS customer_count_90d,
COALESCE(SUM(invoice_count) FILTER (WHERE sales_date >= current_date - INTERVAL '89 days'),0)::integer AS invoice_count_90d, COALESCE(SUM(invoice_count) FILTER (WHERE sales_date >= current_date - INTERVAL '89 days'),0)::integer AS invoice_count_90d,
COALESCE(SUM(sales_qty) FILTER (WHERE sales_date >= current_date - INTERVAL '89 days'),0) AS sales_qty_90d, COALESCE(SUM(sales_qty) FILTER (WHERE sales_date >= current_date - INTERVAL '89 days'),0) AS sales_qty_90d,
@@ -2637,11 +2711,19 @@ Agg AS (
s.*, s.*,
COALESCE(pd.base_price_usd,0) AS base_price_usd, COALESCE(pd.base_price_usd,0) AS base_price_usd,
COALESCE(pd.cost_price_usd,0) AS cost_price_usd, COALESCE(pd.cost_price_usd,0) AS cost_price_usd,
COALESCE(st.stock_qty,0) AS stock_qty COALESCE(st.stock_qty,0) AS stock_qty,
(COALESCE(s90.stock_qty,0) + COALESCE(st.stock_qty,0)) / 2.0 AS avg_stock_90d,
(COALESCE(s180.stock_qty,0) + COALESCE(st.stock_qty,0)) / 2.0 AS avg_stock_180d,
(COALESCE(s365.stock_qty,0) + COALESCE(st.stock_qty,0)) / 2.0 AS avg_stock_365d,
(COALESCE(stotal.stock_qty,0) + COALESCE(st.stock_qty,0)) / 2.0 AS avg_stock_total
FROM mk_product_performance_sales_daily s FROM mk_product_performance_sales_daily s
LEFT JOIN mk_product_performance_price_dim pd ON pd.product_code = s.product_code LEFT JOIN mk_product_performance_price_dim pd ON pd.product_code = s.product_code
LEFT JOIN LatestKPI k ON k.product_code = s.product_code AND k.color_code = s.color_code AND k.yaka_kodu = s.yaka_kodu LEFT JOIN LatestKPI k ON k.product_code = s.product_code AND k.color_code = s.color_code AND k.yaka_kodu = s.yaka_kodu
LEFT JOIN StockAgg st ON st.product_code = s.product_code AND st.color_code = s.color_code AND st.yaka_kodu = s.yaka_kodu LEFT JOIN StockAgg st ON st.product_code = s.product_code AND st.color_code = s.color_code AND st.yaka_kodu = s.yaka_kodu
LEFT JOIN Stock90Start s90 ON s90.product_code = s.product_code AND s90.color_code = s.color_code AND s90.yaka_kodu = s.yaka_kodu
LEFT JOIN Stock180Start s180 ON s180.product_code = s.product_code AND s180.color_code = s.color_code AND s180.yaka_kodu = s.yaka_kodu
LEFT JOIN Stock365Start s365 ON s365.product_code = s.product_code AND s365.color_code = s.color_code AND s365.yaka_kodu = s.yaka_kodu
LEFT JOIN StockTotalStart stotal ON stotal.product_code = s.product_code AND stotal.color_code = s.color_code AND stotal.yaka_kodu = s.yaka_kodu
) s ) s
WHERE sales_date >= DATE '2022-01-01' WHERE sales_date >= DATE '2022-01-01'
GROUP BY %s GROUP BY %s
@@ -2738,10 +2820,10 @@ SELECT
gross_profit_cost_usd_total, gross_profit_cost_usd_total,
gross_margin_base_total, gross_margin_base_total,
gross_margin_cost_total, gross_margin_cost_total,
CASE WHEN stock_qty > 0 THEN sales_qty_90d / NULLIF(stock_qty,0) ELSE 0 END AS stock_turnover_90d, CASE WHEN avg_stock_90d > 0 THEN sales_qty_90d / NULLIF(avg_stock_90d,0) ELSE 0 END AS stock_turnover_90d,
CASE WHEN stock_qty > 0 THEN sales_qty_180d / NULLIF(stock_qty,0) ELSE 0 END AS stock_turnover_180d, CASE WHEN avg_stock_180d > 0 THEN sales_qty_180d / NULLIF(avg_stock_180d,0) ELSE 0 END AS stock_turnover_180d,
CASE WHEN stock_qty > 0 THEN sales_qty_365d / NULLIF(stock_qty,0) ELSE 0 END AS stock_turnover_365d, CASE WHEN avg_stock_365d > 0 THEN sales_qty_365d / NULLIF(avg_stock_365d,0) ELSE 0 END AS stock_turnover_365d,
CASE WHEN stock_qty > 0 THEN sales_qty_total / NULLIF(stock_qty,0) ELSE 0 END AS stock_turnover_total, CASE WHEN avg_stock_total > 0 THEN sales_qty_total / NULLIF(avg_stock_total,0) ELSE 0 END AS stock_turnover_total,
has_cost, has_cost,
sales_index_90d, sales_index_90d,
CASE WHEN NOT has_cost THEN 0 ELSE CASE WHEN NOT has_cost THEN 0 ELSE
@@ -2786,7 +2868,7 @@ SELECT
+ LEAST(30, GREATEST(gross_margin_cost_90d,0) * 60) + LEAST(30, GREATEST(gross_margin_cost_90d,0) * 60)
+ LEAST(15, invoice_count_90d * 1.5) + LEAST(15, invoice_count_90d * 1.5)
+ LEAST(10, sales_qty_90d / 10) + LEAST(10, sales_qty_90d / 10)
+ LEAST(10, (CASE WHEN stock_qty > 0 THEN sales_qty_90d / NULLIF(stock_qty,0) ELSE 0 END) * 5), + LEAST(10, (CASE WHEN avg_stock_90d > 0 THEN sales_qty_90d / NULLIF(avg_stock_90d,0) ELSE 0 END) * 5),
4 4
) )
END AS performance_score, END AS performance_score,
@@ -2982,9 +3064,11 @@ SELECT jsonb_build_object(
'sales_qty_90d', sales_qty_90d, 'sales_qty_90d', sales_qty_90d,
'sales_qty_180d', sales_qty_180d, 'sales_qty_180d', sales_qty_180d,
'sales_qty_365d', sales_qty_365d, 'sales_qty_365d', sales_qty_365d,
'sales_qty_total', sales_qty_total,
'sales_usd_90d', sales_usd_90d, 'sales_usd_90d', sales_usd_90d,
'sales_usd_180d', sales_usd_180d, 'sales_usd_180d', sales_usd_180d,
'sales_usd_365d', sales_usd_365d, 'sales_usd_365d', sales_usd_365d,
'sales_usd_total', sales_usd_total,
'avg_price_usd_90d', avg_price_usd_90d, 'avg_price_usd_90d', avg_price_usd_90d,
'avg_price_usd_180d', avg_price_usd_180d, 'avg_price_usd_180d', avg_price_usd_180d,
'cost_price_usd', cost_price_usd, 'cost_price_usd', cost_price_usd,
@@ -3006,9 +3090,14 @@ SELECT jsonb_build_object(
'performance_score', performance_score, 'performance_score', performance_score,
'performance_bucket', performance_bucket, 'performance_bucket', performance_bucket,
'idle_cost_usd', idle_cost_usd, 'idle_cost_usd', idle_cost_usd,
'stock_turnover_90d', CASE WHEN stock_qty > 0 THEN sales_qty_90d / NULLIF(stock_qty,0) ELSE 0 END, 'stock_days_90d', stock_days_90d,
'stock_turnover_180d', CASE WHEN stock_qty > 0 THEN sales_qty_180d / NULLIF(stock_qty,0) ELSE 0 END, 'stock_days_180d', stock_days_180d,
'stock_turnover_365d', CASE WHEN stock_qty > 0 THEN sales_qty_365d / NULLIF(stock_qty,0) ELSE 0 END 'stock_days_365d', stock_days_365d,
'stock_days_total', stock_days_total,
'stock_turnover_90d', CASE WHEN avg_stock_90d > 0 THEN sales_qty_90d / NULLIF(avg_stock_90d,0) ELSE 0 END,
'stock_turnover_180d', CASE WHEN avg_stock_180d > 0 THEN sales_qty_180d / NULLIF(avg_stock_180d,0) ELSE 0 END,
'stock_turnover_365d', CASE WHEN avg_stock_365d > 0 THEN sales_qty_365d / NULLIF(avg_stock_365d,0) ELSE 0 END,
'stock_turnover_total', CASE WHEN avg_stock_total > 0 THEN sales_qty_total / NULLIF(avg_stock_total,0) ELSE 0 END
) AS row_json ) AS row_json
FROM ( FROM (
SELECT SELECT
@@ -3028,12 +3117,22 @@ FROM (
COALESCE((ARRAY_AGG(NULLIF(urun_alt_grubu,'') ORDER BY performance_score DESC NULLS LAST))[1], '') AS urun_alt_grubu, COALESCE((ARRAY_AGG(NULLIF(urun_alt_grubu,'') ORDER BY performance_score DESC NULLS LAST))[1], '') AS urun_alt_grubu,
COALESCE((ARRAY_AGG(NULLIF(market_key,'') ORDER BY performance_score DESC NULLS LAST))[1], '') AS market_key, COALESCE((ARRAY_AGG(NULLIF(market_key,'') ORDER BY performance_score DESC NULLS LAST))[1], '') AS market_key,
COALESCE(SUM(CASE WHEN stock_variant_rank = 1 THEN stock_qty ELSE 0 END),0) AS stock_qty, COALESCE(SUM(CASE WHEN stock_variant_rank = 1 THEN stock_qty ELSE 0 END),0) AS stock_qty,
COALESCE(SUM(CASE WHEN stock_variant_rank = 1 THEN avg_stock_90d ELSE 0 END),0) AS avg_stock_90d,
COALESCE(SUM(CASE WHEN stock_variant_rank = 1 THEN avg_stock_180d ELSE 0 END),0) AS avg_stock_180d,
COALESCE(SUM(CASE WHEN stock_variant_rank = 1 THEN avg_stock_365d ELSE 0 END),0) AS avg_stock_365d,
COALESCE(SUM(CASE WHEN stock_variant_rank = 1 THEN avg_stock_total ELSE 0 END),0) AS avg_stock_total,
COALESCE(SUM(sales_qty_90d),0) AS sales_qty_90d, COALESCE(SUM(sales_qty_90d),0) AS sales_qty_90d,
COALESCE(SUM(sales_qty_180d),0) AS sales_qty_180d, COALESCE(SUM(sales_qty_180d),0) AS sales_qty_180d,
COALESCE(SUM(sales_qty_365d),0) AS sales_qty_365d, COALESCE(SUM(sales_qty_365d),0) AS sales_qty_365d,
COALESCE(SUM(sales_qty_total),0) AS sales_qty_total,
COALESCE(SUM(sales_usd_90d),0) AS sales_usd_90d, COALESCE(SUM(sales_usd_90d),0) AS sales_usd_90d,
COALESCE(SUM(sales_usd_180d),0) AS sales_usd_180d, COALESCE(SUM(sales_usd_180d),0) AS sales_usd_180d,
COALESCE(SUM(sales_usd_365d),0) AS sales_usd_365d, COALESCE(SUM(sales_usd_365d),0) AS sales_usd_365d,
COALESCE(SUM(sales_usd_total),0) AS sales_usd_total,
CASE WHEN SUM(CASE WHEN stock_variant_rank = 1 THEN stock_qty ELSE 0 END) > 0 THEN SUM(CASE WHEN stock_variant_rank = 1 THEN stock_days_90d * stock_qty ELSE 0 END) / NULLIF(SUM(CASE WHEN stock_variant_rank = 1 THEN stock_qty ELSE 0 END),0) ELSE 0 END AS stock_days_90d,
CASE WHEN SUM(CASE WHEN stock_variant_rank = 1 THEN stock_qty ELSE 0 END) > 0 THEN SUM(CASE WHEN stock_variant_rank = 1 THEN stock_days_180d * stock_qty ELSE 0 END) / NULLIF(SUM(CASE WHEN stock_variant_rank = 1 THEN stock_qty ELSE 0 END),0) ELSE 0 END AS stock_days_180d,
CASE WHEN SUM(CASE WHEN stock_variant_rank = 1 THEN stock_qty ELSE 0 END) > 0 THEN SUM(CASE WHEN stock_variant_rank = 1 THEN stock_days_365d * stock_qty ELSE 0 END) / NULLIF(SUM(CASE WHEN stock_variant_rank = 1 THEN stock_qty ELSE 0 END),0) ELSE 0 END AS stock_days_365d,
CASE WHEN SUM(CASE WHEN stock_variant_rank = 1 THEN stock_qty ELSE 0 END) > 0 THEN SUM(CASE WHEN stock_variant_rank = 1 THEN stock_days_total * stock_qty ELSE 0 END) / NULLIF(SUM(CASE WHEN stock_variant_rank = 1 THEN stock_qty ELSE 0 END),0) ELSE 0 END AS stock_days_total,
CASE WHEN SUM(sales_qty_90d) > 0 THEN SUM(sales_usd_90d) / NULLIF(SUM(sales_qty_90d),0) ELSE 0 END AS avg_price_usd_90d, CASE WHEN SUM(sales_qty_90d) > 0 THEN SUM(sales_usd_90d) / NULLIF(SUM(sales_qty_90d),0) ELSE 0 END AS avg_price_usd_90d,
CASE WHEN SUM(sales_qty_180d) > 0 THEN SUM(sales_usd_180d) / NULLIF(SUM(sales_qty_180d),0) ELSE 0 END AS avg_price_usd_180d, CASE WHEN SUM(sales_qty_180d) > 0 THEN SUM(sales_usd_180d) / NULLIF(SUM(sales_qty_180d),0) ELSE 0 END AS avg_price_usd_180d,
CASE WHEN SUM(CASE WHEN stock_variant_rank = 1 THEN stock_qty ELSE 0 END) > 0 THEN SUM(CASE WHEN stock_variant_rank = 1 THEN cost_price_usd * stock_qty ELSE 0 END) / NULLIF(SUM(CASE WHEN stock_variant_rank = 1 THEN stock_qty ELSE 0 END),0) ELSE 0 END AS cost_price_usd, CASE WHEN SUM(CASE WHEN stock_variant_rank = 1 THEN stock_qty ELSE 0 END) > 0 THEN SUM(CASE WHEN stock_variant_rank = 1 THEN cost_price_usd * stock_qty ELSE 0 END) / NULLIF(SUM(CASE WHEN stock_variant_rank = 1 THEN stock_qty ELSE 0 END),0) ELSE 0 END AS cost_price_usd,
@@ -3082,9 +3181,10 @@ func queryProductPerformanceSQLLeafRows(ctx context.Context, pg *sql.DB, mode st
query := productPerformanceSQLSourceCTE(mode) + fmt.Sprintf(` query := productPerformanceSQLSourceCTE(mode) + fmt.Sprintf(`
SELECT to_jsonb(t) || jsonb_build_object( SELECT to_jsonb(t) || jsonb_build_object(
'row_key', 'leaf|' || product_code || '|' || color_code || '|' || yaka_kodu || '|' || market_key, 'row_key', 'leaf|' || product_code || '|' || color_code || '|' || yaka_kodu || '|' || market_key,
'stock_turnover_90d', CASE WHEN stock_qty > 0 THEN sales_qty_90d / NULLIF(stock_qty,0) ELSE 0 END, 'stock_turnover_90d', CASE WHEN avg_stock_90d > 0 THEN sales_qty_90d / NULLIF(avg_stock_90d,0) ELSE 0 END,
'stock_turnover_180d', CASE WHEN stock_qty > 0 THEN sales_qty_180d / NULLIF(stock_qty,0) ELSE 0 END, 'stock_turnover_180d', CASE WHEN avg_stock_180d > 0 THEN sales_qty_180d / NULLIF(avg_stock_180d,0) ELSE 0 END,
'stock_turnover_365d', CASE WHEN stock_qty > 0 THEN sales_qty_365d / NULLIF(stock_qty,0) ELSE 0 END 'stock_turnover_365d', CASE WHEN avg_stock_365d > 0 THEN sales_qty_365d / NULLIF(avg_stock_365d,0) ELSE 0 END,
'stock_turnover_total', CASE WHEN avg_stock_total > 0 THEN sales_qty_total / NULLIF(avg_stock_total,0) ELSE 0 END
) AS row_json ) AS row_json
FROM Source t FROM Source t
%s %s
@@ -3123,7 +3223,39 @@ func productPerformanceSQLSourceCTE(mode string) string {
AND (performance_bucket = 'STOK_RISKI' OR COALESCE(sales_qty_90d,0) = 0 OR COALESCE(stock_days_90d,0) > 180)` AND (performance_bucket = 'STOK_RISKI' OR COALESCE(sales_qty_90d,0) = 0 OR COALESCE(stock_days_90d,0) > 180)`
} }
return ` return `
WITH Source AS ( WITH LatestKPIDate AS (
SELECT MAX(kpi_date) AS kpi_date
FROM mk_product_performance_kpi_daily
),
Stock90Start AS (
SELECT DISTINCT ON (product_code, color_code, yaka_kodu)
product_code, color_code, yaka_kodu, stock_qty
FROM mk_product_performance_stock_daily, LatestKPIDate
WHERE stock_date <= LatestKPIDate.kpi_date - INTERVAL '89 days'
ORDER BY product_code, color_code, yaka_kodu, stock_date DESC
),
Stock180Start AS (
SELECT DISTINCT ON (product_code, color_code, yaka_kodu)
product_code, color_code, yaka_kodu, stock_qty
FROM mk_product_performance_stock_daily, LatestKPIDate
WHERE stock_date <= LatestKPIDate.kpi_date - INTERVAL '179 days'
ORDER BY product_code, color_code, yaka_kodu, stock_date DESC
),
Stock365Start AS (
SELECT DISTINCT ON (product_code, color_code, yaka_kodu)
product_code, color_code, yaka_kodu, stock_qty
FROM mk_product_performance_stock_daily, LatestKPIDate
WHERE stock_date <= LatestKPIDate.kpi_date - INTERVAL '359 days'
ORDER BY product_code, color_code, yaka_kodu, stock_date DESC
),
StockTotalStart AS (
SELECT DISTINCT ON (product_code, color_code, yaka_kodu)
product_code, color_code, yaka_kodu, stock_qty
FROM mk_product_performance_stock_daily
WHERE stock_date <= DATE '2022-01-01'
ORDER BY product_code, color_code, yaka_kodu, stock_date DESC
),
Source AS (
SELECT SELECT
product_code, product_code,
color_code, color_code,
@@ -3142,12 +3274,22 @@ WITH Source AS (
urun_alt_grubu, urun_alt_grubu,
market_key, market_key,
COALESCE(stock_qty,0) AS stock_qty, COALESCE(stock_qty,0) AS stock_qty,
(COALESCE((SELECT s.stock_qty FROM Stock90Start s WHERE s.product_code = mk_product_performance_kpi_daily.product_code AND s.color_code = mk_product_performance_kpi_daily.color_code AND s.yaka_kodu = mk_product_performance_kpi_daily.yaka_kodu),0) + COALESCE(stock_qty,0)) / 2.0 AS avg_stock_90d,
(COALESCE((SELECT s.stock_qty FROM Stock180Start s WHERE s.product_code = mk_product_performance_kpi_daily.product_code AND s.color_code = mk_product_performance_kpi_daily.color_code AND s.yaka_kodu = mk_product_performance_kpi_daily.yaka_kodu),0) + COALESCE(stock_qty,0)) / 2.0 AS avg_stock_180d,
(COALESCE((SELECT s.stock_qty FROM Stock365Start s WHERE s.product_code = mk_product_performance_kpi_daily.product_code AND s.color_code = mk_product_performance_kpi_daily.color_code AND s.yaka_kodu = mk_product_performance_kpi_daily.yaka_kodu),0) + COALESCE(stock_qty,0)) / 2.0 AS avg_stock_365d,
(COALESCE((SELECT s.stock_qty FROM StockTotalStart s WHERE s.product_code = mk_product_performance_kpi_daily.product_code AND s.color_code = mk_product_performance_kpi_daily.color_code AND s.yaka_kodu = mk_product_performance_kpi_daily.yaka_kodu),0) + COALESCE(stock_qty,0)) / 2.0 AS avg_stock_total,
COALESCE(sales_qty_90d,0) AS sales_qty_90d, COALESCE(sales_qty_90d,0) AS sales_qty_90d,
COALESCE(sales_qty_180d,0) AS sales_qty_180d, COALESCE(sales_qty_180d,0) AS sales_qty_180d,
COALESCE(sales_qty_365d,0) AS sales_qty_365d, COALESCE(sales_qty_365d,0) AS sales_qty_365d,
COALESCE(sales_qty_total,0) AS sales_qty_total,
COALESCE(sales_usd_90d,0) AS sales_usd_90d, COALESCE(sales_usd_90d,0) AS sales_usd_90d,
COALESCE(sales_usd_180d,0) AS sales_usd_180d, COALESCE(sales_usd_180d,0) AS sales_usd_180d,
COALESCE(sales_usd_365d,0) AS sales_usd_365d, COALESCE(sales_usd_365d,0) AS sales_usd_365d,
COALESCE(sales_usd_total,0) AS sales_usd_total,
COALESCE(stock_days_90d,0) AS stock_days_90d,
COALESCE(stock_days_180d,0) AS stock_days_180d,
COALESCE(stock_days_365d,0) AS stock_days_365d,
COALESCE(stock_days_total,0) AS stock_days_total,
COALESCE(avg_price_usd_90d,0) AS avg_price_usd_90d, COALESCE(avg_price_usd_90d,0) AS avg_price_usd_90d,
COALESCE(avg_price_usd_180d,0) AS avg_price_usd_180d, COALESCE(avg_price_usd_180d,0) AS avg_price_usd_180d,
COALESCE(cost_price_usd,0) AS cost_price_usd, COALESCE(cost_price_usd,0) AS cost_price_usd,
@@ -3430,7 +3572,7 @@ func deriveProductPerformanceGroupMetrics(out map[string]any, groupField string)
sales := floatFromMap(out, "sales_usd_"+suffix) sales := floatFromMap(out, "sales_usd_"+suffix)
qty := floatFromMap(out, "sales_qty_"+suffix) qty := floatFromMap(out, "sales_qty_"+suffix)
stockQty := floatFromMap(out, "stock_qty") stockQty := floatFromMap(out, "stock_qty")
if stockQty > 0 { if _, exists := out["stock_turnover_"+suffix]; !exists && stockQty > 0 {
out["stock_turnover_"+suffix] = qty / stockQty out["stock_turnover_"+suffix] = qty / stockQty
} }
if qty > 0 { if qty > 0 {
@@ -4012,10 +4154,20 @@ func productPerformanceOrderBy(sortBy string, desc bool) string {
"stock_qty": "stock_qty", "stock_qty": "stock_qty",
"sales_qty_90d": "sales_qty_90d", "sales_qty_90d": "sales_qty_90d",
"sales_qty_180d": "sales_qty_180d", "sales_qty_180d": "sales_qty_180d",
"sales_qty_365d": "sales_qty_365d",
"sales_qty_total": "sales_qty_total",
"sales_usd_90d": "sales_usd_90d", "sales_usd_90d": "sales_usd_90d",
"sales_usd_180d": "sales_usd_180d", "sales_usd_180d": "sales_usd_180d",
"sales_usd_365d": "sales_usd_365d",
"sales_usd_total": "sales_usd_total",
"stock_days_90d": "stock_days_90d", "stock_days_90d": "stock_days_90d",
"stock_days_180d": "stock_days_180d", "stock_days_180d": "stock_days_180d",
"stock_days_365d": "stock_days_365d",
"stock_days_total": "stock_days_total",
"stock_turnover_90d": "stock_turnover_90d",
"stock_turnover_180d": "stock_turnover_180d",
"stock_turnover_365d": "stock_turnover_365d",
"stock_turnover_total": "stock_turnover_total",
"avg_price_usd_90d": "avg_price_usd_90d", "avg_price_usd_90d": "avg_price_usd_90d",
"avg_price_usd_180d": "avg_price_usd_180d", "avg_price_usd_180d": "avg_price_usd_180d",
"base_price_usd": "base_price_usd", "base_price_usd": "base_price_usd",
+61 -11
View File
@@ -396,6 +396,34 @@ WITH LatestStock AS (
WHERE stock_date <= $1 WHERE stock_date <= $1
ORDER BY product_code, color_code, yaka_kodu, stock_date DESC ORDER BY product_code, color_code, yaka_kodu, stock_date DESC
), ),
Stock90Start AS (
SELECT DISTINCT ON (product_code, color_code, yaka_kodu)
product_code, color_code, yaka_kodu, stock_qty
FROM mk_product_performance_stock_daily
WHERE stock_date <= $1::date - INTERVAL '89 days'
ORDER BY product_code, color_code, yaka_kodu, stock_date DESC
),
Stock180Start AS (
SELECT DISTINCT ON (product_code, color_code, yaka_kodu)
product_code, color_code, yaka_kodu, stock_qty
FROM mk_product_performance_stock_daily
WHERE stock_date <= $1::date - INTERVAL '179 days'
ORDER BY product_code, color_code, yaka_kodu, stock_date DESC
),
Stock365Start AS (
SELECT DISTINCT ON (product_code, color_code, yaka_kodu)
product_code, color_code, yaka_kodu, stock_qty
FROM mk_product_performance_stock_daily
WHERE stock_date <= $1::date - INTERVAL '359 days'
ORDER BY product_code, color_code, yaka_kodu, stock_date DESC
),
StockTotalStart AS (
SELECT DISTINCT ON (product_code, color_code, yaka_kodu)
product_code, color_code, yaka_kodu, stock_qty
FROM mk_product_performance_stock_daily
WHERE stock_date <= DATE '2022-01-01'
ORDER BY product_code, color_code, yaka_kodu, stock_date DESC
),
SalesAgg AS ( SalesAgg AS (
SELECT SELECT
product_code, product_code,
@@ -415,15 +443,17 @@ SalesAgg AS (
SUM(sales_qty) FILTER (WHERE sales_date >= $1::date - INTERVAL '179 days') AS sales_qty_180d, SUM(sales_qty) FILTER (WHERE sales_date >= $1::date - INTERVAL '179 days') AS sales_qty_180d,
SUM(sales_qty) FILTER (WHERE sales_date >= $1::date - INTERVAL '359 days') AS sales_qty_365d, SUM(sales_qty) FILTER (WHERE sales_date >= $1::date - INTERVAL '359 days') AS sales_qty_365d,
SUM(sales_qty) FILTER (WHERE sales_date >= $1::date - INTERVAL '729 days') AS sales_qty_730d, SUM(sales_qty) FILTER (WHERE sales_date >= $1::date - INTERVAL '729 days') AS sales_qty_730d,
SUM(sales_qty) FILTER (WHERE sales_date >= DATE '2022-01-01') AS sales_qty_total,
SUM(sales_usd) FILTER (WHERE sales_date >= $1::date - INTERVAL '29 days') AS sales_usd_30d, SUM(sales_usd) FILTER (WHERE sales_date >= $1::date - INTERVAL '29 days') AS sales_usd_30d,
SUM(sales_usd) FILTER (WHERE sales_date >= $1::date - INTERVAL '89 days') AS sales_usd_90d, SUM(sales_usd) FILTER (WHERE sales_date >= $1::date - INTERVAL '89 days') AS sales_usd_90d,
SUM(sales_usd) FILTER (WHERE sales_date >= $1::date - INTERVAL '179 days') AS sales_usd_180d, SUM(sales_usd) FILTER (WHERE sales_date >= $1::date - INTERVAL '179 days') AS sales_usd_180d,
SUM(sales_usd) FILTER (WHERE sales_date >= $1::date - INTERVAL '359 days') AS sales_usd_365d, SUM(sales_usd) FILTER (WHERE sales_date >= $1::date - INTERVAL '359 days') AS sales_usd_365d,
SUM(sales_usd) FILTER (WHERE sales_date >= DATE '2022-01-01') AS sales_usd_total,
COUNT(DISTINCT NULLIF(customer_code, '-')) FILTER (WHERE sales_date >= $1::date - INTERVAL '89 days') AS customer_count_90d, COUNT(DISTINCT NULLIF(customer_code, '-')) FILTER (WHERE sales_date >= $1::date - INTERVAL '89 days') AS customer_count_90d,
MAX(sales_date) AS last_sale_date, MAX(sales_date) AS last_sale_date,
MAX(last_ref_number) AS last_ref_number MAX(last_ref_number) AS last_ref_number
FROM mk_product_performance_sales_daily FROM mk_product_performance_sales_daily
WHERE sales_date >= $1::date - INTERVAL '729 days' WHERE sales_date >= DATE '2022-01-01'
AND sales_date <= $1::date AND sales_date <= $1::date
GROUP BY product_code, color_code, yaka_kodu, market_key GROUP BY product_code, color_code, yaka_kodu, market_key
), ),
@@ -431,8 +461,8 @@ Scope AS (
SELECT SELECT
product_code, color_code, yaka_kodu, market_key, product_code, color_code, yaka_kodu, market_key,
item_description, kategori, seri, yas_grubu, askili_yan, urun_ilk_grubu, urun_ana_grubu, urun_alt_grubu, item_description, kategori, seri, yas_grubu, askili_yan, urun_ilk_grubu, urun_ana_grubu, urun_alt_grubu,
sales_qty_30d, sales_qty_90d, sales_qty_180d, sales_qty_365d, sales_qty_730d, sales_qty_30d, sales_qty_90d, sales_qty_180d, sales_qty_365d, sales_qty_730d, sales_qty_total,
sales_usd_30d, sales_usd_90d, sales_usd_180d, sales_usd_365d, sales_usd_30d, sales_usd_90d, sales_usd_180d, sales_usd_365d, sales_usd_total,
customer_count_90d, last_sale_date, last_ref_number customer_count_90d, last_sale_date, last_ref_number
FROM SalesAgg FROM SalesAgg
UNION ALL UNION ALL
@@ -454,10 +484,12 @@ Scope AS (
0 AS sales_qty_180d, 0 AS sales_qty_180d,
0 AS sales_qty_365d, 0 AS sales_qty_365d,
0 AS sales_qty_730d, 0 AS sales_qty_730d,
0 AS sales_qty_total,
0 AS sales_usd_30d, 0 AS sales_usd_30d,
0 AS sales_usd_90d, 0 AS sales_usd_90d,
0 AS sales_usd_180d, 0 AS sales_usd_180d,
0 AS sales_usd_365d, 0 AS sales_usd_365d,
0 AS sales_usd_total,
0 AS customer_count_90d, 0 AS customer_count_90d,
NULL::date AS last_sale_date, NULL::date AS last_sale_date,
'' AS last_ref_number '' AS last_ref_number
@@ -480,6 +512,12 @@ Base AS (
COALESCE(pd.base_price_try, 0) AS base_price_try, COALESCE(pd.base_price_try, 0) AS base_price_try,
COALESCE(s.sales_qty_90d, 0) / 90.0 AS avg_daily_sales_90d, COALESCE(s.sales_qty_90d, 0) / 90.0 AS avg_daily_sales_90d,
COALESCE(s.sales_qty_180d, 0) / 180.0 AS avg_daily_sales_180d, COALESCE(s.sales_qty_180d, 0) / 180.0 AS avg_daily_sales_180d,
COALESCE(s.sales_qty_365d, 0) / 360.0 AS avg_daily_sales_365d,
COALESCE(s.sales_qty_total, 0) / GREATEST(1, ($1::date - DATE '2022-01-01') + 1) AS avg_daily_sales_total,
(COALESCE(s90.stock_qty, 0) + COALESCE(ls.stock_qty, 0)) / 2.0 AS avg_stock_90d,
(COALESCE(s180.stock_qty, 0) + COALESCE(ls.stock_qty, 0)) / 2.0 AS avg_stock_180d,
(COALESCE(s365.stock_qty, 0) + COALESCE(ls.stock_qty, 0)) / 2.0 AS avg_stock_365d,
(COALESCE(stotal.stock_qty, 0) + COALESCE(ls.stock_qty, 0)) / 2.0 AS avg_stock_total,
CASE WHEN COALESCE(s.sales_qty_90d, 0) = 0 THEN 0 ELSE COALESCE(s.sales_usd_90d, 0) / NULLIF(s.sales_qty_90d, 0) END AS avg_price_usd_90d, CASE WHEN COALESCE(s.sales_qty_90d, 0) = 0 THEN 0 ELSE COALESCE(s.sales_usd_90d, 0) / NULLIF(s.sales_qty_90d, 0) END AS avg_price_usd_90d,
CASE WHEN COALESCE(s.sales_qty_180d, 0) = 0 THEN 0 ELSE COALESCE(s.sales_usd_180d, 0) / NULLIF(s.sales_qty_180d, 0) END AS avg_price_usd_180d, CASE WHEN COALESCE(s.sales_qty_180d, 0) = 0 THEN 0 ELSE COALESCE(s.sales_usd_180d, 0) / NULLIF(s.sales_qty_180d, 0) END AS avg_price_usd_180d,
COALESCE(s.sales_usd_90d, 0) - (COALESCE(s.sales_qty_90d, 0) * COALESCE(pd.cost_price_usd, 0)) AS gross_profit_usd_90d, COALESCE(s.sales_usd_90d, 0) - (COALESCE(s.sales_qty_90d, 0) * COALESCE(pd.cost_price_usd, 0)) AS gross_profit_usd_90d,
@@ -496,6 +534,10 @@ Base AS (
CASE WHEN COALESCE(s.sales_qty_180d, 0) = 0 THEN 0 ELSE (COALESCE(s.sales_usd_180d, 0) / NULLIF(s.sales_qty_180d, 0)) - COALESCE(pd.base_price_usd, 0) END AS unit_profit_base_180d CASE WHEN COALESCE(s.sales_qty_180d, 0) = 0 THEN 0 ELSE (COALESCE(s.sales_usd_180d, 0) / NULLIF(s.sales_qty_180d, 0)) - COALESCE(pd.base_price_usd, 0) END AS unit_profit_base_180d
FROM Scope s FROM Scope s
LEFT JOIN LatestStock ls ON ls.product_code=s.product_code AND ls.color_code=s.color_code AND ls.yaka_kodu=s.yaka_kodu LEFT JOIN LatestStock ls ON ls.product_code=s.product_code AND ls.color_code=s.color_code AND ls.yaka_kodu=s.yaka_kodu
LEFT JOIN Stock90Start s90 ON s90.product_code=s.product_code AND s90.color_code=s.color_code AND s90.yaka_kodu=s.yaka_kodu
LEFT JOIN Stock180Start s180 ON s180.product_code=s.product_code AND s180.color_code=s.color_code AND s180.yaka_kodu=s.yaka_kodu
LEFT JOIN Stock365Start s365 ON s365.product_code=s.product_code AND s365.color_code=s.color_code AND s365.yaka_kodu=s.yaka_kodu
LEFT JOIN StockTotalStart stotal ON stotal.product_code=s.product_code AND stotal.color_code=s.color_code AND stotal.yaka_kodu=s.yaka_kodu
LEFT JOIN mk_product_performance_price_dim pd ON pd.product_code=s.product_code LEFT JOIN mk_product_performance_price_dim pd ON pd.product_code=s.product_code
), ),
Spread AS ( Spread AS (
@@ -521,8 +563,14 @@ Scored AS (
SELECT SELECT
b.*, b.*,
COALESCE(sp.market_count_90d, 0) AS market_count_90d, COALESCE(sp.market_count_90d, 0) AS market_count_90d,
CASE WHEN b.avg_daily_sales_90d = 0 THEN 0 ELSE b.stock_qty / NULLIF(b.avg_daily_sales_90d, 0) END AS stock_days_90d, CASE WHEN b.avg_daily_sales_90d = 0 THEN 0 ELSE b.avg_stock_90d / NULLIF(b.avg_daily_sales_90d, 0) END AS stock_days_90d,
CASE WHEN b.avg_daily_sales_180d = 0 THEN 0 ELSE b.stock_qty / NULLIF(b.avg_daily_sales_180d, 0) END AS stock_days_180d, CASE WHEN b.avg_daily_sales_180d = 0 THEN 0 ELSE b.avg_stock_180d / NULLIF(b.avg_daily_sales_180d, 0) END AS stock_days_180d,
CASE WHEN b.avg_daily_sales_365d = 0 THEN 0 ELSE b.avg_stock_365d / NULLIF(b.avg_daily_sales_365d, 0) END AS stock_days_365d,
CASE WHEN b.avg_daily_sales_total = 0 THEN 0 ELSE b.avg_stock_total / NULLIF(b.avg_daily_sales_total, 0) END AS stock_days_total,
CASE WHEN b.avg_stock_90d = 0 THEN 0 ELSE b.sales_qty_90d / NULLIF(b.avg_stock_90d, 0) END AS stock_turnover_90d,
CASE WHEN b.avg_stock_180d = 0 THEN 0 ELSE b.sales_qty_180d / NULLIF(b.avg_stock_180d, 0) END AS stock_turnover_180d,
CASE WHEN b.avg_stock_365d = 0 THEN 0 ELSE b.sales_qty_365d / NULLIF(b.avg_stock_365d, 0) END AS stock_turnover_365d,
CASE WHEN b.avg_stock_total = 0 THEN 0 ELSE b.sales_qty_total / NULLIF(b.avg_stock_total, 0) END AS stock_turnover_total,
CASE WHEN COALESCE(m.market_avg_sales_qty_90d, 0) = 0 THEN 0 ELSE b.sales_qty_90d / NULLIF(m.market_avg_sales_qty_90d, 0) END AS sales_index_90d, CASE WHEN COALESCE(m.market_avg_sales_qty_90d, 0) = 0 THEN 0 ELSE b.sales_qty_90d / NULLIF(m.market_avg_sales_qty_90d, 0) END AS sales_index_90d,
CASE WHEN COALESCE(m.market_avg_price_usd_90d, 0) = 0 THEN 0 ELSE b.avg_price_usd_90d / NULLIF(m.market_avg_price_usd_90d, 0) END AS price_index_90d, CASE WHEN COALESCE(m.market_avg_price_usd_90d, 0) = 0 THEN 0 ELSE b.avg_price_usd_90d / NULLIF(m.market_avg_price_usd_90d, 0) END AS price_index_90d,
CASE WHEN COALESCE(m.market_avg_margin_90d, 0) = 0 THEN 0 ELSE b.gross_margin_90d / NULLIF(m.market_avg_margin_90d, 0) END AS margin_index_90d CASE WHEN COALESCE(m.market_avg_margin_90d, 0) = 0 THEN 0 ELSE b.gross_margin_90d / NULLIF(m.market_avg_margin_90d, 0) END AS margin_index_90d
@@ -533,9 +581,10 @@ Scored AS (
INSERT INTO mk_product_performance_kpi_daily ( INSERT INTO mk_product_performance_kpi_daily (
kpi_date, product_code, color_code, yaka_kodu, item_description, kpi_date, product_code, color_code, yaka_kodu, item_description,
kategori, seri, yas_grubu, askili_yan, urun_ilk_grubu, urun_ana_grubu, urun_alt_grubu, market_key, stock_qty, kategori, seri, yas_grubu, askili_yan, urun_ilk_grubu, urun_ana_grubu, urun_alt_grubu, market_key, stock_qty,
sales_qty_30d, sales_qty_90d, sales_qty_180d, sales_qty_365d, sales_qty_730d, sales_qty_30d, sales_qty_90d, sales_qty_180d, sales_qty_365d, sales_qty_730d, sales_qty_total,
sales_usd_30d, sales_usd_90d, sales_usd_180d, sales_usd_365d, avg_daily_sales_90d, avg_daily_sales_180d, sales_usd_30d, sales_usd_90d, sales_usd_180d, sales_usd_365d, sales_usd_total, avg_daily_sales_90d, avg_daily_sales_180d, avg_daily_sales_365d, avg_daily_sales_total,
stock_days_90d, stock_days_180d, avg_price_usd_90d, avg_price_usd_180d, cost_price_usd, base_price_usd, base_price_try, stock_days_90d, stock_days_180d, stock_days_365d, stock_days_total, stock_turnover_90d, stock_turnover_180d, stock_turnover_365d, stock_turnover_total,
avg_price_usd_90d, avg_price_usd_180d, cost_price_usd, base_price_usd, base_price_try,
gross_profit_usd_90d, gross_profit_usd_180d, gross_margin_90d, gross_margin_180d, gross_profit_usd_90d, gross_profit_usd_180d, gross_margin_90d, gross_margin_180d,
unit_profit_cost_90d, unit_profit_cost_180d, unit_profit_base_90d, unit_profit_base_180d, market_count_90d, customer_count_90d, unit_profit_cost_90d, unit_profit_cost_180d, unit_profit_base_90d, unit_profit_base_180d, market_count_90d, customer_count_90d,
sales_index_90d, price_index_90d, margin_index_90d, performance_score, sales_index_90d, price_index_90d, margin_index_90d, performance_score,
@@ -545,9 +594,10 @@ SELECT
$1::date, $1::date,
product_code, color_code, yaka_kodu, item_description, product_code, color_code, yaka_kodu, item_description,
kategori, seri, yas_grubu, askili_yan, urun_ilk_grubu, urun_ana_grubu, urun_alt_grubu, market_key, stock_qty, kategori, seri, yas_grubu, askili_yan, urun_ilk_grubu, urun_ana_grubu, urun_alt_grubu, market_key, stock_qty,
COALESCE(sales_qty_30d, 0), COALESCE(sales_qty_90d, 0), COALESCE(sales_qty_180d, 0), COALESCE(sales_qty_365d, 0), COALESCE(sales_qty_730d, 0), COALESCE(sales_qty_30d, 0), COALESCE(sales_qty_90d, 0), COALESCE(sales_qty_180d, 0), COALESCE(sales_qty_365d, 0), COALESCE(sales_qty_730d, 0), COALESCE(sales_qty_total, 0),
COALESCE(sales_usd_30d, 0), COALESCE(sales_usd_90d, 0), COALESCE(sales_usd_180d, 0), COALESCE(sales_usd_365d, 0), COALESCE(avg_daily_sales_90d, 0), COALESCE(avg_daily_sales_180d, 0), COALESCE(sales_usd_30d, 0), COALESCE(sales_usd_90d, 0), COALESCE(sales_usd_180d, 0), COALESCE(sales_usd_365d, 0), COALESCE(sales_usd_total, 0), COALESCE(avg_daily_sales_90d, 0), COALESCE(avg_daily_sales_180d, 0), COALESCE(avg_daily_sales_365d, 0), COALESCE(avg_daily_sales_total, 0),
COALESCE(stock_days_90d, 0), COALESCE(stock_days_180d, 0), COALESCE(avg_price_usd_90d, 0), COALESCE(avg_price_usd_180d, 0), COALESCE(cost_price_usd, 0), COALESCE(base_price_usd, 0), COALESCE(base_price_try, 0), COALESCE(stock_days_90d, 0), COALESCE(stock_days_180d, 0), COALESCE(stock_days_365d, 0), COALESCE(stock_days_total, 0), COALESCE(stock_turnover_90d, 0), COALESCE(stock_turnover_180d, 0), COALESCE(stock_turnover_365d, 0), COALESCE(stock_turnover_total, 0),
COALESCE(avg_price_usd_90d, 0), COALESCE(avg_price_usd_180d, 0), COALESCE(cost_price_usd, 0), COALESCE(base_price_usd, 0), COALESCE(base_price_try, 0),
COALESCE(gross_profit_usd_90d, 0), COALESCE(gross_profit_usd_180d, 0), COALESCE(gross_margin_90d, 0), COALESCE(gross_margin_180d, 0), COALESCE(gross_profit_usd_90d, 0), COALESCE(gross_profit_usd_180d, 0), COALESCE(gross_margin_90d, 0), COALESCE(gross_margin_180d, 0),
COALESCE(unit_profit_cost_90d, 0), COALESCE(unit_profit_cost_180d, 0), COALESCE(unit_profit_base_90d, 0), COALESCE(unit_profit_base_180d, 0), COALESCE(market_count_90d, 0), COALESCE(customer_count_90d, 0), COALESCE(unit_profit_cost_90d, 0), COALESCE(unit_profit_cost_180d, 0), COALESCE(unit_profit_base_90d, 0), COALESCE(unit_profit_base_180d, 0), COALESCE(market_count_90d, 0), COALESCE(customer_count_90d, 0),
COALESCE(sales_index_90d, 0), COALESCE(price_index_90d, 0), COALESCE(margin_index_90d, 0), COALESCE(sales_index_90d, 0), COALESCE(price_index_90d, 0), COALESCE(margin_index_90d, 0),
+23 -23
View File
@@ -3,7 +3,7 @@ package queries
// GetProductStockQuery: // GetProductStockQuery:
// Urun kodu bazli, STOCK/PICK/RESERVE/DISP ayrik CTE ile optimize sorgu. // Urun kodu bazli, STOCK/PICK/RESERVE/DISP ayrik CTE ile optimize sorgu.
const GetProductStockQuery = ` const GetProductStockQuery = `
DECLARE @ProductCode NVARCHAR(50) = @p1; DECLARE @ProductCode NVARCHAR(50) = UPPER(LTRIM(RTRIM(@p1)));
;WITH STOCK AS ;WITH STOCK AS
( (
@@ -14,7 +14,7 @@ DECLARE @ProductCode NVARCHAR(50) = @p1;
StoreCode, StoreCode,
WarehouseCode, WarehouseCode,
ItemTypeCode, ItemTypeCode,
ItemCode, UPPER(LTRIM(RTRIM(ItemCode))) AS ItemCode,
ColorCode, ColorCode,
ItemDim1Code, ItemDim1Code,
ItemDim2Code, ItemDim2Code,
@@ -22,12 +22,12 @@ DECLARE @ProductCode NVARCHAR(50) = @p1;
SUM(In_Qty1 - Out_Qty1) AS InventoryQty1 SUM(In_Qty1 - Out_Qty1) AS InventoryQty1
FROM trStock FROM trStock
WHERE ItemTypeCode = 1 WHERE ItemTypeCode = 1
AND ItemCode = @ProductCode AND UPPER(LTRIM(RTRIM(ItemCode))) = @ProductCode
AND LEN(ItemCode) = 13 AND LEN(LTRIM(RTRIM(ItemCode))) = 13
AND LEN(@ProductCode) = 13 AND LEN(@ProductCode) = 13
GROUP BY GROUP BY
CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode,
ItemTypeCode, ItemCode, ColorCode, ItemTypeCode, UPPER(LTRIM(RTRIM(ItemCode))), ColorCode,
ItemDim1Code, ItemDim2Code, ItemDim3Code ItemDim1Code, ItemDim2Code, ItemDim3Code
), ),
@@ -35,17 +35,17 @@ PICK AS
( (
SELECT SELECT
CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode,
ItemTypeCode, ItemCode, ColorCode, ItemTypeCode, UPPER(LTRIM(RTRIM(ItemCode))) AS ItemCode, ColorCode,
ItemDim1Code, ItemDim2Code, ItemDim3Code, ItemDim1Code, ItemDim2Code, ItemDim3Code,
SUM(Qty1) AS PickingQty1 SUM(Qty1) AS PickingQty1
FROM PickingStates FROM PickingStates
WHERE ItemTypeCode = 1 WHERE ItemTypeCode = 1
AND ItemCode = @ProductCode AND UPPER(LTRIM(RTRIM(ItemCode))) = @ProductCode
AND LEN(ItemCode) = 13 AND LEN(LTRIM(RTRIM(ItemCode))) = 13
AND LEN(@ProductCode) = 13 AND LEN(@ProductCode) = 13
GROUP BY GROUP BY
CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode,
ItemTypeCode, ItemCode, ColorCode, ItemTypeCode, UPPER(LTRIM(RTRIM(ItemCode))), ColorCode,
ItemDim1Code, ItemDim2Code, ItemDim3Code ItemDim1Code, ItemDim2Code, ItemDim3Code
), ),
@@ -53,17 +53,17 @@ RESERVE AS
( (
SELECT SELECT
CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode,
ItemTypeCode, ItemCode, ColorCode, ItemTypeCode, UPPER(LTRIM(RTRIM(ItemCode))) AS ItemCode, ColorCode,
ItemDim1Code, ItemDim2Code, ItemDim3Code, ItemDim1Code, ItemDim2Code, ItemDim3Code,
SUM(Qty1) AS ReserveQty1 SUM(Qty1) AS ReserveQty1
FROM ReserveStates FROM ReserveStates
WHERE ItemTypeCode = 1 WHERE ItemTypeCode = 1
AND ItemCode = @ProductCode AND UPPER(LTRIM(RTRIM(ItemCode))) = @ProductCode
AND LEN(ItemCode) = 13 AND LEN(LTRIM(RTRIM(ItemCode))) = 13
AND LEN(@ProductCode) = 13 AND LEN(@ProductCode) = 13
GROUP BY GROUP BY
CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode,
ItemTypeCode, ItemCode, ColorCode, ItemTypeCode, UPPER(LTRIM(RTRIM(ItemCode))), ColorCode,
ItemDim1Code, ItemDim2Code, ItemDim3Code ItemDim1Code, ItemDim2Code, ItemDim3Code
), ),
@@ -71,17 +71,17 @@ DISP AS
( (
SELECT SELECT
CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode,
ItemTypeCode, ItemCode, ColorCode, ItemTypeCode, UPPER(LTRIM(RTRIM(ItemCode))) AS ItemCode, ColorCode,
ItemDim1Code, ItemDim2Code, ItemDim3Code, ItemDim1Code, ItemDim2Code, ItemDim3Code,
SUM(Qty1) AS DispOrderQty1 SUM(Qty1) AS DispOrderQty1
FROM DispOrderStates FROM DispOrderStates
WHERE ItemTypeCode = 1 WHERE ItemTypeCode = 1
AND ItemCode = @ProductCode AND UPPER(LTRIM(RTRIM(ItemCode))) = @ProductCode
AND LEN(ItemCode) = 13 AND LEN(LTRIM(RTRIM(ItemCode))) = 13
AND LEN(@ProductCode) = 13 AND LEN(@ProductCode) = 13
GROUP BY GROUP BY
CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode, CompanyCode, OfficeCode, StoreTypeCode, StoreCode, WarehouseCode,
ItemTypeCode, ItemCode, ColorCode, ItemTypeCode, UPPER(LTRIM(RTRIM(ItemCode))), ColorCode,
ItemDim1Code, ItemDim2Code, ItemDim3Code ItemDim1Code, ItemDim2Code, ItemDim3Code
) )
@@ -185,14 +185,14 @@ AND DP.ItemDim2Code=S.ItemDim2Code
AND DP.ItemDim3Code=S.ItemDim3Code AND DP.ItemDim3Code=S.ItemDim3Code
JOIN cdItem JOIN cdItem
ON S.ItemCode = cdItem.ItemCode ON UPPER(LTRIM(RTRIM(S.ItemCode))) = UPPER(LTRIM(RTRIM(cdItem.ItemCode)))
AND S.ItemTypeCode = cdItem.ItemTypeCode AND S.ItemTypeCode = cdItem.ItemTypeCode
LEFT JOIN cdUnitOfMeasure LEFT JOIN cdUnitOfMeasure
ON cdItem.UnitOfMeasureCode1 = cdUnitOfMeasure.UnitOfMeasureCode ON cdItem.UnitOfMeasureCode1 = cdUnitOfMeasure.UnitOfMeasureCode
LEFT JOIN ProductFilterWithDescription('TR') P LEFT JOIN ProductFilterWithDescription('TR') P
ON P.ProductCode = S.ItemCode ON UPPER(LTRIM(RTRIM(P.ProductCode))) = UPPER(LTRIM(RTRIM(S.ItemCode)))
LEFT JOIN bsItemTypeDesc LEFT JOIN bsItemTypeDesc
ON bsItemTypeDesc.ItemTypeCode = S.ItemTypeCode ON bsItemTypeDesc.ItemTypeCode = S.ItemTypeCode
@@ -214,14 +214,14 @@ LEFT JOIN (
ROW_NUMBER() OVER (PARTITION BY ItemCode, ItemTypeCode ORDER BY PriceDate DESC) AS RowNum ROW_NUMBER() OVER (PARTITION BY ItemCode, ItemTypeCode ORDER BY PriceDate DESC) AS RowNum
FROM prItemBasePrice FROM prItemBasePrice
) prFilteredBasePrice ) prFilteredBasePrice
ON prFilteredBasePrice.ItemCode = S.ItemCode ON UPPER(LTRIM(RTRIM(prFilteredBasePrice.ItemCode))) = UPPER(LTRIM(RTRIM(S.ItemCode)))
AND prFilteredBasePrice.ItemTypeCode = S.ItemTypeCode AND prFilteredBasePrice.ItemTypeCode = S.ItemTypeCode
AND prFilteredBasePrice.RowNum = 1 AND prFilteredBasePrice.RowNum = 1
WHERE WHERE
S.ItemTypeCode IN (1) S.ItemTypeCode IN (1)
AND S.ItemCode = @ProductCode AND UPPER(LTRIM(RTRIM(S.ItemCode))) = @ProductCode
AND LEN(S.ItemCode) = 13 AND LEN(LTRIM(RTRIM(S.ItemCode))) = 13
AND LEN(@ProductCode) = 13 AND LEN(@ProductCode) = 13
AND ( AND (
S.InventoryQty1 S.InventoryQty1
@@ -234,6 +234,6 @@ WHERE
( (
'1-0-14','1-0-10','1-0-8','1-2-5','1-2-4','1-0-12','100','1-0-28', '1-0-14','1-0-10','1-0-8','1-2-5','1-2-4','1-0-12','100','1-0-28',
'1-0-24','1-2-6','1-1-14','1-0-2','1-0-52','1-1-2','1-0-21','1-1-3', '1-0-24','1-2-6','1-1-14','1-0-2','1-0-52','1-1-2','1-0-21','1-1-3',
'1-0-33','101','1-014','1-0-49','1-0-36' '1-0-33','101','1-014','1-0-49','1-0-36','1-0-4','1-0-29'
); );
` `
+48 -48
View File
@@ -28,7 +28,7 @@ IF OBJECT_ID('dbo.ProductFilterTRCache','U') IS NOT NULL
BEGIN BEGIN
INSERT INTO #AttrBase (ProductCode, Kategori, UrunAnaGrubu, UrunAltGrubu, UrunIcerigi, Fit, DropVal) INSERT INTO #AttrBase (ProductCode, Kategori, UrunAnaGrubu, UrunAltGrubu, UrunIcerigi, Fit, DropVal)
SELECT SELECT
ProductCode, UPPER(LTRIM(RTRIM(ProductCode))) AS ProductCode,
Kategori = LTRIM(RTRIM(ProductAtt44Desc)), Kategori = LTRIM(RTRIM(ProductAtt44Desc)),
UrunAnaGrubu = LTRIM(RTRIM(ProductAtt01Desc)), UrunAnaGrubu = LTRIM(RTRIM(ProductAtt01Desc)),
UrunAltGrubu = LTRIM(RTRIM(ProductAtt02Desc)), UrunAltGrubu = LTRIM(RTRIM(ProductAtt02Desc)),
@@ -48,7 +48,7 @@ ELSE
BEGIN BEGIN
INSERT INTO #AttrBase (ProductCode, Kategori, UrunAnaGrubu, UrunAltGrubu, UrunIcerigi, Fit, DropVal) INSERT INTO #AttrBase (ProductCode, Kategori, UrunAnaGrubu, UrunAltGrubu, UrunIcerigi, Fit, DropVal)
SELECT SELECT
ProductCode, UPPER(LTRIM(RTRIM(ProductCode))) AS ProductCode,
Kategori = LTRIM(RTRIM(ProductAtt44Desc)), Kategori = LTRIM(RTRIM(ProductAtt44Desc)),
UrunAnaGrubu = LTRIM(RTRIM(ProductAtt01Desc)), UrunAnaGrubu = LTRIM(RTRIM(ProductAtt01Desc)),
UrunAltGrubu = LTRIM(RTRIM(ProductAtt02Desc)), UrunAltGrubu = LTRIM(RTRIM(ProductAtt02Desc)),
@@ -101,40 +101,40 @@ CREATE NONCLUSTERED INDEX IX_AttrBase_Filter ON #AttrBase(Kategori, UrunAnaGrubu
FROM FROM
( (
SELECT SELECT
P.ItemCode, P.ColorCode, P.ItemDim1Code, P.ItemDim2Code, UPPER(LTRIM(RTRIM(P.ItemCode))) AS ItemCode, P.ColorCode, P.ItemDim1Code, P.ItemDim2Code,
P.Qty1 AS PickingQty1, 0 AS ReserveQty1, 0 AS DispOrderQty1, 0 AS InventoryQty1 P.Qty1 AS PickingQty1, 0 AS ReserveQty1, 0 AS DispOrderQty1, 0 AS InventoryQty1
FROM PickingStates P FROM PickingStates P
INNER JOIN #AttrBase AB ON AB.ProductCode = P.ItemCode INNER JOIN #AttrBase AB ON AB.ProductCode = UPPER(LTRIM(RTRIM(P.ItemCode)))
WHERE P.ItemTypeCode = 1 WHERE P.ItemTypeCode = 1
AND LEN(P.ItemCode) = 13 AND LEN(LTRIM(RTRIM(P.ItemCode))) = 13
UNION ALL UNION ALL
SELECT SELECT
R.ItemCode, R.ColorCode, R.ItemDim1Code, R.ItemDim2Code, UPPER(LTRIM(RTRIM(R.ItemCode))) AS ItemCode, R.ColorCode, R.ItemDim1Code, R.ItemDim2Code,
0, R.Qty1, 0, 0 0, R.Qty1, 0, 0
FROM ReserveStates R FROM ReserveStates R
INNER JOIN #AttrBase AB ON AB.ProductCode = R.ItemCode INNER JOIN #AttrBase AB ON AB.ProductCode = UPPER(LTRIM(RTRIM(R.ItemCode)))
WHERE R.ItemTypeCode = 1 WHERE R.ItemTypeCode = 1
AND LEN(R.ItemCode) = 13 AND LEN(LTRIM(RTRIM(R.ItemCode))) = 13
UNION ALL UNION ALL
SELECT SELECT
D.ItemCode, D.ColorCode, D.ItemDim1Code, D.ItemDim2Code, UPPER(LTRIM(RTRIM(D.ItemCode))) AS ItemCode, D.ColorCode, D.ItemDim1Code, D.ItemDim2Code,
0, 0, D.Qty1, 0 0, 0, D.Qty1, 0
FROM DispOrderStates D FROM DispOrderStates D
INNER JOIN #AttrBase AB ON AB.ProductCode = D.ItemCode INNER JOIN #AttrBase AB ON AB.ProductCode = UPPER(LTRIM(RTRIM(D.ItemCode)))
WHERE D.ItemTypeCode = 1 WHERE D.ItemTypeCode = 1
AND LEN(D.ItemCode) = 13 AND LEN(LTRIM(RTRIM(D.ItemCode))) = 13
UNION ALL UNION ALL
SELECT SELECT
T.ItemCode, T.ColorCode, T.ItemDim1Code, T.ItemDim2Code, UPPER(LTRIM(RTRIM(T.ItemCode))) AS ItemCode, T.ColorCode, T.ItemDim1Code, T.ItemDim2Code,
0, 0, 0, SUM(T.In_Qty1 - T.Out_Qty1) 0, 0, 0, SUM(T.In_Qty1 - T.Out_Qty1)
FROM trStock T FROM trStock T
INNER JOIN #AttrBase AB ON AB.ProductCode = T.ItemCode INNER JOIN #AttrBase AB ON AB.ProductCode = UPPER(LTRIM(RTRIM(T.ItemCode)))
WHERE T.ItemTypeCode = 1 WHERE T.ItemTypeCode = 1
AND LEN(T.ItemCode) = 13 AND LEN(LTRIM(RTRIM(T.ItemCode))) = 13
GROUP BY T.ItemCode, T.ColorCode, T.ItemDim1Code, T.ItemDim2Code GROUP BY UPPER(LTRIM(RTRIM(T.ItemCode))), T.ColorCode, T.ItemDim1Code, T.ItemDim2Code
) X ) X
GROUP BY X.ItemCode, X.ColorCode, X.ItemDim1Code, X.ItemDim2Code GROUP BY X.ItemCode, X.ColorCode, X.ItemDim1Code, X.ItemDim2Code
), ),
@@ -180,7 +180,7 @@ SELECT 'renk', X.FieldValue
FROM ( FROM (
SELECT DISTINCT FieldValue = CASE WHEN A.RenkAciklama <> '' THEN A.RenkAciklama ELSE A.Renk END SELECT DISTINCT FieldValue = CASE WHEN A.RenkAciklama <> '' THEN A.RenkAciklama ELSE A.Renk END
FROM Avail A FROM Avail A
INNER JOIN #AttrBase AB ON AB.ProductCode = A.ItemCode INNER JOIN #AttrBase AB ON AB.ProductCode = UPPER(LTRIM(RTRIM(A.ItemCode)))
WHERE (CASE WHEN A.RenkAciklama <> '' THEN A.RenkAciklama ELSE A.Renk END) <> '' WHERE (CASE WHEN A.RenkAciklama <> '' THEN A.RenkAciklama ELSE A.Renk END) <> ''
AND (@Kategori IS NULL OR AB.Kategori = @Kategori) AND (@Kategori IS NULL OR AB.Kategori = @Kategori)
AND (@UrunAnaGrubu IS NULL OR AB.UrunAnaGrubu = @UrunAnaGrubu) AND (@UrunAnaGrubu IS NULL OR AB.UrunAnaGrubu = @UrunAnaGrubu)
@@ -196,7 +196,7 @@ SELECT 'renk2', X.FieldValue
FROM ( FROM (
SELECT DISTINCT FieldValue = A.Renk2 SELECT DISTINCT FieldValue = A.Renk2
FROM Avail A FROM Avail A
INNER JOIN #AttrBase AB ON AB.ProductCode = A.ItemCode INNER JOIN #AttrBase AB ON AB.ProductCode = UPPER(LTRIM(RTRIM(A.ItemCode)))
WHERE A.Renk2 <> '' WHERE A.Renk2 <> ''
AND (@Kategori IS NULL OR AB.Kategori = @Kategori) AND (@Kategori IS NULL OR AB.Kategori = @Kategori)
AND (@UrunAnaGrubu IS NULL OR AB.UrunAnaGrubu = @UrunAnaGrubu) AND (@UrunAnaGrubu IS NULL OR AB.UrunAnaGrubu = @UrunAnaGrubu)
@@ -245,7 +245,7 @@ SELECT 'beden', X.FieldValue
FROM ( FROM (
SELECT DISTINCT FieldValue = A.Beden SELECT DISTINCT FieldValue = A.Beden
FROM Avail A FROM Avail A
INNER JOIN #AttrBase AB ON AB.ProductCode = A.ItemCode INNER JOIN #AttrBase AB ON AB.ProductCode = UPPER(LTRIM(RTRIM(A.ItemCode)))
WHERE A.Beden <> '' WHERE A.Beden <> ''
AND (@Kategori IS NULL OR AB.Kategori = @Kategori) AND (@Kategori IS NULL OR AB.Kategori = @Kategori)
AND (@UrunAnaGrubu IS NULL OR AB.UrunAnaGrubu = @UrunAnaGrubu) AND (@UrunAnaGrubu IS NULL OR AB.UrunAnaGrubu = @UrunAnaGrubu)
@@ -346,7 +346,7 @@ BEGIN
ProductAtt46Desc ProductAtt46Desc
) )
SELECT SELECT
C.ProductCode, UPPER(LTRIM(RTRIM(C.ProductCode))) AS ProductCode,
C.ProductDescription, C.ProductDescription,
C.ProductAtt01Desc, C.ProductAtt01Desc,
C.ProductAtt02Desc, C.ProductAtt02Desc,
@@ -379,7 +379,7 @@ BEGIN
ISNULL(PF.ProductAtt45Desc, '') AS ProductAtt45Desc, ISNULL(PF.ProductAtt45Desc, '') AS ProductAtt45Desc,
ISNULL(PF.ProductAtt46Desc, '') AS ProductAtt46Desc ISNULL(PF.ProductAtt46Desc, '') AS ProductAtt46Desc
FROM dbo.ProductFilterTRCache C FROM dbo.ProductFilterTRCache C
LEFT JOIN ProductFilterWithDescription('TR') PF ON PF.ProductCode = C.ProductCode LEFT JOIN ProductFilterWithDescription('TR') PF ON UPPER(LTRIM(RTRIM(PF.ProductCode))) = UPPER(LTRIM(RTRIM(C.ProductCode)))
WHERE LEN(C.ProductCode) = 13 WHERE LEN(C.ProductCode) = 13
AND (@Kategori IS NULL OR C.ProductAtt44Desc = @Kategori) AND (@Kategori IS NULL OR C.ProductAtt44Desc = @Kategori)
AND (@UrunAnaGrubu IS NULL OR C.ProductAtt01Desc = @UrunAnaGrubu) AND (@UrunAnaGrubu IS NULL OR C.ProductAtt01Desc = @UrunAnaGrubu)
@@ -390,9 +390,9 @@ BEGIN
END END
ELSE ELSE
BEGIN BEGIN
INSERT INTO #AttrFiltered INSERT INTO #AttrFiltered
( (
ProductCode, ProductCode,
ProductDescription, ProductDescription,
ProductAtt01Desc, ProductAtt01Desc,
ProductAtt02Desc, ProductAtt02Desc,
@@ -426,7 +426,7 @@ BEGIN
ProductAtt46Desc ProductAtt46Desc
) )
SELECT SELECT
ProductCode, UPPER(LTRIM(RTRIM(ProductCode))) AS ProductCode,
ProductDescription, ProductDescription,
ProductAtt01Desc, ProductAtt01Desc,
ProductAtt02Desc, ProductAtt02Desc,
@@ -493,69 +493,69 @@ INV AS
( (
SELECT SELECT
P.CompanyCode, P.OfficeCode, P.StoreTypeCode, P.StoreCode, P.WarehouseCode, P.CompanyCode, P.OfficeCode, P.StoreTypeCode, P.StoreCode, P.WarehouseCode,
P.ItemTypeCode, P.ItemCode, P.ColorCode, P.ItemDim1Code, P.ItemDim2Code, P.ItemDim3Code, P.ItemTypeCode, UPPER(LTRIM(RTRIM(P.ItemCode))) AS ItemCode, P.ColorCode, P.ItemDim1Code, P.ItemDim2Code, P.ItemDim3Code,
P.Qty1 AS PickingQty1, 0 AS ReserveQty1, 0 AS DispOrderQty1, 0 AS InventoryQty1 P.Qty1 AS PickingQty1, 0 AS ReserveQty1, 0 AS DispOrderQty1, 0 AS InventoryQty1
FROM PickingStates P FROM PickingStates P
INNER JOIN #AttrFiltered AF ON AF.ProductCode = P.ItemCode INNER JOIN #AttrFiltered AF ON AF.ProductCode = UPPER(LTRIM(RTRIM(P.ItemCode)))
WHERE P.ItemTypeCode = 1 WHERE P.ItemTypeCode = 1
AND LEN(P.ItemCode) = 13 AND LEN(LTRIM(RTRIM(P.ItemCode))) = 13
AND P.WarehouseCode IN AND P.WarehouseCode IN
( (
'1-0-14','1-0-10','1-0-8','1-2-5','1-2-4','1-0-12','100','1-0-28', '1-0-14','1-0-10','1-0-8','1-2-5','1-2-4','1-0-12','100','1-0-28',
'1-0-24','1-2-6','1-1-14','1-0-2','1-0-52','1-1-2','1-0-21','1-1-3', '1-0-24','1-2-6','1-1-14','1-0-2','1-0-52','1-1-2','1-0-21','1-1-3',
'1-0-33','101','1-014','1-0-49','1-0-36' '1-0-33','101','1-014','1-0-49','1-0-36','1-0-4','1-0-29'
) )
UNION ALL UNION ALL
SELECT SELECT
R.CompanyCode, R.OfficeCode, R.StoreTypeCode, R.StoreCode, R.WarehouseCode, R.CompanyCode, R.OfficeCode, R.StoreTypeCode, R.StoreCode, R.WarehouseCode,
R.ItemTypeCode, R.ItemCode, R.ColorCode, R.ItemDim1Code, R.ItemDim2Code, R.ItemDim3Code, R.ItemTypeCode, UPPER(LTRIM(RTRIM(R.ItemCode))) AS ItemCode, R.ColorCode, R.ItemDim1Code, R.ItemDim2Code, R.ItemDim3Code,
0, R.Qty1, 0, 0 0, R.Qty1, 0, 0
FROM ReserveStates R FROM ReserveStates R
INNER JOIN #AttrFiltered AF ON AF.ProductCode = R.ItemCode INNER JOIN #AttrFiltered AF ON AF.ProductCode = UPPER(LTRIM(RTRIM(R.ItemCode)))
WHERE R.ItemTypeCode = 1 WHERE R.ItemTypeCode = 1
AND LEN(R.ItemCode) = 13 AND LEN(LTRIM(RTRIM(R.ItemCode))) = 13
AND R.WarehouseCode IN AND R.WarehouseCode IN
( (
'1-0-14','1-0-10','1-0-8','1-2-5','1-2-4','1-0-12','100','1-0-28', '1-0-14','1-0-10','1-0-8','1-2-5','1-2-4','1-0-12','100','1-0-28',
'1-0-24','1-2-6','1-1-14','1-0-2','1-0-52','1-1-2','1-0-21','1-1-3', '1-0-24','1-2-6','1-1-14','1-0-2','1-0-52','1-1-2','1-0-21','1-1-3',
'1-0-33','101','1-014','1-0-49','1-0-36' '1-0-33','101','1-014','1-0-49','1-0-36','1-0-4','1-0-29'
) )
UNION ALL UNION ALL
SELECT SELECT
D.CompanyCode, D.OfficeCode, D.StoreTypeCode, D.StoreCode, D.WarehouseCode, D.CompanyCode, D.OfficeCode, D.StoreTypeCode, D.StoreCode, D.WarehouseCode,
D.ItemTypeCode, D.ItemCode, D.ColorCode, D.ItemDim1Code, D.ItemDim2Code, D.ItemDim3Code, D.ItemTypeCode, UPPER(LTRIM(RTRIM(D.ItemCode))) AS ItemCode, D.ColorCode, D.ItemDim1Code, D.ItemDim2Code, D.ItemDim3Code,
0, 0, D.Qty1, 0 0, 0, D.Qty1, 0
FROM DispOrderStates D FROM DispOrderStates D
INNER JOIN #AttrFiltered AF ON AF.ProductCode = D.ItemCode INNER JOIN #AttrFiltered AF ON AF.ProductCode = UPPER(LTRIM(RTRIM(D.ItemCode)))
WHERE D.ItemTypeCode = 1 WHERE D.ItemTypeCode = 1
AND LEN(D.ItemCode) = 13 AND LEN(LTRIM(RTRIM(D.ItemCode))) = 13
AND D.WarehouseCode IN AND D.WarehouseCode IN
( (
'1-0-14','1-0-10','1-0-8','1-2-5','1-2-4','1-0-12','100','1-0-28', '1-0-14','1-0-10','1-0-8','1-2-5','1-2-4','1-0-12','100','1-0-28',
'1-0-24','1-2-6','1-1-14','1-0-2','1-0-52','1-1-2','1-0-21','1-1-3', '1-0-24','1-2-6','1-1-14','1-0-2','1-0-52','1-1-2','1-0-21','1-1-3',
'1-0-33','101','1-014','1-0-49','1-0-36' '1-0-33','101','1-014','1-0-49','1-0-36','1-0-4','1-0-29'
) )
UNION ALL UNION ALL
SELECT SELECT
T.CompanyCode, T.OfficeCode, T.StoreTypeCode, T.StoreCode, T.WarehouseCode, T.CompanyCode, T.OfficeCode, T.StoreTypeCode, T.StoreCode, T.WarehouseCode,
T.ItemTypeCode, T.ItemCode, T.ColorCode, T.ItemDim1Code, T.ItemDim2Code, T.ItemDim3Code, T.ItemTypeCode, UPPER(LTRIM(RTRIM(T.ItemCode))) AS ItemCode, T.ColorCode, T.ItemDim1Code, T.ItemDim2Code, T.ItemDim3Code,
0, 0, 0, SUM(T.In_Qty1 - T.Out_Qty1) 0, 0, 0, SUM(T.In_Qty1 - T.Out_Qty1)
FROM trStock T FROM trStock T
INNER JOIN #AttrFiltered AF ON AF.ProductCode = T.ItemCode INNER JOIN #AttrFiltered AF ON AF.ProductCode = UPPER(LTRIM(RTRIM(T.ItemCode)))
WHERE T.ItemTypeCode = 1 WHERE T.ItemTypeCode = 1
AND LEN(T.ItemCode) = 13 AND LEN(LTRIM(RTRIM(T.ItemCode))) = 13
AND T.WarehouseCode IN AND T.WarehouseCode IN
( (
'1-0-14','1-0-10','1-0-8','1-2-5','1-2-4','1-0-12','100','1-0-28', '1-0-14','1-0-10','1-0-8','1-2-5','1-2-4','1-0-12','100','1-0-28',
'1-0-24','1-2-6','1-1-14','1-0-2','1-0-52','1-1-2','1-0-21','1-1-3', '1-0-24','1-2-6','1-1-14','1-0-2','1-0-52','1-1-2','1-0-21','1-1-3',
'1-0-33','101','1-014','1-0-49','1-0-36' '1-0-33','101','1-014','1-0-49','1-0-36','1-0-4','1-0-29'
) )
GROUP BY GROUP BY
T.CompanyCode, T.OfficeCode, T.StoreTypeCode, T.StoreCode, T.WarehouseCode, T.CompanyCode, T.OfficeCode, T.StoreTypeCode, T.StoreCode, T.WarehouseCode,
T.ItemTypeCode, T.ItemCode, T.ColorCode, T.ItemDim1Code, T.ItemDim2Code, T.ItemDim3Code T.ItemTypeCode, UPPER(LTRIM(RTRIM(T.ItemCode))), T.ColorCode, T.ItemDim1Code, T.ItemDim2Code, T.ItemDim3Code
) X ) X
GROUP BY GROUP BY
X.CompanyCode, X.OfficeCode, X.StoreTypeCode, X.StoreCode, X.WarehouseCode, X.CompanyCode, X.OfficeCode, X.StoreTypeCode, X.StoreCode, X.WarehouseCode,
@@ -580,21 +580,21 @@ Avail AS
FROM INV I FROM INV I
JOIN cdItem CI JOIN cdItem CI
ON CI.ItemTypeCode = I.ItemTypeCode ON CI.ItemTypeCode = I.ItemTypeCode
AND CI.ItemCode = I.ItemCode AND UPPER(LTRIM(RTRIM(CI.ItemCode))) = I.ItemCode
LEFT JOIN cdUnitOfMeasure U LEFT JOIN cdUnitOfMeasure U
ON U.UnitOfMeasureCode = CI.UnitOfMeasureCode1 ON U.UnitOfMeasureCode = CI.UnitOfMeasureCode1
LEFT JOIN cdColorDesc C LEFT JOIN cdColorDesc C
ON C.ColorCode = I.ColorCode ON C.ColorCode = I.ColorCode
AND C.LangCode = 'TR' AND C.LangCode = 'TR'
WHERE I.ItemTypeCode = 1 WHERE I.ItemTypeCode = 1
AND LEN(I.ItemCode) = 13 AND LEN(LTRIM(RTRIM(I.ItemCode))) = 13
AND (I.InventoryQty1 - I.PickingQty1 - I.ReserveQty1 - I.DispOrderQty1) > 0 AND (I.InventoryQty1 - I.PickingQty1 - I.ReserveQty1 - I.DispOrderQty1) > 0
AND CI.IsBlocked = 0 AND CI.IsBlocked = 0
AND I.WarehouseCode IN AND I.WarehouseCode IN
( (
'1-0-14','1-0-10','1-0-8','1-2-5','1-2-4','1-0-12','100','1-0-28', '1-0-14','1-0-10','1-0-8','1-2-5','1-2-4','1-0-12','100','1-0-28',
'1-0-24','1-2-6','1-1-14','1-0-2','1-0-52','1-1-2','1-0-21','1-1-3', '1-0-24','1-2-6','1-1-14','1-0-2','1-0-52','1-1-2','1-0-21','1-1-3',
'1-0-33','101','1-014','1-0-49','1-0-36' '1-0-33','101','1-014','1-0-49','1-0-36','1-0-4','1-0-29'
) )
), ),
Grouped AS Grouped AS
@@ -604,7 +604,7 @@ Grouped AS
A.ColorCode, A.ColorCode,
A.ItemDim2Code A.ItemDim2Code
FROM Avail A FROM Avail A
INNER JOIN #AttrFiltered AF ON AF.ProductCode = A.ItemCode INNER JOIN #AttrFiltered AF ON AF.ProductCode = UPPER(LTRIM(RTRIM(A.ItemCode)))
WHERE (@RenkList IS NULL OR CHARINDEX(NCHAR(31) + ISNULL((CASE WHEN A.RenkAciklama <> '' THEN A.RenkAciklama ELSE A.ColorCode END),'') + NCHAR(31), NCHAR(31) + @RenkList + NCHAR(31)) > 0) WHERE (@RenkList IS NULL OR CHARINDEX(NCHAR(31) + ISNULL((CASE WHEN A.RenkAciklama <> '' THEN A.RenkAciklama ELSE A.ColorCode END),'') + NCHAR(31), NCHAR(31) + @RenkList + NCHAR(31)) > 0)
AND (@Renk2List IS NULL OR CHARINDEX(NCHAR(31) + ISNULL(A.ItemDim2Code,'') + NCHAR(31), NCHAR(31) + @Renk2List + NCHAR(31)) > 0) AND (@Renk2List IS NULL OR CHARINDEX(NCHAR(31) + ISNULL(A.ItemDim2Code,'') + NCHAR(31), NCHAR(31) + @Renk2List + NCHAR(31)) > 0)
AND ( AND (
@@ -669,7 +669,7 @@ INNER JOIN Grouped G
AND G.ColorCode = A.ColorCode AND G.ColorCode = A.ColorCode
AND ISNULL(G.ItemDim2Code, '') = ISNULL(A.ItemDim2Code, '') AND ISNULL(G.ItemDim2Code, '') = ISNULL(A.ItemDim2Code, '')
INNER JOIN #AttrFiltered AF INNER JOIN #AttrFiltered AF
ON AF.ProductCode = A.ItemCode ON AF.ProductCode = UPPER(LTRIM(RTRIM(A.ItemCode)))
LEFT JOIN cdWarehouseDesc W LEFT JOIN cdWarehouseDesc W
ON W.WarehouseCode = A.WarehouseCode ON W.WarehouseCode = A.WarehouseCode
AND W.LangCode = 'TR' AND W.LangCode = 'TR'
@@ -680,8 +680,8 @@ OUTER APPLY (
SELECT TOP 1 Price SELECT TOP 1 Price
FROM prItemBasePrice PB FROM prItemBasePrice PB
WHERE PB.ItemTypeCode = 1 WHERE PB.ItemTypeCode = 1
AND PB.ItemCode = A.ItemCode AND UPPER(LTRIM(RTRIM(PB.ItemCode))) = UPPER(LTRIM(RTRIM(A.ItemCode)))
AND LEN(PB.ItemCode) = 13 AND LEN(LTRIM(RTRIM(PB.ItemCode))) = 13
ORDER BY PB.PriceDate DESC ORDER BY PB.PriceDate DESC
) P ) P
OPTION (RECOMPILE); OPTION (RECOMPILE);
@@ -1631,6 +1631,7 @@ const columns = [
{ name: 'sales_usd_total', label: 'Genel USD', field: 'sales_usd_total', align: 'right', sortable: true }, { name: 'sales_usd_total', label: 'Genel USD', field: 'sales_usd_total', align: 'right', sortable: true },
{ name: 'stock_days_90d', label: 'Stok Gün', field: row => formatNumber(row.stock_days_90d, 1), align: 'right', sortable: true }, { name: 'stock_days_90d', label: 'Stok Gün', field: row => formatNumber(row.stock_days_90d, 1), align: 'right', sortable: true },
{ name: 'stock_days_180d', label: '180G Stok Gün', field: row => formatNumber(row.stock_days_180d, 1), align: 'right', sortable: true }, { name: 'stock_days_180d', label: '180G Stok Gün', field: row => formatNumber(row.stock_days_180d, 1), align: 'right', sortable: true },
{ name: 'stock_days_365d', label: '360G Stok Gün', field: row => formatNumber(row.stock_days_365d, 1), align: 'right', sortable: true },
{ name: 'stock_days_total', label: 'Genel Stok Gün', field: row => formatNumber(row.stock_days_total, 1), align: 'right', sortable: true }, { name: 'stock_days_total', label: 'Genel Stok Gün', field: row => formatNumber(row.stock_days_total, 1), align: 'right', sortable: true },
{ name: 'stock_turnover_90d', label: '90G Stok Devir', field: row => formatNumber(row.stock_turnover_90d, 2), align: 'right', sortable: true }, { name: 'stock_turnover_90d', label: '90G Stok Devir', field: row => formatNumber(row.stock_turnover_90d, 2), align: 'right', sortable: true },
{ name: 'stock_turnover_180d', label: '180G Stok Devir', field: row => formatNumber(row.stock_turnover_180d, 2), align: 'right', sortable: true }, { name: 'stock_turnover_180d', label: '180G Stok Devir', field: row => formatNumber(row.stock_turnover_180d, 2), align: 'right', sortable: true },
@@ -2821,13 +2822,15 @@ function productPeriodMetricSource (row, suffix) {
const salesIndex = Number(row?.[`sales_index_${suffix}`] || 0) const salesIndex = Number(row?.[`sales_index_${suffix}`] || 0)
const qty = Number(row?.[`sales_qty_${suffix}`] || 0) const qty = Number(row?.[`sales_qty_${suffix}`] || 0)
const stockQty = Number(row?.stock_qty || 0) const stockQty = Number(row?.stock_qty || 0)
const turnoverKey = `stock_turnover_${suffix}`
const hasTurnover = Object.prototype.hasOwnProperty.call(row || {}, turnoverKey)
return { return {
sales_index_90d: salesIndex, sales_index_90d: salesIndex,
gross_margin_cost_90d: Number(row?.[`gross_margin_cost_${suffix}`] ?? 0), gross_margin_cost_90d: Number(row?.[`gross_margin_cost_${suffix}`] ?? 0),
gross_margin_90d: Number(row?.[`gross_margin_${suffix}`] ?? 0), gross_margin_90d: Number(row?.[`gross_margin_${suffix}`] ?? 0),
invoice_count_90d: Number(row?.[`invoice_count_${suffix}`] || 0), invoice_count_90d: Number(row?.[`invoice_count_${suffix}`] || 0),
sales_qty_90d: qty, sales_qty_90d: qty,
stock_turnover_90d: Number(row?.[`stock_turnover_${suffix}`] || 0) || (stockQty > 0 ? qty / stockQty : 0), stock_turnover_90d: hasTurnover ? Number(row?.[turnoverKey] || 0) : (stockQty > 0 ? qty / stockQty : 0),
stock_qty: stockQty stock_qty: stockQty
} }
} }
@@ -3115,9 +3118,9 @@ function withProductMargins (row) {
return { return {
...row, ...row,
avg_price_usd_365d: Number(row?.sales_qty_365d || 0) > 0 ? Number(row?.sales_usd_365d || 0) / Number(row?.sales_qty_365d || 0) : 0, avg_price_usd_365d: Number(row?.sales_qty_365d || 0) > 0 ? Number(row?.sales_usd_365d || 0) / Number(row?.sales_qty_365d || 0) : 0,
stock_turnover_90d: stockTurnover(row?.sales_qty_90d, row?.stock_qty), stock_turnover_90d: existingOrStockTurnover(row?.stock_turnover_90d, row?.sales_qty_90d, row?.stock_qty),
stock_turnover_180d: stockTurnover(row?.sales_qty_180d, row?.stock_qty), stock_turnover_180d: existingOrStockTurnover(row?.stock_turnover_180d, row?.sales_qty_180d, row?.stock_qty),
stock_turnover_365d: stockTurnover(row?.sales_qty_365d, row?.stock_qty), stock_turnover_365d: existingOrStockTurnover(row?.stock_turnover_365d, row?.sales_qty_365d, row?.stock_qty),
gross_margin_base_90d: marginFromSalesCost(row?.sales_usd_90d, row?.sales_qty_90d, row?.base_price_usd), gross_margin_base_90d: marginFromSalesCost(row?.sales_usd_90d, row?.sales_qty_90d, row?.base_price_usd),
gross_margin_cost_90d: marginFromSalesCost(row?.sales_usd_90d, row?.sales_qty_90d, row?.cost_price_usd), gross_margin_cost_90d: marginFromSalesCost(row?.sales_usd_90d, row?.sales_qty_90d, row?.cost_price_usd),
gross_margin_base_180d: marginFromSalesCost(row?.sales_usd_180d, row?.sales_qty_180d, row?.base_price_usd), gross_margin_base_180d: marginFromSalesCost(row?.sales_usd_180d, row?.sales_qty_180d, row?.base_price_usd),
@@ -3128,7 +3131,7 @@ function withProductMargins (row) {
function withGeneralMargins (row) { function withGeneralMargins (row) {
return { return {
...row, ...row,
stock_turnover_total: stockTurnover(row?.sales_qty_total, row?.stock_qty), stock_turnover_total: existingOrStockTurnover(row?.stock_turnover_total, row?.sales_qty_total, row?.stock_qty),
gross_margin_base_total: marginFromSalesCost(row?.sales_usd_total, row?.sales_qty_total, row?.base_price_usd), gross_margin_base_total: marginFromSalesCost(row?.sales_usd_total, row?.sales_qty_total, row?.base_price_usd),
gross_margin_cost_total: marginFromSalesCost(row?.sales_usd_total, row?.sales_qty_total, row?.cost_price_usd) gross_margin_cost_total: marginFromSalesCost(row?.sales_usd_total, row?.sales_qty_total, row?.cost_price_usd)
} }
@@ -3140,6 +3143,11 @@ function stockTurnover (salesQty, stockQty) {
return Number(salesQty || 0) / stock return Number(salesQty || 0) / stock
} }
function existingOrStockTurnover (value, salesQty, stockQty) {
const current = Number(value)
return value !== undefined && value !== null && Number.isFinite(current) ? current : stockTurnover(salesQty, stockQty)
}
function filterKey (tableKey, name) { function filterKey (tableKey, name) {
return `${tableKey}:${name}` return `${tableKey}:${name}`
} }