| @@ -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) | |||
| } | |||
| } | |||