| @@ -848,8 +848,39 @@ fun searchMaterialStockOutTraceabilityReport( | |||||
| sl.itemId, | sl.itemId, | ||||
| COALESCE(il_in.id, il_out.id) AS lotId, | 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) < :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, | 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.inQty, 0) > 0 THEN sl.date END) AS lastInDate, | ||||
| MAX(CASE WHEN COALESCE(sl.outQty, 0) > 0 THEN sl.date END) AS lastOutDate, | MAX(CASE WHEN COALESCE(sl.outQty, 0) > 0 THEN sl.date END) AS lastOutDate, | ||||