From 474c4d95bdc0c853da3c150cab8409b34c44271d Mon Sep 17 00:00:00 2001 From: "Tommy\\2Fi-Staff" Date: Mon, 30 Mar 2026 19:42:56 +0800 Subject: [PATCH] update --- .../modules/report/service/ReportService.kt | 116 ++++++++++-------- 1 file changed, 63 insertions(+), 53 deletions(-) diff --git a/src/main/java/com/ffii/fpsms/modules/report/service/ReportService.kt b/src/main/java/com/ffii/fpsms/modules/report/service/ReportService.kt index b86bf04..424625a 100644 --- a/src/main/java/com/ffii/fpsms/modules/report/service/ReportService.kt +++ b/src/main/java/com/ffii/fpsms/modules/report/service/ReportService.kt @@ -1501,7 +1501,12 @@ return result AND DATE(sl.date) <= p.d0 ), item_scope AS ( - SELECT it.id AS itemId, it.code AS itemNo, it.name AS itemName, it.type AS itemType + SELECT + it.id AS itemId, + it.code AS itemNo, + it.name AS itemName, + it.type AS itemType, + COALESCE(CAST(NULLIF(it.AverageUnitPrice, '') AS DECIMAL(14, 4)), 0) AS avgUnitPriceRaw FROM items it INNER JOIN ledger_item_ids li ON li.itemId = it.id WHERE it.deleted = 0 @@ -1568,51 +1573,55 @@ return result AND DATE(sl.date) <= p.d0 GROUP BY sl.itemId ), - is_bom_item AS ( + ledger_moves AS ( SELECT - it.id AS itemId, - CASE WHEN EXISTS ( - SELECT 1 FROM bom b - WHERE b.deleted = 0 AND b.itemId = it.id - ) THEN 1 ELSE 0 END AS isBom - FROM items it - WHERE it.deleted = 0 - ), - bom_price AS ( - SELECT - dol.itemId, - SUM(COALESCE(dol.qty, 0) * COALESCE(dol.up, (dol.price / NULLIF(dol.qty, 0)), dol.price, 0)) AS amtSum, - SUM(COALESCE(dol.qty, 0)) AS qtySum - FROM delivery_order_line dol - WHERE dol.deleted = 0 - AND dol.itemId IS NOT NULL - AND COALESCE(dol.qty, 0) > 0 - GROUP BY dol.itemId - ), - non_bom_price AS ( - SELECT - pol.itemId, - SUM(COALESCE(pol.qty, 0) * COALESCE(pol.up, (pol.price / NULLIF(pol.qty, 0)), pol.price, 0)) AS amtSum, - SUM(COALESCE(pol.qty, 0)) AS qtySum - FROM purchase_order_line pol - WHERE pol.deleted = 0 - AND pol.itemId IS NOT NULL - AND COALESCE(pol.qty, 0) > 0 - GROUP BY pol.itemId - ), - avg_price_per_item AS ( - SELECT - s.itemId, - CASE - WHEN COALESCE(b.isBom, 0) = 1 THEN - CASE WHEN COALESCE(bp.qtySum, 0) > 0 THEN (bp.amtSum / bp.qtySum) ELSE 0 END - ELSE - CASE WHEN COALESCE(np.qtySum, 0) > 0 THEN (np.amtSum / np.qtySum) ELSE 0 END - END AS avgUnitPriceRaw - FROM item_scope s - LEFT JOIN is_bom_item b ON b.itemId = s.itemId - LEFT JOIN bom_price bp ON bp.itemId = s.itemId - LEFT JOIN non_bom_price np ON np.itemId = s.itemId + sl.itemId, + SUM( + CASE + WHEN UPPER(TRIM(COALESCE(sl.type, ''))) IN ('NOR', 'ADJ') + AND COALESCE(sl.inQty, 0) > 0 + THEN COALESCE(sl.inQty, 0) + ELSE 0 + END + ) AS cumStockIn, + SUM( + CASE + WHEN UPPER(TRIM(COALESCE(sl.type, ''))) IN ('NOR', 'ADJ') + AND COALESCE(sl.outQty, 0) > 0 + THEN COALESCE(sl.outQty, 0) + ELSE 0 + END + ) AS cumStockOut, + SUM( + CASE + WHEN UPPER(TRIM(COALESCE(sl.type, ''))) = 'MISS' + AND COALESCE(sl.outQty, 0) > 0 + THEN COALESCE(sl.outQty, 0) + ELSE 0 + END + ) AS misInputAndLost, + SUM( + CASE + WHEN UPPER(TRIM(COALESCE(sl.type, ''))) = 'BAD' + AND COALESCE(sl.outQty, 0) > 0 + THEN COALESCE(sl.outQty, 0) + ELSE 0 + END + ) AS defectiveGoods, + SUM( + CASE + WHEN UPPER(TRIM(COALESCE(sl.type, ''))) = 'TKE' + THEN COALESCE(sl.inQty, 0) - COALESCE(sl.outQty, 0) + ELSE 0 + END + ) AS variance + FROM stock_ledger sl + INNER JOIN params p ON 1=1 + WHERE sl.deleted = 0 + AND sl.itemId IS NOT NULL + AND DATE(sl.date) > p.d1 + AND DATE(sl.date) <= p.d0 + GROUP BY sl.itemId ) SELECT '' AS stockSubCategory, @@ -1632,22 +1641,22 @@ return result COALESCE(op.openingBalance, 0) AS openingBalanceRaw, COALESCE(cp.currentBalance, 0) AS currentBalanceRaw, CASE WHEN COALESCE(op.openingBalance, 0) < 0 THEN CONCAT('(', FORMAT(-op.openingBalance, 0), ')') ELSE FORMAT(COALESCE(op.openingBalance, 0), 0) END AS totalOpeningBalance, - '0' AS totalCumStockIn, - '0' AS totalCumStockOut, + CASE WHEN COALESCE(lm.cumStockIn, 0) < 0 THEN CONCAT('(', FORMAT(-lm.cumStockIn, 0), ')') ELSE FORMAT(COALESCE(lm.cumStockIn, 0), 0) END AS totalCumStockIn, + CASE WHEN COALESCE(lm.cumStockOut, 0) < 0 THEN CONCAT('(', FORMAT(-lm.cumStockOut, 0), ')') ELSE FORMAT(COALESCE(lm.cumStockOut, 0), 0) END AS totalCumStockOut, CASE WHEN COALESCE(cp.currentBalance, 0) < 0 THEN CONCAT('(', FORMAT(-cp.currentBalance, 0), ')') ELSE FORMAT(COALESCE(cp.currentBalance, 0), 0) END AS totalCurrentBalance, '' AS misInputAndLost, '' AS defectiveGoods, '' AS variance, - '0' AS totalMisInputAndLost, - '0' AS totalVariance, - '0' AS totalDefectiveGoods, - FORMAT(ROUND(COALESCE(ap.avgUnitPriceRaw, 0), 2), 2) AS avgUnitPrice, - FORMAT(ROUND(COALESCE(ap.avgUnitPriceRaw, 0) * COALESCE(cp.currentBalance, 0), 2), 2) AS totalStockBalance + CASE WHEN COALESCE(lm.misInputAndLost, 0) < 0 THEN CONCAT('(', FORMAT(-lm.misInputAndLost, 0), ')') ELSE FORMAT(COALESCE(lm.misInputAndLost, 0), 0) END AS totalMisInputAndLost, + CASE WHEN COALESCE(lm.variance, 0) < 0 THEN CONCAT('(', FORMAT(-lm.variance, 0), ')') ELSE FORMAT(COALESCE(lm.variance, 0), 0) END AS totalVariance, + CASE WHEN COALESCE(lm.defectiveGoods, 0) < 0 THEN CONCAT('(', FORMAT(-lm.defectiveGoods, 0), ')') ELSE FORMAT(COALESCE(lm.defectiveGoods, 0), 0) END AS totalDefectiveGoods, + FORMAT(ROUND(COALESCE(s.avgUnitPriceRaw, 0), 2), 2) AS avgUnitPrice, + FORMAT(ROUND(COALESCE(s.avgUnitPriceRaw, 0) * COALESCE(cp.currentBalance, 0), 2), 2) AS totalStockBalance FROM item_scope s LEFT JOIN opening_per_item op ON op.itemId = s.itemId LEFT JOIN current_per_item cp ON cp.itemId = s.itemId LEFT JOIN last_in_out lio ON lio.itemId = s.itemId - LEFT JOIN avg_price_per_item ap ON ap.itemId = s.itemId + LEFT JOIN ledger_moves lm ON lm.itemId = s.itemId LEFT JOIN item_uom iu ON iu.itemId = s.itemId AND iu.stockUnit = 1 AND iu.deleted = 0 LEFT JOIN uom_conversion uc ON iu.uomId = uc.id LEFT JOIN store_location ON store_location.itemId = s.itemId @@ -1712,4 +1721,5 @@ return result val jasperPrint = JasperFillManager.fillReport(jasperReport, params, dataSource) return JasperExportManager.exportReportToPdf(jasperPrint) } + } \ No newline at end of file