diff --git a/svc/queries/product_performance.go b/svc/queries/product_performance.go index 79bb305..158dbe7 100644 --- a/svc/queries/product_performance.go +++ b/svc/queries/product_performance.go @@ -48,6 +48,165 @@ type ProductPerformanceRefreshResult struct { DurationMS int64 `json:"duration_ms"` } +func productPerformanceStockQuery() string { + return ` +;WITH ActiveWarehouses AS ( + SELECT WarehouseCode + FROM (VALUES + ('1-0-12'),('1.01.2014'),('1.02.2005'),('1.02.2004'),('1-0-43'), + ('4.02.2001'),('1-0-55'),('1.01.2003'),('1-0-21'),('1-0-2'), + ('1.01.2004'),('1-0-49'),('1-0-37'),('1-0-29'),('1-0-28'), + ('1-0-10'),('100'),('1.02.2006'),('1-0-42'),('1.01.2002'), + ('1-0-52') + ) W(WarehouseCode) +), +Raw AS ( + SELECT + ProductCode = LTRIM(RTRIM(S.ItemCode)), + ColorCode = LTRIM(RTRIM(ISNULL(S.ColorCode, ''))), + YakaKodu = LTRIM(RTRIM(ISNULL(S.ItemDim2Code, ''))), + MovementDate = CAST(S.DocumentDate AS date), + ProcessCode = CASE + WHEN LTRIM(RTRIM(ISNULL(S.ProcessCode, ''))) <> '' THEN LTRIM(RTRIM(S.ProcessCode)) + ELSE LTRIM(RTRIM(ISNULL(S.InnerProcessCode, ''))) + END, + InQty = SUM(S.In_Qty1), + OutQty = SUM(S.Out_Qty1), + NetQty = SUM(S.InventoryQty1) + FROM StockWithCost S WITH(NOLOCK) + INNER JOIN ActiveWarehouses W + ON W.WarehouseCode = LTRIM(RTRIM(S.WarehouseCode)) + WHERE S.ItemTypeCode = 1 + AND ( + LEN(LTRIM(RTRIM(S.ItemCode))) = 13 + AND ( + S.ItemCode LIKE 'S%' + OR S.ItemCode LIKE 'O%' + OR S.ItemCode LIKE 'N%' + OR S.ItemCode LIKE 'X%' + OR S.ItemCode LIKE 'I%' + OR S.ItemCode LIKE 'A%' + ) + ) + AND (@p3 = '' OR S.ItemCode LIKE @p3 + '%') + AND S.DocumentDate < DATEADD(DAY, 1, @p2) + GROUP BY + S.ItemCode, + S.ColorCode, + S.ItemDim2Code, + CAST(S.DocumentDate AS date), + CASE + WHEN LTRIM(RTRIM(ISNULL(S.ProcessCode, ''))) <> '' THEN LTRIM(RTRIM(S.ProcessCode)) + ELSE LTRIM(RTRIM(ISNULL(S.InnerProcessCode, ''))) + END +), +Opening AS ( + SELECT + StockDate = @p1, + ProductCode, + ColorCode, + YakaKodu, + NetQty = SUM(NetQty), + InQty = CAST(0 AS decimal(18,4)), + OutQty = CAST(0 AS decimal(18,4)), + KpiInQty = CAST(0 AS decimal(18,4)), + KpiOutQty = CAST(0 AS decimal(18,4)), + SalesMovementQty = CAST(0 AS decimal(18,4)), + ProductionInQty = CAST(0 AS decimal(18,4)), + PurchaseInQty = CAST(0 AS decimal(18,4)), + ConsumptionOutQty = CAST(0 AS decimal(18,4)), + CountDiffQty = CAST(0 AS decimal(18,4)) + FROM Raw + WHERE MovementDate < @p1 + GROUP BY ProductCode, ColorCode, YakaKodu +), +Daily AS ( + SELECT + StockDate = MovementDate, + ProductCode, + ColorCode, + YakaKodu, + NetQty = SUM(NetQty), + InQty = SUM(InQty), + OutQty = SUM(OutQty), + KpiInQty = SUM(CASE WHEN ProcessCode IN ('OP','BP','CI') THEN InQty ELSE 0 END), + KpiOutQty = SUM(CASE WHEN ProcessCode IN ('R','WS','OC','CO') THEN OutQty ELSE 0 END), + SalesMovementQty = SUM(CASE WHEN ProcessCode IN ('R','WS') THEN OutQty ELSE 0 END), + ProductionInQty = SUM(CASE WHEN ProcessCode = 'OP' THEN InQty ELSE 0 END), + PurchaseInQty = SUM(CASE WHEN ProcessCode = 'BP' THEN InQty ELSE 0 END), + ConsumptionOutQty = SUM(CASE WHEN ProcessCode = 'OC' THEN OutQty ELSE 0 END), + CountDiffQty = SUM(CASE WHEN ProcessCode IN ('CO','CI') THEN NetQty ELSE 0 END) + FROM Raw + WHERE MovementDate BETWEEN @p1 AND @p2 + GROUP BY MovementDate, ProductCode, ColorCode, YakaKodu +), +Series AS ( + SELECT * FROM Opening + UNION ALL + SELECT * FROM Daily +), +Collapsed AS ( + SELECT + StockDate, + ProductCode, + ColorCode, + YakaKodu, + NetQty = SUM(NetQty), + InQty = SUM(InQty), + OutQty = SUM(OutQty), + KpiInQty = SUM(KpiInQty), + KpiOutQty = SUM(KpiOutQty), + SalesMovementQty = SUM(SalesMovementQty), + ProductionInQty = SUM(ProductionInQty), + PurchaseInQty = SUM(PurchaseInQty), + ConsumptionOutQty = SUM(ConsumptionOutQty), + CountDiffQty = SUM(CountDiffQty) + FROM Series + GROUP BY StockDate, ProductCode, ColorCode, YakaKodu +), +Running AS ( + SELECT + StockDate, + ProductCode, + ColorCode, + YakaKodu, + StockQty = SUM(NetQty) OVER ( + PARTITION BY ProductCode, ColorCode, YakaKodu + ORDER BY StockDate + ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW + ), + InQty, + OutQty, + KpiInQty, + KpiOutQty, + SalesMovementQty, + ProductionInQty, + PurchaseInQty, + ConsumptionOutQty, + CountDiffQty + FROM Collapsed +) +SELECT + StockDate, + ProductCode, + ColorCode, + YakaKodu, + StockQty, + InQty, + OutQty, + KpiInQty, + KpiOutQty, + SalesMovementQty, + ProductionInQty, + PurchaseInQty, + ConsumptionOutQty, + CountDiffQty +FROM Running +WHERE StockDate BETWEEN @p1 AND @p2 +ORDER BY StockDate, ProductCode, ColorCode, YakaKodu +` +} + func EnsureProductPerformanceTables(pg *sql.DB) error { stmts := []string{ ` @@ -455,7 +614,7 @@ DO UPDATE SET func refreshProductPerformanceStock(ctx context.Context, tx *sql.Tx, startDate, endDate time.Time, productPrefix string) (int, error) { log.Printf("[ProductPerformanceRefresh] stock mssql query start start=%s end=%s prefix=%s", startDate.Format("2006-01-02"), endDate.Format("2006-01-02"), productPrefix) - rows, err := db.MssqlDB.QueryContext(ctx, productPerformanceStockSQL(), startDate, endDate, productPrefix) + rows, err := db.MssqlDB.QueryContext(ctx, productPerformanceStockQuery(), startDate, endDate, productPrefix) if err != nil { return 0, err } @@ -512,7 +671,7 @@ func refreshProductPerformanceStockChunked(ctx context.Context, pg *sql.DB, star log.Printf("[ProductPerformanceRefresh] stock refresh start") log.Printf("[ProductPerformanceRefresh] stock mssql query start start=%s end=%s prefix=%s", startDate.Format("2006-01-02"), endDate.Format("2006-01-02"), productPrefix) - rows, err := db.MssqlDB.QueryContext(ctx, productPerformanceStockSQL(), startDate, endDate, productPrefix) + rows, err := db.MssqlDB.QueryContext(ctx, productPerformanceStockQuery(), startDate, endDate, productPrefix) if err != nil { return 0, err } diff --git a/svc/queries/product_performance_sql.go b/svc/queries/product_performance_sql.go index 3b75e64..f576f1e 100644 --- a/svc/queries/product_performance_sql.go +++ b/svc/queries/product_performance_sql.go @@ -211,7 +211,7 @@ GROUP BY SalesDate, ProductCode, ColorCode, YakaKodu, ChannelCode, CustomerCount ` } -func productPerformanceStockSQL() string { +func productPerformanceStockSQLUnused() string { return ` ;WITH ActiveWarehouses AS ( SELECT WarehouseCode