|
|
@@ -90,6 +90,7 @@ import com.ffii.fpsms.modules.deliveryOrder.entity.models.DeliveryOrderLineInfo |
|
|
import com.ffii.fpsms.modules.master.entity.Items |
|
|
import com.ffii.fpsms.modules.master.entity.Items |
|
|
import com.ffii.fpsms.modules.pickOrder.entity.PickOrderLine |
|
|
import com.ffii.fpsms.modules.pickOrder.entity.PickOrderLine |
|
|
import com.ffii.fpsms.modules.stock.entity.InventoryLotLine |
|
|
import com.ffii.fpsms.modules.stock.entity.InventoryLotLine |
|
|
|
|
|
import com.ffii.fpsms.modules.stock.entity.enum.InventoryLotLineStatus |
|
|
import com.ffii.fpsms.modules.stock.entity.projection.StockOutLineInfo |
|
|
import com.ffii.fpsms.modules.stock.entity.projection.StockOutLineInfo |
|
|
import java.util.Locale |
|
|
import java.util.Locale |
|
|
import org.slf4j.Logger |
|
|
import org.slf4j.Logger |
|
|
@@ -462,9 +463,24 @@ open class DeliveryOrderService( |
|
|
return deliveryOrderRepository.findByIdAndDeletedIsFalse(id); |
|
|
return deliveryOrderRepository.findByIdAndDeletedIsFalse(id); |
|
|
} |
|
|
} |
|
|
*/ |
|
|
*/ |
|
|
|
|
|
private fun computeAvailableStockQtyForItem(itemId: Long): BigDecimal { |
|
|
|
|
|
val availableLots = inventoryLotLineRepository |
|
|
|
|
|
.findAllByInventoryLotItemIdAndStatus(itemId, InventoryLotLineStatus.AVAILABLE) |
|
|
|
|
|
return availableLots.sumOf { lot -> |
|
|
|
|
|
(lot.inQty ?: BigDecimal.ZERO) |
|
|
|
|
|
.minus(lot.outQty ?: BigDecimal.ZERO) |
|
|
|
|
|
.minus(lot.holdQty ?: BigDecimal.ZERO) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
open fun getDetailedDo(id: Long): DoDetailResponse? { |
|
|
open fun getDetailedDo(id: Long): DoDetailResponse? { |
|
|
val deliveryOrder = deliveryOrderRepository.findByIdAndDeletedIsFalse(id) ?: return null |
|
|
val deliveryOrder = deliveryOrderRepository.findByIdAndDeletedIsFalse(id) ?: return null |
|
|
|
|
|
|
|
|
|
|
|
val itemIds = deliveryOrder.deliveryOrderLines.mapNotNull { it.item?.id }.distinct() |
|
|
|
|
|
val stockQtyByItemId = itemIds.associateWith { itemId -> |
|
|
|
|
|
computeAvailableStockQtyForItem(itemId) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return DoDetailResponse( |
|
|
return DoDetailResponse( |
|
|
id = deliveryOrder.id!!, |
|
|
id = deliveryOrder.id!!, |
|
|
code = deliveryOrder.code ?: "", |
|
|
code = deliveryOrder.code ?: "", |
|
|
@@ -478,6 +494,12 @@ open class DeliveryOrderService( |
|
|
status = deliveryOrder.status?.value, |
|
|
status = deliveryOrder.status?.value, |
|
|
isExtra = deliveryOrder.isExtra, |
|
|
isExtra = deliveryOrder.isExtra, |
|
|
deliveryOrderLines = deliveryOrder.deliveryOrderLines.map { line -> |
|
|
deliveryOrderLines = deliveryOrder.deliveryOrderLines.map { line -> |
|
|
|
|
|
val itemId = line.item?.id |
|
|
|
|
|
val stockQty = itemId?.let { stockQtyByItemId[it] } ?: BigDecimal.ZERO |
|
|
|
|
|
val requiredQty = line.qty ?: BigDecimal.ZERO |
|
|
|
|
|
val availableStatus = |
|
|
|
|
|
if (stockQty >= requiredQty) "available" else "insufficient" |
|
|
|
|
|
|
|
|
DoDetailLineResponse( |
|
|
DoDetailLineResponse( |
|
|
id = line.id!!, |
|
|
id = line.id!!, |
|
|
itemNo = line.itemNo, |
|
|
itemNo = line.itemNo, |
|
|
@@ -487,7 +509,9 @@ open class DeliveryOrderService( |
|
|
itemName = line.item?.name, |
|
|
itemName = line.item?.name, |
|
|
uomCode = line.uom?.code, |
|
|
uomCode = line.uom?.code, |
|
|
uom = line.uom?.udfudesc, |
|
|
uom = line.uom?.udfudesc, |
|
|
shortUom = line.uom?.udfShortDesc |
|
|
|
|
|
|
|
|
shortUom = line.uom?.udfShortDesc, |
|
|
|
|
|
stockQty = stockQty, |
|
|
|
|
|
availableStatus = availableStatus, |
|
|
) |
|
|
) |
|
|
} |
|
|
} |
|
|
) |
|
|
) |
|
|
|