|
|
|
@@ -848,8 +848,39 @@ fun searchMaterialStockOutTraceabilityReport( |
|
|
|
sl.itemId, |
|
|
|
COALESCE(il_in.id, il_out.id) AS lotId, |
|
|
|
SUM(CASE WHEN DATE(sl.date) < :fromDate THEN COALESCE(sl.inQty, 0) - COALESCE(sl.outQty, 0) ELSE 0 END) AS openingBalance, |
|
|
|
SUM(CASE WHEN DATE(sl.date) BETWEEN :fromDate AND :toDate THEN COALESCE(sl.inQty, 0) ELSE 0 END) AS cumStockIn, |
|
|
|
SUM(CASE WHEN DATE(sl.date) BETWEEN :fromDate AND :toDate THEN COALESCE(sl.outQty, 0) ELSE 0 END) AS cumStockOut, |
|
|
|
SUM( |
|
|
|
CASE |
|
|
|
WHEN DATE(sl.date) BETWEEN :fromDate AND :toDate |
|
|
|
AND sil.stockTakeLineId IS NULL -- 不是「由盤點」產生的入庫 |
|
|
|
THEN COALESCE(sl.inQty, 0) |
|
|
|
ELSE 0 |
|
|
|
END |
|
|
|
) AS cumStockIn, |
|
|
|
|
|
|
|
-- 累計付出量:排除 type = 'stocktake' 的出庫 (專門的盤點出庫) |
|
|
|
SUM( |
|
|
|
CASE |
|
|
|
WHEN DATE(sl.date) BETWEEN :fromDate AND :toDate |
|
|
|
AND COALESCE(sl.outQty, 0) > 0 |
|
|
|
AND NOT ( |
|
|
|
-- 1) 盤點正式出庫 |
|
|
|
LOWER(TRIM(COALESCE(sl.type, ''))) = 'stocktake' |
|
|
|
-- 2) 盤點差異調整出庫(你已經算在 cumStockOutAdjStockTake) |
|
|
|
OR ( |
|
|
|
LOWER(TRIM(COALESCE(sl.type, ''))) = 'adj' |
|
|
|
AND (sol.stockTransferId IS NULL OR sol.id IS NULL) |
|
|
|
) |
|
|
|
-- 3) 錯誤輸入或遺失出庫 |
|
|
|
OR LOWER(TRIM(COALESCE(sl.type, ''))) = 'miss' |
|
|
|
OR LOWER(TRIM(COALESCE(sol.type, ''))) = 'miss' |
|
|
|
-- 4) 不良品棄置出庫 |
|
|
|
OR LOWER(TRIM(COALESCE(sl.type, ''))) = 'bad' |
|
|
|
OR LOWER(TRIM(COALESCE(sol.type, ''))) = 'bad' |
|
|
|
) |
|
|
|
THEN COALESCE(sl.outQty, 0) |
|
|
|
ELSE 0 |
|
|
|
END |
|
|
|
) AS cumStockOut, |
|
|
|
SUM(CASE WHEN DATE(sl.date) <= :toDate THEN COALESCE(sl.inQty, 0) - COALESCE(sl.outQty, 0) ELSE 0 END) AS currentBalance, |
|
|
|
MAX(CASE WHEN COALESCE(sl.inQty, 0) > 0 THEN sl.date END) AS lastInDate, |
|
|
|
MAX(CASE WHEN COALESCE(sl.outQty, 0) > 0 THEN sl.date END) AS lastOutDate, |
|
|
|
|