Переглянути джерело

align the calculation of unit with stock in line data create calculation

production
Fai Luk 2 дні тому
джерело
коміт
c64250987e
3 змінених файлів з 35 додано та 2 видалено
  1. +23
    -2
      src/main/java/com/ffii/fpsms/modules/master/service/ItemUomService.kt
  2. +3
    -0
      src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/projections/PurchaseOrderLineInfo.kt
  3. +9
    -0
      src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt

+ 23
- 2
src/main/java/com/ffii/fpsms/modules/master/service/ItemUomService.kt Переглянути файл

@@ -224,6 +224,27 @@ open class ItemUomService(
return stockQty.setScale(0, RoundingMode.DOWN)
}

/**
* Count-type stock units must be whole numbers: PCS/CTN…, 包, 箱, 件, 個, PCS, CTN, etc.
* Weight/volume units (克, 公斤, 升…) keep 2 decimals.
*/
open fun isIntegerCountStockUom(stockUnit: ItemUom?): Boolean {
if (stockUnit == null) return false
val code = stockUnit.uom?.code?.trim().orEmpty()
if (code.startsWith("PCS/CTN", ignoreCase = true)) return true
val short = stockUnit.uom?.udfShortDesc?.trim().orEmpty()
return isIntegerCountUnitToken(short) || isIntegerCountUnitToken(code)
}

private fun isIntegerCountUnitToken(raw: String): Boolean {
val token = raw.trim()
if (token.isEmpty()) return false
if (token == "包" || token == "箱" || token == "件" || token == "個") return true
val upper = token.uppercase()
return upper == "PCS" || upper == "PC" || upper == "CTN" || upper == "EA" ||
upper == "PK" || upper == "PKT" || upper == "BOX"
}

/**
* Stock UOM code [PCS/CTN]* denotes pieces-per-carton; displayed stock qty should be whole cartons (integer).
*/
@@ -232,9 +253,9 @@ open class ItemUomService(
return code.startsWith("PCS/CTN", ignoreCase = true)
}

/** After ratio math: 2 decimals, or integer when stock unit is PCS/CTN… */
/** After ratio math: integer HALF_UP for count units (包/箱/PCS…), else 2 decimals. */
private fun finalizePreciseStockQty(stockUnit: ItemUom?, stockQty: BigDecimal): BigDecimal {
if (isPiecesPerCartonStockUomCode(stockUnit)) {
if (isIntegerCountStockUom(stockUnit) || isPiecesPerCartonStockUomCode(stockUnit)) {
return stockQty.setScale(0, RoundingMode.HALF_UP)
}
return stockQty.setScale(2, RoundingMode.HALF_UP)


+ 3
- 0
src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/projections/PurchaseOrderLineInfo.kt Переглянути файл

@@ -63,4 +63,7 @@ data class StockUomForPoLine (
val stockRatioD: BigDecimal? = null,
val purchaseRatioN: BigDecimal? = null,
val purchaseRatioD: BigDecimal? = null,
val sourceRatioN: BigDecimal? = null,
val sourceRatioD: BigDecimal? = null,
val stockQtyInteger: Boolean? = null,
)

+ 9
- 0
src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt Переглянути файл

@@ -294,6 +294,12 @@ open fun getPoSummariesByIds(ids: List<Long>): List<PurchaseOrderSummary> {
val itemId = thisPol.item?.id
val qtyM18 = thisPol.qtyM18
val uomM18Id = thisPol.uomM18?.id
val sourceUomId = uomM18Id ?: thisPol.uom?.id
val sourceItemUom = if (itemId != null && sourceUomId != null) {
itemUomService.findFirstByItemIdAndUomId(itemId, sourceUomId)
} else {
null
}
val stockQtyFromM18 = if (itemId != null && qtyM18 != null && uomM18Id != null) {
itemUomService.convertQtyToStockQtyPrecise(itemId, uomM18Id, qtyM18)
} else {
@@ -312,6 +318,9 @@ open fun getPoSummariesByIds(ids: List<Long>): List<PurchaseOrderSummary> {
stockRatioD = iu?.ratioD,
purchaseRatioN = purchaseUnit?.ratioN,
purchaseRatioD = purchaseUnit?.ratioD,
sourceRatioN = sourceItemUom?.ratioN ?: purchaseUnit?.ratioN,
sourceRatioD = sourceItemUom?.ratioD ?: purchaseUnit?.ratioD,
stockQtyInteger = itemUomService.isIntegerCountStockUom(iu),
)
} } ?: StockUomForPoLine()
PoLineWithStockInLine(


Завантаження…
Відмінити
Зберегти