| @@ -119,42 +119,79 @@ class SemiFGProductionAnalysisReportService( | |||||
| } else "" | } else "" | ||||
| val sql = """ | val sql = """ | ||||
| SELECT | |||||
| COALESCE(ic.sub, '') as stockSubCategory, | |||||
| COALESCE(sl.itemCode, '') as itemNo, | |||||
| COALESCE(b.name, '') as itemName, | |||||
| COALESCE(uc.udfudesc, '') as unitOfMeasure, | |||||
| CAST(COALESCE(SUM(CASE WHEN MONTH(si.productionDate) = 1 THEN sl.inQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyJan, | |||||
| CAST(COALESCE(SUM(CASE WHEN MONTH(si.productionDate) = 2 THEN sl.inQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyFeb, | |||||
| CAST(COALESCE(SUM(CASE WHEN MONTH(si.productionDate) = 3 THEN sl.inQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyMar, | |||||
| CAST(COALESCE(SUM(CASE WHEN MONTH(si.productionDate) = 4 THEN sl.inQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyApr, | |||||
| CAST(COALESCE(SUM(CASE WHEN MONTH(si.productionDate) = 5 THEN sl.inQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyMay, | |||||
| CAST(COALESCE(SUM(CASE WHEN MONTH(si.productionDate) = 6 THEN sl.inQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyJun, | |||||
| CAST(COALESCE(SUM(CASE WHEN MONTH(si.productionDate) = 7 THEN sl.inQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyJul, | |||||
| CAST(COALESCE(SUM(CASE WHEN MONTH(si.productionDate) = 8 THEN sl.inQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyAug, | |||||
| CAST(COALESCE(SUM(CASE WHEN MONTH(si.productionDate) = 9 THEN sl.inQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtySep, | |||||
| CAST(COALESCE(SUM(CASE WHEN MONTH(si.productionDate) = 10 THEN sl.inQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyOct, | |||||
| CAST(COALESCE(SUM(CASE WHEN MONTH(si.productionDate) = 11 THEN sl.inQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyNov, | |||||
| CAST(COALESCE(SUM(CASE WHEN MONTH(si.productionDate) = 12 THEN sl.inQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyDec, | |||||
| CAST(COALESCE(SUM(sl.inQty), 0) AS CHAR) as totalProductionQty | |||||
| FROM stock_ledger sl | |||||
| INNER JOIN bom b ON sl.itemCode = b.code AND b.deleted = false | |||||
| INNER JOIN stock_in_line si ON si.id = sl.stockInLineId AND si.deleted = false AND si.productionDate IS NOT NULL | |||||
| LEFT JOIN items it ON sl.itemId = it.id | |||||
| LEFT JOIN item_category ic ON it.categoryId = ic.id | |||||
| LEFT JOIN item_uom iu ON it.id = iu.itemId AND iu.stockUnit = true | |||||
| LEFT JOIN uom_conversion uc ON iu.uomId = uc.id | |||||
| WHERE sl.deleted = false | |||||
| AND sl.inQty IS NOT NULL | |||||
| AND sl.inQty > 0 | |||||
| $stockCategorySql | |||||
| $stockSubCategorySql | |||||
| $itemCodeSql | |||||
| $yearSql | |||||
| $lastOutDateStartSql | |||||
| $lastOutDateEndSql | |||||
| GROUP BY sl.itemCode, ic.sub, it.id, b.name, uc.udfudesc, b.description | |||||
| ORDER BY ic.sub, sl.itemCode | |||||
| WITH base AS ( | |||||
| SELECT | |||||
| COALESCE(sl.itemCode, '') as itemNo, | |||||
| COALESCE(b.name, '') as itemName, | |||||
| COALESCE(ic.sub, '') as stockSubCategory, | |||||
| COALESCE(uc.udfudesc, '') as unitOfMeasure, | |||||
| MONTH(si.productionDate) as mon, | |||||
| si.id as stockInLineId, | |||||
| si.acceptedQty as acceptedQty, | |||||
| si.jobOrderId as jobOrderId | |||||
| FROM stock_ledger sl | |||||
| INNER JOIN bom b | |||||
| ON sl.itemCode = b.code AND b.deleted = false | |||||
| INNER JOIN stock_in_line si | |||||
| ON si.id = sl.stockInLineId | |||||
| AND si.deleted = false | |||||
| AND si.productionDate IS NOT NULL | |||||
| LEFT JOIN items it | |||||
| ON sl.itemId = it.id | |||||
| LEFT JOIN item_category ic | |||||
| ON it.categoryId = ic.id | |||||
| LEFT JOIN item_uom iu | |||||
| ON it.id = iu.itemId | |||||
| AND iu.stockUnit = true | |||||
| LEFT JOIN uom_conversion uc | |||||
| ON iu.uomId = uc.id | |||||
| WHERE sl.deleted = false | |||||
| AND sl.inQty IS NOT NULL | |||||
| AND sl.inQty > 0 | |||||
| $stockCategorySql | |||||
| $stockSubCategorySql | |||||
| $itemCodeSql | |||||
| $yearSql | |||||
| $lastOutDateStartSql | |||||
| $lastOutDateEndSql | |||||
| ), | |||||
| -- Deduplicate: stock_in_line can join to multiple stock_ledger rows; acceptedQty must be counted once per stockInLineId. | |||||
| dedup AS ( | |||||
| SELECT | |||||
| itemNo, | |||||
| itemName, | |||||
| stockSubCategory, | |||||
| unitOfMeasure, | |||||
| mon, | |||||
| stockInLineId, | |||||
| MAX(COALESCE(acceptedQty, 0)) as acceptedQty, | |||||
| MAX(jobOrderId) as jobOrderId | |||||
| FROM base | |||||
| GROUP BY itemNo, itemName, stockSubCategory, unitOfMeasure, mon, stockInLineId | |||||
| ) | |||||
| SELECT | |||||
| MAX(d.stockSubCategory) as stockSubCategory, | |||||
| d.itemNo as itemNo, | |||||
| MAX(d.itemName) as itemName, | |||||
| MAX(d.unitOfMeasure) as unitOfMeasure, | |||||
| CAST(COALESCE(SUM(CASE WHEN d.mon = 1 AND d.jobOrderId IS NOT NULL AND TRIM(CAST(d.jobOrderId AS CHAR)) <> '' THEN d.acceptedQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyJan, | |||||
| CAST(COALESCE(SUM(CASE WHEN d.mon = 2 AND d.jobOrderId IS NOT NULL AND TRIM(CAST(d.jobOrderId AS CHAR)) <> '' THEN d.acceptedQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyFeb, | |||||
| CAST(COALESCE(SUM(CASE WHEN d.mon = 3 AND d.jobOrderId IS NOT NULL AND TRIM(CAST(d.jobOrderId AS CHAR)) <> '' THEN d.acceptedQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyMar, | |||||
| CAST(COALESCE(SUM(CASE WHEN d.mon = 4 AND d.jobOrderId IS NOT NULL AND TRIM(CAST(d.jobOrderId AS CHAR)) <> '' THEN d.acceptedQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyApr, | |||||
| CAST(COALESCE(SUM(CASE WHEN d.mon = 5 AND d.jobOrderId IS NOT NULL AND TRIM(CAST(d.jobOrderId AS CHAR)) <> '' THEN d.acceptedQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyMay, | |||||
| CAST(COALESCE(SUM(CASE WHEN d.mon = 6 AND d.jobOrderId IS NOT NULL AND TRIM(CAST(d.jobOrderId AS CHAR)) <> '' THEN d.acceptedQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyJun, | |||||
| CAST(COALESCE(SUM(CASE WHEN d.mon = 7 AND d.jobOrderId IS NOT NULL AND TRIM(CAST(d.jobOrderId AS CHAR)) <> '' THEN d.acceptedQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyJul, | |||||
| CAST(COALESCE(SUM(CASE WHEN d.mon = 8 AND d.jobOrderId IS NOT NULL AND TRIM(CAST(d.jobOrderId AS CHAR)) <> '' THEN d.acceptedQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyAug, | |||||
| CAST(COALESCE(SUM(CASE WHEN d.mon = 9 AND d.jobOrderId IS NOT NULL AND TRIM(CAST(d.jobOrderId AS CHAR)) <> '' THEN d.acceptedQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtySep, | |||||
| CAST(COALESCE(SUM(CASE WHEN d.mon = 10 AND d.jobOrderId IS NOT NULL AND TRIM(CAST(d.jobOrderId AS CHAR)) <> '' THEN d.acceptedQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyOct, | |||||
| CAST(COALESCE(SUM(CASE WHEN d.mon = 11 AND d.jobOrderId IS NOT NULL AND TRIM(CAST(d.jobOrderId AS CHAR)) <> '' THEN d.acceptedQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyNov, | |||||
| CAST(COALESCE(SUM(CASE WHEN d.mon = 12 AND d.jobOrderId IS NOT NULL AND TRIM(CAST(d.jobOrderId AS CHAR)) <> '' THEN d.acceptedQty ELSE 0 END), 0) AS DECIMAL(18,2)) as qtyDec, | |||||
| -- Keep as CHAR for Jasper compatibility (previous template expects String). | |||||
| CAST(COALESCE(SUM(CASE WHEN d.jobOrderId IS NOT NULL AND TRIM(CAST(d.jobOrderId AS CHAR)) <> '' THEN d.acceptedQty ELSE 0 END), 0) AS CHAR) as totalProductionQty | |||||
| FROM dedup d | |||||
| GROUP BY d.itemNo | |||||
| HAVING COALESCE(SUM(CASE WHEN d.jobOrderId IS NOT NULL AND TRIM(CAST(d.jobOrderId AS CHAR)) <> '' THEN d.acceptedQty ELSE 0 END), 0) > 0 | |||||
| ORDER BY d.itemNo | |||||
| """.trimIndent() | """.trimIndent() | ||||
| return jdbcDao.queryForList(sql, args) | return jdbcDao.queryForList(sql, args) | ||||