From dfdfad710845b1502c37df7f3a46db2e28eb2a05 Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Mon, 18 Aug 2025 17:31:03 +0800 Subject: [PATCH] update po --- .../modules/master/service/ItemUomService.kt | 12 +++++++++ .../projections/PurchaseOrderLineInfo.kt | 13 ++++++++++ .../service/PurchaseOrderService.kt | 26 ++++++++++++++----- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/ItemUomService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/ItemUomService.kt index e1fae3a..ea45490 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/ItemUomService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/ItemUomService.kt @@ -6,6 +6,7 @@ import com.ffii.fpsms.modules.master.web.models.ItemUomRequest import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import java.io.IOException +import java.math.BigDecimal import kotlin.jvm.optionals.getOrNull @Service @@ -42,6 +43,17 @@ open class ItemUomService( return itemUomRespository.findByItemM18IdAndPurchaseUnitIsTrueAndDeletedIsFalse(m18ItemId) } + open fun convertPurchaseQtyToStockQty(itemId: Long, purchaseQty: BigDecimal): BigDecimal { + val purchaseUnit = findPurchaseUnitByItemId(itemId) ?: return purchaseQty; + val stockUnit = findStockUnitByItemId(itemId) ?: return purchaseQty; + val one = BigDecimal.ONE; + + val baseQty = purchaseQty.multiply(purchaseUnit.ratioN ?: one).divide(purchaseUnit.ratioD ?: one) + val stockQty = baseQty.multiply(stockUnit.ratioD ?: one).divide(stockUnit.ratioN ?: one) + + return stockQty; + } + // See if need to update the response open fun saveItemUom(request: ItemUomRequest): ItemUom { val itemUom = request.m18Id?.let { findByM18Id(it) } ?: request.id?.let { findById(it) } ?: ItemUom() diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/projections/PurchaseOrderLineInfo.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/projections/PurchaseOrderLineInfo.kt index f287218..743e106 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/projections/PurchaseOrderLineInfo.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/projections/PurchaseOrderLineInfo.kt @@ -1,6 +1,7 @@ package com.ffii.fpsms.modules.purchaseOrder.entity.projections import com.fasterxml.jackson.annotation.JsonManagedReference +import com.ffii.fpsms.modules.master.entity.ItemUom import com.ffii.fpsms.modules.master.entity.QcItem import com.ffii.fpsms.modules.master.entity.UomConversion import com.ffii.fpsms.modules.stock.entity.StockInLine @@ -35,6 +36,7 @@ data class PoLineWithStockInLine ( val receivedQty: BigDecimal, @get:Value("#{target.uom}") val uom: UomConversion, + val stockUom: StockUomForPoLine, val price: BigDecimal, val status: String, @@ -48,4 +50,15 @@ data class QcForPoLine ( val code: String?, val name: String?, val description: String?, +) + +data class StockUomForPoLine ( + val id: Long? = null, + val stockUomCode: String? = null, + val stockUomDesc: String? = null, + val stockQty: BigDecimal? = null, + val stockRatioN: BigDecimal? = null, + val stockRatioD: BigDecimal? = null, + val purchaseRatioN: BigDecimal? = null, + val purchaseRatioD: BigDecimal? = null, ) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt index 32ac8d9..f04f3f7 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt @@ -10,15 +10,13 @@ import com.ffii.fpsms.m18.utils.CommonUtils import com.ffii.fpsms.modules.master.entity.QcItem import com.ffii.fpsms.modules.master.entity.ShopRepository import com.ffii.fpsms.modules.master.service.CurrencyService +import com.ffii.fpsms.modules.master.service.ItemUomService import com.ffii.fpsms.modules.master.service.ShopService import com.ffii.fpsms.modules.master.web.models.MessageResponse import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrder import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLineRepository import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository -import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PoLineWithStockInLine -import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderDataClass -import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderInfo -import com.ffii.fpsms.modules.purchaseOrder.entity.projections.QcForPoLine +import com.ffii.fpsms.modules.purchaseOrder.entity.projections.* import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderLineStatus import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderStatus import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderType @@ -53,6 +51,7 @@ open class PurchaseOrderService( private val currencyService: CurrencyService, private val shopService: ShopService, private val grnSendLogRepository: GrnSendLogRepository, + val itemUomService: ItemUomService, ) : AbstractBaseEntityService(jdbcDao, purchaseOrderRepository) { // open fun getPurchaseOrderInfo(args: Map): List> { // val sql = StringBuilder( @@ -166,7 +165,7 @@ open class PurchaseOrderService( // println(value1) // println(value1 == 1L) // println(value2) - println(mappedList) +// println(mappedList) return mappedList } @@ -194,6 +193,19 @@ open class PurchaseOrderService( description = it.description ) } ?: mutableListOf(); + val purchaseUnit = thisPol.item?.id?.let { itemUomService.findPurchaseUnitByItemId(it) } + val stockUnit = thisPol.item?.id?.let { itemUomService.findStockUnitByItemId(it).let { iu -> + StockUomForPoLine( + id = iu?.id, + stockUomCode = iu?.uom?.code, + stockUomDesc = iu?.uom?.udfudesc, + stockQty = iu?.item?.id?.let { iId -> itemUomService.convertPurchaseQtyToStockQty(iId, (thisPol.qty ?: BigDecimal.ZERO)) } ?: BigDecimal.ZERO, + stockRatioN = iu?.ratioN, + stockRatioD = iu?.ratioD, + purchaseRatioN = purchaseUnit?.ratioN, + purchaseRatioD = purchaseUnit?.ratioD, + ) + } } ?: StockUomForPoLine() PoLineWithStockInLine( id = thisPol.id!!, purchaseOrderId = thisPol.purchaseOrder!!.id!!, @@ -207,12 +219,14 @@ open class PurchaseOrderService( price = thisPol.price!!, status = thisPol.status!!.toString(), stockInLine = inLine, - qcItems = qcItems + qcItems = qcItems, + stockUom = stockUnit ) } val result = mapOf( "id" to po.id, "code" to po.code, + "supplier" to (po.supplier ?: "N/A"), "orderDate" to po.orderDate, "estimatedArrivalDate" to po.estimatedArrivalDate, "completeDate" to po.completeDate,