Просмотр исходного кода

report lot uom fix

fix UPDATE_INVENTORY_QTY_SQL unavavable qty don't use onhold qty
fix負數倉
CANCERYS\kw093 9 часов назад
Родитель
Сommit
fdba96acea
18 измененных файлов: 173 добавлений и 88 удалений
  1. +1
    -1
      src/main/java/com/ffii/fpsms/modules/master/service/ledgerfix/StockLedgerFixInventorySql.kt
  2. +17
    -7
      src/main/java/com/ffii/fpsms/modules/report/service/FGStockOutTraceabilityReportService.kt
  3. +15
    -3
      src/main/java/com/ffii/fpsms/modules/report/service/ItemQcFailReportService.kt
  4. +16
    -6
      src/main/java/com/ffii/fpsms/modules/report/service/MaterialStockOutTraceabilityReportService.kt
  5. +37
    -13
      src/main/java/com/ffii/fpsms/modules/report/service/ReportService.kt
  6. +46
    -20
      src/main/java/com/ffii/fpsms/modules/report/service/StockLedgerReportService.kt
  7. +24
    -27
      src/main/java/com/ffii/fpsms/modules/report/service/StockTakeVarianceReportService.kt
  8. +4
    -1
      src/main/java/com/ffii/fpsms/modules/report/web/FGStockOutTraceabilityReportController.kt
  9. +4
    -1
      src/main/java/com/ffii/fpsms/modules/report/web/MaterialStockOutTraceabilityReportController.kt
  10. +1
    -1
      src/main/java/com/ffii/fpsms/modules/report/web/ReportController.kt
  11. +1
    -1
      src/main/java/com/ffii/fpsms/modules/report/web/StockLedgerReportController.kt
  12. +1
    -1
      src/main/java/com/ffii/fpsms/modules/report/web/StockTakeVarianceReportController.kt
  13. +1
    -1
      src/main/resources/jasper/FGStockOutTraceabilityReport.jrxml
  14. +1
    -1
      src/main/resources/jasper/ItemQCReport.jrxml
  15. +1
    -1
      src/main/resources/jasper/MaterialStockOutTraceability.jrxml
  16. +1
    -1
      src/main/resources/jasper/StockInTraceabilityReport.jrxml
  17. +1
    -1
      src/main/resources/jasper/StockLedgarReport.jrxml
  18. +1
    -1
      src/main/resources/jasper/StockTakeVarianceReport.jrxml

+ 1
- 1
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


+ 17
- 7
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()


+ 15
- 3
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),


+ 16
- 6
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()


+ 37
- 13
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)


+ 46
- 20
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<Long, String>()
val missingUomIds = ArrayList<Long>()
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<MoveWithLot>(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<Long, ItemInfo>()
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<String, ItemTotal>()
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<Map<String, Any>> -> "rows=${list.size}" }) {
val sorted = withLot.sortedWith(
compareBy<MoveWithLot> { 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 {


+ 24
- 27
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()


+ 4
- 1
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
}



+ 4
- 1
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
}



+ 1
- 1
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,


+ 1
- 1
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,


+ 1
- 1
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


+ 1
- 1
src/main/resources/jasper/FGStockOutTraceabilityReport.jrxml Просмотреть файл

@@ -59,7 +59,7 @@
<field name="deliveryDate" class="java.lang.String"/>
<field name="totalStockOutQty" class="java.lang.String"/>
<group name="Group1" keepTogether="true">
<groupExpression><![CDATA[$F{itemNo}]]></groupExpression>
<groupExpression><![CDATA[$F{itemNo}+"|"+$F{unitOfMeasure}]]></groupExpression>
<groupHeader>
<band height="18">
<textField textAdjust="StretchHeight">


+ 1
- 1
src/main/resources/jasper/ItemQCReport.jrxml Просмотреть файл

@@ -59,7 +59,7 @@
<field name="orderRefNo" class="java.lang.String"/>
<field name="stockSubCategory" class="java.lang.String"/>
<group name="Group1" keepTogether="true">
<groupExpression><![CDATA[$F{itemNo}]]></groupExpression>
<groupExpression><![CDATA[$F{itemNo}+"|"+$F{unitOfMeasure}]]></groupExpression>
<groupHeader>
<band height="18">
<property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.FreeLayout"/>


+ 1
- 1
src/main/resources/jasper/MaterialStockOutTraceability.jrxml Просмотреть файл

@@ -54,7 +54,7 @@
<field name="jobOrderNo" class="java.lang.String"/>
<field name="totalStockOutQty" class="java.lang.String"/>
<group name="Group1" keepTogether="true">
<groupExpression><![CDATA[$F{itemNo}]]></groupExpression>
<groupExpression><![CDATA[$F{itemNo}+"|"+$F{unitOfMeasure}]]></groupExpression>
<groupHeader>
<band height="18">
<textField textAdjust="StretchHeight">


+ 1
- 1
src/main/resources/jasper/StockInTraceabilityReport.jrxml Просмотреть файл

@@ -62,7 +62,7 @@
<field name="totalIqcDefectQty" class="java.lang.String"/>
<field name="stockInQty" class="java.lang.String"/>
<group name="Group1" keepTogether="true">
<groupExpression><![CDATA[$F{itemNo}]]></groupExpression>
<groupExpression><![CDATA[$F{itemNo}+"|"+$F{unitOfMeasure}]]></groupExpression>
<groupHeader>
<band height="18">
<property name="com.jaspersoft.studio.unit.height" value="px"/>


+ 1
- 1
src/main/resources/jasper/StockLedgarReport.jrxml Просмотреть файл

@@ -74,7 +74,7 @@
<field name="jobOrderNo" class="java.lang.String"/>
<field name="orderRefNo" class="java.lang.String"/>
<group name="Group1" keepTogether="false">
<groupExpression><![CDATA[$F{itemNo}]]></groupExpression>
<groupExpression><![CDATA[$F{itemNo}+"|"+$F{unitOfMeasure}]]></groupExpression>
<groupHeader>
<band height="18">
<textField textAdjust="StretchHeight">


+ 1
- 1
src/main/resources/jasper/StockTakeVarianceReport.jrxml Просмотреть файл

@@ -67,7 +67,7 @@
<field name="totalStockTakeQty" class="java.lang.String"/>
<field name="type" class="java.lang.String"/>
<group name="Group1" keepTogether="true" preventOrphanFooter="true">
<groupExpression><![CDATA[$F{itemNo}]]></groupExpression>
<groupExpression><![CDATA[$F{itemNo}+"|"+$F{unitOfMeasure}]]></groupExpression>
<groupHeader>
<band height="18">
<textField textAdjust="StretchHeight">


Загрузка…
Отмена
Сохранить