diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/ledgerfix/StockLedgerFixInventorySql.kt b/src/main/java/com/ffii/fpsms/modules/master/service/ledgerfix/StockLedgerFixInventorySql.kt index cef015d3..b7e5a129 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/ledgerfix/StockLedgerFixInventorySql.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/ledgerfix/StockLedgerFixInventorySql.kt @@ -217,7 +217,7 @@ internal object StockLedgerFixInventorySql { SUM( CASE WHEN LOWER(ill.status) = 'unavailable' - THEN COALESCE(ill.inQty, 0) - COALESCE(ill.outQty, 0) - COALESCE(ill.holdQty, 0) + THEN COALESCE(ill.inQty, 0) - COALESCE(ill.outQty, 0) ELSE 0 END ) AS unavailable diff --git a/src/main/java/com/ffii/fpsms/modules/report/service/FGStockOutTraceabilityReportService.kt b/src/main/java/com/ffii/fpsms/modules/report/service/FGStockOutTraceabilityReportService.kt index 7023b2fb..3eec75d2 100644 --- a/src/main/java/com/ffii/fpsms/modules/report/service/FGStockOutTraceabilityReportService.kt +++ b/src/main/java/com/ffii/fpsms/modules/report/service/FGStockOutTraceabilityReportService.kt @@ -105,7 +105,7 @@ class FGStockOutTraceabilityReportService( CAST(IFNULL(sp.id, 0) AS CHAR) AS customerId, IFNULL(sp.name, '') AS customerName, FORMAT( - ROUND(SUM(IFNULL(sol.qty, 0)) OVER (PARTITION BY it.code), 0), 0 + ROUND(SUM(IFNULL(sol.qty, 0)) OVER (PARTITION BY it.code, uc.udfudesc), 0), 0 ) AS qtyNumeric, FORMAT(ROUND(IFNULL(sol.qty, 0), 0), 0) AS qty, '' AS truckNo, @@ -131,7 +131,7 @@ class FGStockOutTraceabilityReportService( GROUP_CONCAT(DISTINCT wh.code ORDER BY wh.code SEPARATOR ', ') AS storeLocation, '' AS pickRemark, FORMAT( - ROUND(SUM(IFNULL(sol.qty, 0)) OVER (PARTITION BY it.code), 0), 0 + ROUND(SUM(IFNULL(sol.qty, 0)) OVER (PARTITION BY it.code, uc.udfudesc), 0), 0 ) AS totalStockOutQty, 0 AS stockSubCategory FROM delivery_order_pick_order dopo @@ -154,11 +154,6 @@ class FGStockOutTraceabilityReportService( ON dol.deliveryOrderId = do.id AND dol.itemId = pol.itemId AND dol.deleted = 0 - LEFT JOIN item_uom iu - ON it.id = iu.itemId - AND iu.stockUnit = 1 - LEFT JOIN uom_conversion uc - ON iu.uomId = uc.id LEFT JOIN stock_out_line sol ON pol.id = sol.pickOrderLineId AND sol.itemId = it.id @@ -170,6 +165,20 @@ class FGStockOutTraceabilityReportService( LEFT JOIN inventory_lot_line ill ON sol.inventoryLotLineId = ill.id AND ill.deleted = 0 + LEFT JOIN item_uom iu + ON iu.deleted = 0 + AND iu.id = COALESCE( + ill.stockItemUomId, + ( + SELECT MIN(iu2.id) + FROM item_uom iu2 + WHERE iu2.itemId = it.id + AND iu2.deleted = 0 + AND iu2.stockUnit = 1 + ) + ) + LEFT JOIN uom_conversion uc + ON uc.id = iu.uomId LEFT JOIN inventory_lot il ON ill.inventoryLotId = il.id AND il.deleted = 0 @@ -213,6 +222,7 @@ class FGStockOutTraceabilityReportService( il.expiryDate ORDER BY it.code, + uc.udfudesc, deliveryDate, il.lotNo """.trimIndent() diff --git a/src/main/java/com/ffii/fpsms/modules/report/service/ItemQcFailReportService.kt b/src/main/java/com/ffii/fpsms/modules/report/service/ItemQcFailReportService.kt index fc2d1b65..0ec4c22d 100644 --- a/src/main/java/com/ffii/fpsms/modules/report/service/ItemQcFailReportService.kt +++ b/src/main/java/com/ffii/fpsms/modules/report/service/ItemQcFailReportService.kt @@ -109,12 +109,23 @@ open class ItemQcFailReportService( LEFT JOIN qc_result_measurement qrm ON qrm.qcResultId = qr.id AND qrm.deleted = 0 + LEFT JOIN inventory_lot_line ill_uom + ON ill_uom.deleted = 0 + AND ill_uom.id = COALESCE( + sil.inventoryLotLineId, + ( + SELECT MIN(illx.id) + FROM inventory_lot_line illx + WHERE illx.inventoryLotId = sil.inventoryLotId + AND illx.deleted = 0 + AND illx.stockItemUomId IS NOT NULL + ) + ) LEFT JOIN item_uom iu - ON it.id = iu.itemId - AND iu.stockUnit = 1 + ON iu.id = ill_uom.stockItemUomId AND iu.deleted = 0 LEFT JOIN uom_conversion uc - ON iu.uomId = uc.id + ON uc.id = iu.uomId LEFT JOIN item_uom iu_purchase ON it.id = iu_purchase.itemId AND iu_purchase.purchaseUnit = 1 @@ -164,6 +175,7 @@ open class ItemQcFailReportService( qr.qcPassed DESC, it.type, it.code, + COALESCE(uc.udfudesc, uc.code, ''), COALESCE(sil.lotNo, il.lotNo, ''), CASE WHEN sil.jobOrderId IS NOT NULL THEN 'EPQC' ELSE 'IQC' END, COALESCE(qic.`order`, 9999), diff --git a/src/main/java/com/ffii/fpsms/modules/report/service/MaterialStockOutTraceabilityReportService.kt b/src/main/java/com/ffii/fpsms/modules/report/service/MaterialStockOutTraceabilityReportService.kt index 0f61589e..54ab65a4 100644 --- a/src/main/java/com/ffii/fpsms/modules/report/service/MaterialStockOutTraceabilityReportService.kt +++ b/src/main/java/com/ffii/fpsms/modules/report/service/MaterialStockOutTraceabilityReportService.kt @@ -105,7 +105,7 @@ class MaterialStockOutTraceabilityReportService( COALESCE(wh.code, '') AS storeLocation, '' AS pickRemark, FORMAT( - ROUND(SUM(IFNULL(sol.qty, 0)) OVER (PARTITION BY it.code), 0), 0 + ROUND(SUM(IFNULL(sol.qty, 0)) OVER (PARTITION BY it.code, uc.udfudesc), 0), 0 ) AS totalStockOutQty FROM stock_out_line sol INNER JOIN stock_out so @@ -126,14 +126,23 @@ class MaterialStockOutTraceabilityReportService( INNER JOIN items it ON sol.itemId = it.id AND it.deleted = 0 - LEFT JOIN item_uom iu - ON it.id = iu.itemId - AND iu.stockUnit = 1 - LEFT JOIN uom_conversion uc - ON iu.uomId = uc.id LEFT JOIN inventory_lot_line ill ON sol.inventoryLotLineId = ill.id AND ill.deleted = 0 + LEFT JOIN item_uom iu + ON iu.deleted = 0 + AND iu.id = COALESCE( + ill.stockItemUomId, + ( + SELECT MIN(iu2.id) + FROM item_uom iu2 + WHERE iu2.itemId = it.id + AND iu2.deleted = 0 + AND iu2.stockUnit = 1 + ) + ) + LEFT JOIN uom_conversion uc + ON iu.uomId = uc.id LEFT JOIN inventory_lot il ON ill.inventoryLotId = il.id AND il.deleted = 0 @@ -169,6 +178,7 @@ class MaterialStockOutTraceabilityReportService( $handlerSql ORDER BY it.code, + uc.udfudesc, il.lotNo, sol.endTime """.trimIndent() 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 a4ba7f0c..3e0854ea 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 @@ -372,7 +372,7 @@ return result CAST(IFNULL(sp.id, 0) AS CHAR) AS customerId, IFNULL(sp.name, '') AS customerName, FORMAT( - ROUND(SUM(IFNULL(sol.qty, 0)) OVER (PARTITION BY it.code), 0), 0 + ROUND(SUM(IFNULL(sol.qty, 0)) OVER (PARTITION BY it.code, uc.udfudesc), 0), 0 ) AS qtyNumeric, FORMAT(ROUND(IFNULL(sol.qty, 0), 0), 0) AS qty, '' AS truckNo, @@ -396,7 +396,7 @@ return result GROUP_CONCAT(DISTINCT wh.code ORDER BY wh.code SEPARATOR ', ') AS storeLocation, '' AS pickRemark, FORMAT( - ROUND(SUM(IFNULL(sol.qty, 0)) OVER (PARTITION BY it.code), 0), 0 + ROUND(SUM(IFNULL(sol.qty, 0)) OVER (PARTITION BY it.code, uc.udfudesc), 0), 0 ) AS totalStockOutQty, 0 AS stockSubCategory FROM do_pick_order_line_record dpolr @@ -416,11 +416,6 @@ return result LEFT JOIN items it ON dol.itemId = it.id AND it.deleted = 0 - LEFT JOIN item_uom iu - ON it.id = iu.itemId - AND iu.stockUnit = 1 - LEFT JOIN uom_conversion uc - ON iu.uomId = uc.id LEFT JOIN pick_order_line pol ON dpolr.pick_order_id = pol.poId AND pol.itemId = it.id @@ -439,6 +434,20 @@ return result LEFT JOIN inventory_lot_line ill ON sol.inventoryLotLineId = ill.id AND ill.deleted = 0 + LEFT JOIN item_uom iu + ON iu.deleted = 0 + AND iu.id = COALESCE( + ill.stockItemUomId, + ( + SELECT MIN(iu2.id) + FROM item_uom iu2 + WHERE iu2.itemId = it.id + AND iu2.deleted = 0 + AND iu2.stockUnit = 1 + ) + ) + LEFT JOIN uom_conversion uc + ON uc.id = iu.uomId LEFT JOIN inventory_lot il ON ill.inventoryLotId = il.id AND il.deleted = 0 @@ -479,6 +488,7 @@ return result il.expiryDate ORDER BY it.code, + uc.udfudesc, deliveryDate, il.lotNo """.trimIndent() @@ -730,19 +740,33 @@ return result END, 2))) as iqcDefectPercentage, CASE WHEN COALESCE(qr_agg.qcFailed, 0) = 1 THEN '不合格' ELSE '已接受' END as iqcResult, COALESCE(qr_agg.remarksConcat, '') as iqcRemarks, - TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(SUM(COALESCE(qr_agg.failQtySum, 0)) OVER (PARTITION BY it.id), 2))) as totalIqcDefectQty, + TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(SUM(COALESCE(qr_agg.failQtySum, 0)) OVER (PARTITION BY it.id, iu.id), 2))) as totalIqcDefectQty, COALESCE(wh.code, '') as storeLocation, COALESCE(sp_si.code, sp_po.code, '') as supplierID, COALESCE(sp_si.name, sp_po.name, '') as supplierName, - TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(SUM(COALESCE(pa_sil.putAwayQtySum, 0)) OVER (PARTITION BY it.id), 2))) as totalStockInQty, - TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(SUM(COALESCE(sil.acceptedQty, 0)) OVER (PARTITION BY it.id), 2))) as totalIqcSampleQty + TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(SUM(COALESCE(pa_sil.putAwayQtySum, 0)) OVER (PARTITION BY it.id, iu.id), 2))) as totalStockInQty, + TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(SUM(COALESCE(sil.acceptedQty, 0)) OVER (PARTITION BY it.id, iu.id), 2))) as totalIqcSampleQty FROM stock_in_line sil LEFT JOIN stock_in si ON sil.stockInId = si.id LEFT JOIN purchase_order po ON sil.purchaseOrderId = po.id LEFT JOIN items it ON sil.itemId = it.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 LEFT JOIN inventory_lot il ON sil.inventoryLotId = il.id + LEFT JOIN inventory_lot_line ill_uom + ON ill_uom.deleted = 0 + AND ill_uom.id = COALESCE( + sil.inventoryLotLineId, + ( + SELECT MIN(illx.id) + FROM inventory_lot_line illx + WHERE illx.inventoryLotId = il.id + AND illx.deleted = 0 + AND illx.stockItemUomId IS NOT NULL + ) + ) + LEFT JOIN item_uom iu + ON iu.id = ill_uom.stockItemUomId + AND iu.deleted = 0 + LEFT JOIN uom_conversion uc ON uc.id = iu.uomId LEFT JOIN ( SELECT inventoryLotId, SUM(COALESCE(inQty, 0)) AS putAwayQtySum FROM inventory_lot_line @@ -778,7 +802,7 @@ return result $slotSql $lotNoSql $poPrefixSql - ORDER BY it.code, sil.lotNo + ORDER BY it.code, uc.udfudesc, sil.lotNo """.trimIndent() return jdbcDao.queryForList(sql, args) diff --git a/src/main/java/com/ffii/fpsms/modules/report/service/StockLedgerReportService.kt b/src/main/java/com/ffii/fpsms/modules/report/service/StockLedgerReportService.kt index 139c71d5..5d3a83e2 100644 --- a/src/main/java/com/ffii/fpsms/modules/report/service/StockLedgerReportService.kt +++ b/src/main/java/com/ffii/fpsms/modules/report/service/StockLedgerReportService.kt @@ -89,6 +89,7 @@ open class StockLedgerReportService( COALESCE(sl.inQty, 0) AS inQty, COALESCE(sl.outQty, 0) AS outQty, COALESCE(sl.balance, 0) AS bal, + sl.uomId AS ledgerUomId, sl.inventoryLotLineId AS inventoryLotLineId, sl.stockInLineId AS stockInLineId, sl.stockOutLineId AS stockOutLineId @@ -112,6 +113,7 @@ open class StockLedgerReportService( inQty = toDouble(r["inQty"]), outQty = toDouble(r["outQty"]), bal = toDouble(r["bal"]), + ledgerUomId = toLong(r["ledgerUomId"]), lotLineId = toLong(r["inventoryLotLineId"]), stockInLineId = toLong(r["stockInLineId"]), stockOutLineId = toLong(r["stockOutLineId"]), @@ -183,12 +185,17 @@ open class StockLedgerReportService( ill.id AS lineId, COALESCE(il.lotNo, '') AS lotNo, COALESCE(DATE_FORMAT(il.expiryDate, '%Y-%m-%d'), '') AS expiryDate, - COALESCE(wh.code, '') AS storeLocation + COALESCE(wh.code, '') AS storeLocation, + COALESCE(uc.udfudesc, uc.code, '') AS unitOfMeasure FROM inventory_lot_line ill INNER JOIN inventory_lot il ON il.id = ill.inventoryLotId AND il.deleted = 0 LEFT JOIN warehouse wh ON wh.id = ill.warehouseId AND wh.deleted = 0 + LEFT JOIN item_uom iu + ON iu.id = ill.stockItemUomId AND iu.deleted = 0 + LEFT JOIN uom_conversion uc + ON uc.id = iu.uomId WHERE ill.deleted = 0 AND ill.id IN (:ids) """.trimIndent(), @@ -197,6 +204,7 @@ open class StockLedgerReportService( lotNo = r["lotNo"]?.toString().orEmpty(), expiryDate = r["expiryDate"]?.toString().orEmpty(), storeLocation = r["storeLocation"]?.toString().orEmpty(), + unitOfMeasure = r["unitOfMeasure"]?.toString().orEmpty(), ) } val headerIds = lotKeyBySl.values @@ -209,12 +217,17 @@ open class StockLedgerReportService( il.id AS lotId, COALESCE(il.lotNo, '') AS lotNo, COALESCE(DATE_FORMAT(il.expiryDate, '%Y-%m-%d'), '') AS expiryDate, - COALESCE(MAX(wh.code), '') AS storeLocation + COALESCE(MAX(wh.code), '') AS storeLocation, + COALESCE(MAX(uc.udfudesc), MAX(uc.code), '') AS unitOfMeasure FROM inventory_lot il LEFT JOIN inventory_lot_line ill ON ill.inventoryLotId = il.id AND ill.deleted = 0 LEFT JOIN warehouse wh ON wh.id = ill.warehouseId AND wh.deleted = 0 + LEFT JOIN item_uom iu + ON iu.id = ill.stockItemUomId AND iu.deleted = 0 + LEFT JOIN uom_conversion uc + ON uc.id = iu.uomId WHERE il.deleted = 0 AND il.id IN (:ids) GROUP BY il.id, il.lotNo, il.expiryDate @@ -224,10 +237,31 @@ open class StockLedgerReportService( lotNo = r["lotNo"]?.toString().orEmpty(), expiryDate = r["expiryDate"]?.toString().orEmpty(), storeLocation = r["storeLocation"]?.toString().orEmpty(), + unitOfMeasure = r["unitOfMeasure"]?.toString().orEmpty(), ) } } + val uomDescById = HashMap() + val missingUomIds = ArrayList() + for (m in moves) { + val key = lotKeyBySl[m.slId] ?: continue + val lot = if (key.lineId > 0) lotByLine[key.lineId] else lotByHeader[key.lotId] + if (lot != null && lot.unitOfMeasure.isBlank() && m.ledgerUomId > 0) { + missingUomIds.add(m.ledgerUomId) + } + } + for (r in queryChunks( + missingUomIds, + """ + SELECT id AS uomId, COALESCE(udfudesc, code, '') AS unitOfMeasure + FROM uom_conversion + WHERE id IN (:ids) + """.trimIndent(), + )) { + uomDescById[toLong(r["uomId"])] = r["unitOfMeasure"]?.toString().orEmpty() + } + val locationFilter = storeLocation?.trim().orEmpty() val withLot = ArrayList(moves.size) for (m in moves) { @@ -239,7 +273,8 @@ open class StockLedgerReportService( ) { continue } - withLot.add(MoveWithLot(m, lot)) + val uom = lot.unitOfMeasure.ifBlank { uomDescById[m.ledgerUomId].orEmpty() } + withLot.add(MoveWithLot(m, lot, uom)) } timings.add("4.filter rows=${withLot.size}") if (withLot.isEmpty()) { @@ -251,7 +286,6 @@ open class StockLedgerReportService( val type: String, val code: String, val name: String, - val uom: String, ) val items = HashMap() timed("5.items", { _: Unit -> "items=${items.size}" }) { @@ -262,19 +296,8 @@ open class StockLedgerReportService( it.id AS itemId, COALESCE(it.type, '') AS stockSubCategory, COALESCE(it.code, '') AS itemNo, - COALESCE(it.name, '') AS itemName, - COALESCE(uc.udfudesc, '') AS unitOfMeasure + COALESCE(it.name, '') AS itemName FROM items it - LEFT JOIN ( - SELECT itemId, MIN(id) AS id - FROM item_uom - WHERE deleted = 0 AND stockUnit = 1 AND itemId IN (:ids) - GROUP BY itemId - ) one_uom ON one_uom.itemId = it.id - LEFT JOIN item_uom iu - ON iu.id = one_uom.id - LEFT JOIN uom_conversion uc - ON uc.id = iu.uomId WHERE it.deleted = 0 AND it.id IN (:ids) """.trimIndent(), @@ -283,7 +306,6 @@ open class StockLedgerReportService( type = r["stockSubCategory"]?.toString().orEmpty(), code = r["itemNo"]?.toString().orEmpty(), name = r["itemName"]?.toString().orEmpty(), - uom = r["unitOfMeasure"]?.toString().orEmpty(), ) } } @@ -353,7 +375,7 @@ open class StockLedgerReportService( val totals = HashMap() for (row in withLot) { val m = row.move - val total = totals.getOrPut(m.itemCode) { ItemTotal() } + val total = totals.getOrPut("${m.itemCode}|${row.unitOfMeasure}") { ItemTotal() } total.inSum += m.inQty total.outSum += m.outQty val opening = m.bal - m.inQty + m.outQty @@ -372,6 +394,7 @@ open class StockLedgerReportService( val rows = timed("7.assemble", { list: List> -> "rows=${list.size}" }) { val sorted = withLot.sortedWith( compareBy { items[it.move.itemId]?.code.orEmpty() } + .thenBy { it.unitOfMeasure } .thenBy { it.move.trnDate } .thenBy { it.move.slId } .thenBy { it.lot.lotNo }, @@ -387,12 +410,12 @@ open class StockLedgerReportService( norm == "ADJ" && (outRef?.stockTake == true || inRef?.stockTake == true) -> "TKE" else -> m.rawType } - val total = totals[m.itemCode] + val total = totals["${m.itemCode}|${row.unitOfMeasure}"] reportRow( stockSubCategory = item?.type.orEmpty(), itemNo = item?.code.orEmpty(), itemName = item?.name.orEmpty(), - unitOfMeasure = item?.uom.orEmpty(), + unitOfMeasure = row.unitOfMeasure, lotNo = row.lot.lotNo, expiryDate = row.lot.expiryDate, trnDate = m.trnDate, @@ -558,6 +581,7 @@ open class StockLedgerReportService( val inQty: Double, val outQty: Double, val bal: Double, + val ledgerUomId: Long, val lotLineId: Long, val stockInLineId: Long, val stockOutLineId: Long, @@ -566,12 +590,14 @@ open class StockLedgerReportService( private data class MoveWithLot( val move: LedgerMove, val lot: LotInfo, + val unitOfMeasure: String, ) private data class LotInfo( val lotNo: String, val expiryDate: String, val storeLocation: String, + val unitOfMeasure: String, ) private class ItemTotal { diff --git a/src/main/java/com/ffii/fpsms/modules/report/service/StockTakeVarianceReportService.kt b/src/main/java/com/ffii/fpsms/modules/report/service/StockTakeVarianceReportService.kt index 9b190257..6b030bcf 100644 --- a/src/main/java/com/ffii/fpsms/modules/report/service/StockTakeVarianceReportService.kt +++ b/src/main/java/com/ffii/fpsms/modules/report/service/StockTakeVarianceReportService.kt @@ -245,8 +245,7 @@ in_agg AS ( AND iu_purchase.purchaseUnit = 1 AND iu_purchase.deleted = 0 LEFT JOIN item_uom iu_stock - ON it.id = iu_stock.itemId - AND iu_stock.stockUnit = 1 + ON iu_stock.id = ill.stockItemUomId AND iu_stock.deleted = 0 WHERE ill.deleted = 0 GROUP BY ill.id @@ -316,8 +315,7 @@ data AS ( $ROOT_STOCK_IN_JOIN_SQL LEFT JOIN item_uom iu - ON it.id = iu.itemId - AND iu.stockUnit = 1 + ON iu.id = ill.stockItemUomId AND iu.deleted = 0 LEFT JOIN uom_conversion uc ON iu.uomId = uc.id @@ -377,16 +375,17 @@ SELECT END AS variancePercentage, /* item totals(footer 用);負數括號顯示,無小數 */ - CASE WHEN SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalOpeningBalance, - CASE WHEN SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCumStockIn, - CASE WHEN SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCumStockOut, - CASE WHEN SUM(COALESCE(currentQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(currentQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(currentQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCurrentBalance, - CASE WHEN SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalStockTakeQty, + CASE WHEN SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalOpeningBalance, + CASE WHEN SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalCumStockIn, + CASE WHEN SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalCumStockOut, + CASE WHEN SUM(COALESCE(currentQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(currentQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(currentQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalCurrentBalance, + CASE WHEN SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalStockTakeQty, lotTypeRaw AS type FROM data ORDER BY itemNo, + unitOfMeasure, lotNo, storeLocation """.trimIndent() @@ -521,8 +520,7 @@ in_agg AS ( AND iu_purchase.purchaseUnit = 1 AND iu_purchase.deleted = 0 LEFT JOIN item_uom iu_stock - ON it.id = iu_stock.itemId - AND iu_stock.stockUnit = 1 + ON iu_stock.id = ill.stockItemUomId AND iu_stock.deleted = 0 WHERE ill.deleted = 0 GROUP BY ill.id @@ -598,8 +596,7 @@ data AS ( $ROOT_STOCK_IN_JOIN_SQL LEFT JOIN item_uom iu - ON it.id = iu.itemId - AND iu.stockUnit = 1 + ON iu.id = ill.stockItemUomId AND iu.deleted = 0 LEFT JOIN uom_conversion uc ON iu.uomId = uc.id @@ -655,16 +652,17 @@ SELECT ELSE CONCAT(FORMAT((COALESCE(stkVarianceQty, 0) / stkBookQty) * 100, 0), '%') END AS variancePercentage, - CASE WHEN SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalOpeningBalance, - CASE WHEN SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCumStockIn, - CASE WHEN SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCumStockOut, - CASE WHEN SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCurrentBalance, - CASE WHEN SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalStockTakeQty, + CASE WHEN SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalOpeningBalance, + CASE WHEN SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalCumStockIn, + CASE WHEN SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalCumStockOut, + CASE WHEN SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalCurrentBalance, + CASE WHEN SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalStockTakeQty, lotTypeRaw AS type FROM data ORDER BY itemNo, + unitOfMeasure, lotNo, storeLocation """.trimIndent() @@ -820,8 +818,7 @@ in_agg AS ( AND iu_purchase.purchaseUnit = 1 AND iu_purchase.deleted = 0 LEFT JOIN item_uom iu_stock - ON it.id = iu_stock.itemId - AND iu_stock.stockUnit = 1 + ON iu_stock.id = ill.stockItemUomId AND iu_stock.deleted = 0 WHERE ill.deleted = 0 GROUP BY lb.inventoryLotLineId @@ -888,8 +885,7 @@ data AS ( $ROOT_STOCK_IN_JOIN_SQL LEFT JOIN item_uom iu - ON it.id = iu.itemId - AND iu.stockUnit = 1 + ON iu.id = ill.stockItemUomId AND iu.deleted = 0 LEFT JOIN uom_conversion uc ON iu.uomId = uc.id @@ -945,16 +941,17 @@ SELECT ELSE CONCAT(FORMAT((COALESCE(stkVarianceQty, 0) / stkBookQty) * 100, 0), '%') END AS variancePercentage, - CASE WHEN SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalOpeningBalance, - CASE WHEN SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCumStockIn, - CASE WHEN SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCumStockOut, - CASE WHEN SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalCurrentBalance, - CASE WHEN SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo), 0), ')') ELSE FORMAT(SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo), 0) END AS totalStockTakeQty, + CASE WHEN SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(openingQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalOpeningBalance, + CASE WHEN SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(inQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalCumStockIn, + CASE WHEN SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(outQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalCumStockOut, + CASE WHEN SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(stkBookQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalCurrentBalance, + CASE WHEN SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure) < 0 THEN CONCAT('(', FORMAT(-SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0), ')') ELSE FORMAT(SUM(COALESCE(stkApproverQty, 0)) OVER (PARTITION BY itemNo, unitOfMeasure), 0) END AS totalStockTakeQty, lotTypeRaw AS type FROM data ORDER BY itemNo, + unitOfMeasure, lotNo, storeLocation """.trimIndent() diff --git a/src/main/java/com/ffii/fpsms/modules/report/web/FGStockOutTraceabilityReportController.kt b/src/main/java/com/ffii/fpsms/modules/report/web/FGStockOutTraceabilityReportController.kt index c6bdb0f8..e476cb46 100644 --- a/src/main/java/com/ffii/fpsms/modules/report/web/FGStockOutTraceabilityReportController.kt +++ b/src/main/java/com/ffii/fpsms/modules/report/web/FGStockOutTraceabilityReportController.kt @@ -306,11 +306,13 @@ class FGStockOutTraceabilityReportController( } else { var currentItemNo: String? = null var currentItemName = "" + var currentUom = "" var currentItemTotalQty = 0.0 dbData.forEach { rowMap -> val itemNo = rowMap["itemNo"]?.toString() ?: "" - if (currentItemNo != null && itemNo != currentItemNo) { + val uom = rowMap["unitOfMeasure"]?.toString().orEmpty() + if (currentItemNo != null && (itemNo != currentItemNo || uom != currentUom)) { addItemSummaryRow(currentItemTotalQty, currentItemNo!!, currentItemName) addBlankSeparatorRow() currentItemTotalQty = 0.0 @@ -331,6 +333,7 @@ class FGStockOutTraceabilityReportController( currentItemNo = itemNo currentItemName = rowMap["itemName"]?.toString() ?: "" + currentUom = uom currentItemTotalQty += parseNullableNumber(rowMap["stockOutQty"]) ?: 0.0 } diff --git a/src/main/java/com/ffii/fpsms/modules/report/web/MaterialStockOutTraceabilityReportController.kt b/src/main/java/com/ffii/fpsms/modules/report/web/MaterialStockOutTraceabilityReportController.kt index 0000e717..91daa642 100644 --- a/src/main/java/com/ffii/fpsms/modules/report/web/MaterialStockOutTraceabilityReportController.kt +++ b/src/main/java/com/ffii/fpsms/modules/report/web/MaterialStockOutTraceabilityReportController.kt @@ -298,11 +298,13 @@ class MaterialStockOutTraceabilityReportController( } else { var currentItemNo: String? = null var currentItemName: String = "" + var currentUom = "" var currentItemTotalQty: Double = 0.0 dbData.forEach { rowMap -> val itemNo = rowMap["itemNo"]?.toString() ?: "" - if (currentItemNo != null && itemNo != currentItemNo) { + val uom = rowMap["unitOfMeasure"]?.toString().orEmpty() + if (currentItemNo != null && (itemNo != currentItemNo || uom != currentUom)) { addItemSummaryRow(currentItemTotalQty, currentItemNo!!, currentItemName) addBlankSeparatorRow() currentItemTotalQty = 0.0 @@ -323,6 +325,7 @@ class MaterialStockOutTraceabilityReportController( currentItemNo = itemNo currentItemName = rowMap["itemName"]?.toString() ?: "" + currentUom = uom currentItemTotalQty += parseNullableNumber(rowMap["stockOutQty"]) ?: 0.0 } diff --git a/src/main/java/com/ffii/fpsms/modules/report/web/ReportController.kt b/src/main/java/com/ffii/fpsms/modules/report/web/ReportController.kt index 7875a416..eaab880c 100644 --- a/src/main/java/com/ffii/fpsms/modules/report/web/ReportController.kt +++ b/src/main/java/com/ffii/fpsms/modules/report/web/ReportController.kt @@ -704,7 +704,7 @@ class ReportController( val itemName = m["itemName"]?.toString().orEmpty() val uom = m["unitOfMeasure"]?.toString().orEmpty() - if (currentItemNo != null && itemNo != currentItemNo) { + if (currentItemNo != null && (itemNo != currentItemNo || uom != currentUom)) { addItemSummaryRow( currentItemNo!!, currentItemName, diff --git a/src/main/java/com/ffii/fpsms/modules/report/web/StockLedgerReportController.kt b/src/main/java/com/ffii/fpsms/modules/report/web/StockLedgerReportController.kt index 01b5bf20..7e7560c6 100644 --- a/src/main/java/com/ffii/fpsms/modules/report/web/StockLedgerReportController.kt +++ b/src/main/java/com/ffii/fpsms/modules/report/web/StockLedgerReportController.kt @@ -394,7 +394,7 @@ class StockLedgerReportController( val itemName = m["itemName"]?.toString().orEmpty() val uom = m["unitOfMeasure"]?.toString().orEmpty() - if (currentItemNo != null && itemNo != currentItemNo) { + if (currentItemNo != null && (itemNo != currentItemNo || uom != currentUom)) { addItemSummaryRow( currentItemNo!!, currentItemName, diff --git a/src/main/java/com/ffii/fpsms/modules/report/web/StockTakeVarianceReportController.kt b/src/main/java/com/ffii/fpsms/modules/report/web/StockTakeVarianceReportController.kt index b457e2c0..ebcd3c03 100644 --- a/src/main/java/com/ffii/fpsms/modules/report/web/StockTakeVarianceReportController.kt +++ b/src/main/java/com/ffii/fpsms/modules/report/web/StockTakeVarianceReportController.kt @@ -490,7 +490,7 @@ class StockTakeVarianceReportController( val itemName = rowMap["itemName"]?.toString().orEmpty() val uom = rowMap["unitOfMeasure"]?.toString().orEmpty() - if (currentItemNo != null && itemNo != currentItemNo) { + if (currentItemNo != null && (itemNo != currentItemNo || uom != currentUom)) { addItemSummaryRow(currentItemTotalQty, currentItemTotalStockTakeQty, currentItemNo!!, currentItemName) addBlankSeparatorRow() currentItemTotalQty = 0.0 diff --git a/src/main/resources/jasper/FGStockOutTraceabilityReport.jrxml b/src/main/resources/jasper/FGStockOutTraceabilityReport.jrxml index 6959ca05..3a0565cb 100644 --- a/src/main/resources/jasper/FGStockOutTraceabilityReport.jrxml +++ b/src/main/resources/jasper/FGStockOutTraceabilityReport.jrxml @@ -59,7 +59,7 @@ - + diff --git a/src/main/resources/jasper/ItemQCReport.jrxml b/src/main/resources/jasper/ItemQCReport.jrxml index a6c47ca3..7cfb8fde 100644 --- a/src/main/resources/jasper/ItemQCReport.jrxml +++ b/src/main/resources/jasper/ItemQCReport.jrxml @@ -59,7 +59,7 @@ - + diff --git a/src/main/resources/jasper/MaterialStockOutTraceability.jrxml b/src/main/resources/jasper/MaterialStockOutTraceability.jrxml index 6bfa86e6..fd639a4e 100644 --- a/src/main/resources/jasper/MaterialStockOutTraceability.jrxml +++ b/src/main/resources/jasper/MaterialStockOutTraceability.jrxml @@ -54,7 +54,7 @@ - + diff --git a/src/main/resources/jasper/StockInTraceabilityReport.jrxml b/src/main/resources/jasper/StockInTraceabilityReport.jrxml index 6ee11df2..552afed5 100644 --- a/src/main/resources/jasper/StockInTraceabilityReport.jrxml +++ b/src/main/resources/jasper/StockInTraceabilityReport.jrxml @@ -62,7 +62,7 @@ - + diff --git a/src/main/resources/jasper/StockLedgarReport.jrxml b/src/main/resources/jasper/StockLedgarReport.jrxml index a85ee22a..86229971 100644 --- a/src/main/resources/jasper/StockLedgarReport.jrxml +++ b/src/main/resources/jasper/StockLedgarReport.jrxml @@ -74,7 +74,7 @@ - + diff --git a/src/main/resources/jasper/StockTakeVarianceReport.jrxml b/src/main/resources/jasper/StockTakeVarianceReport.jrxml index 04020a3a..6d5b0685 100644 --- a/src/main/resources/jasper/StockTakeVarianceReport.jrxml +++ b/src/main/resources/jasper/StockTakeVarianceReport.jrxml @@ -67,7 +67,7 @@ - +