|
|
|
@@ -97,6 +97,29 @@ open class ItemUomService( |
|
|
|
return stockQty.setScale(0, RoundingMode.UP) |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Convert purchase qty -> stock qty (PO display / acceptedQty calculation) |
|
|
|
* with round-down to integer stock qty. |
|
|
|
*/ |
|
|
|
open fun convertPurchaseQtyToStockQtyRoundDown(itemId: Long, purchaseQty: BigDecimal): BigDecimal { |
|
|
|
val purchaseUnit = findPurchaseUnitByItemId(itemId) ?: return purchaseQty |
|
|
|
val stockUnit = findStockUnitByItemId(itemId) ?: return purchaseQty |
|
|
|
val one = BigDecimal.ONE |
|
|
|
|
|
|
|
// Use high precision for intermediate steps, and round down only at the end. |
|
|
|
val calcScale = 10 |
|
|
|
|
|
|
|
val baseQty = purchaseQty |
|
|
|
.multiply(purchaseUnit.ratioN ?: one) |
|
|
|
.divide(purchaseUnit.ratioD ?: one, calcScale, RoundingMode.HALF_UP) |
|
|
|
|
|
|
|
val stockQty = baseQty |
|
|
|
.multiply(stockUnit.ratioD ?: one) |
|
|
|
.divide(stockUnit.ratioN ?: one, calcScale, RoundingMode.HALF_UP) |
|
|
|
|
|
|
|
return stockQty.setScale(0, RoundingMode.DOWN) |
|
|
|
} |
|
|
|
|
|
|
|
/** Inverse of convertPurchaseQtyToStockQty: stock qty -> purchase qty (for PO-origin StockInLine display). */ |
|
|
|
open fun convertStockQtyToPurchaseQty(itemId: Long, stockQty: BigDecimal): BigDecimal { |
|
|
|
val purchaseUnit = findPurchaseUnitByItemId(itemId) ?: return stockQty |
|
|
|
|