| @@ -1501,7 +1501,12 @@ return result | |||||
| AND DATE(sl.date) <= p.d0 | AND DATE(sl.date) <= p.d0 | ||||
| ), | ), | ||||
| item_scope AS ( | 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 | FROM items it | ||||
| INNER JOIN ledger_item_ids li ON li.itemId = it.id | INNER JOIN ledger_item_ids li ON li.itemId = it.id | ||||
| WHERE it.deleted = 0 | WHERE it.deleted = 0 | ||||
| @@ -1568,51 +1573,55 @@ return result | |||||
| AND DATE(sl.date) <= p.d0 | AND DATE(sl.date) <= p.d0 | ||||
| GROUP BY sl.itemId | GROUP BY sl.itemId | ||||
| ), | ), | ||||
| is_bom_item AS ( | |||||
| ledger_moves AS ( | |||||
| SELECT | 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 | SELECT | ||||
| '' AS stockSubCategory, | '' AS stockSubCategory, | ||||
| @@ -1632,22 +1641,22 @@ return result | |||||
| COALESCE(op.openingBalance, 0) AS openingBalanceRaw, | COALESCE(op.openingBalance, 0) AS openingBalanceRaw, | ||||
| COALESCE(cp.currentBalance, 0) AS currentBalanceRaw, | 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, | 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, | 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 misInputAndLost, | ||||
| '' AS defectiveGoods, | '' AS defectiveGoods, | ||||
| '' AS variance, | '' 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 | FROM item_scope s | ||||
| LEFT JOIN opening_per_item op ON op.itemId = s.itemId | LEFT JOIN opening_per_item op ON op.itemId = s.itemId | ||||
| LEFT JOIN current_per_item cp ON cp.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 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 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 uom_conversion uc ON iu.uomId = uc.id | ||||
| LEFT JOIN store_location ON store_location.itemId = s.itemId | LEFT JOIN store_location ON store_location.itemId = s.itemId | ||||
| @@ -1712,4 +1721,5 @@ return result | |||||
| val jasperPrint = JasperFillManager.fillReport(jasperReport, params, dataSource) | val jasperPrint = JasperFillManager.fillReport(jasperReport, params, dataSource) | ||||
| return JasperExportManager.exportReportToPdf(jasperPrint) | return JasperExportManager.exportReportToPdf(jasperPrint) | ||||
| } | } | ||||
| } | } | ||||