|
|
|
@@ -414,37 +414,52 @@ open class StockInLineService( |
|
|
|
* Builds M18 Goods Receipt Note (AN) request from completed PO and its completed stock-in lines. |
|
|
|
*/ |
|
|
|
private fun buildGoodsReceiptNoteRequest(po: PurchaseOrder, stockInLines: List<StockInLine>): GoodsReceiptNoteRequest { |
|
|
|
val poCode = po.code ?: "" |
|
|
|
val beId = po.m18BeId?.toInt() ?: 1 |
|
|
|
val flowTypeId = when { |
|
|
|
poCode.startsWith("TOA") -> 1 |
|
|
|
poCode.startsWith("PF") -> 2 |
|
|
|
poCode.startsWith("PP") -> 3 |
|
|
|
else -> 1 |
|
|
|
} |
|
|
|
val mainan = GoodsReceiptNoteMainan( |
|
|
|
values = listOf( |
|
|
|
GoodsReceiptNoteMainanValue( |
|
|
|
beId = po.m18BeId!!.toInt(), |
|
|
|
code = po.code!!, |
|
|
|
id = null, // omit; "0" and "" didn't fix core_201 |
|
|
|
beId = beId, |
|
|
|
code = null, // omit; empty string may cause 400 |
|
|
|
venId = (po.supplier?.m18Id ?: 0L).toInt(), |
|
|
|
curId = (po.currency?.m18Id ?: 0L).toInt(), |
|
|
|
rate = 1, |
|
|
|
flowTypeId = 1, // TODO temp for M18 API |
|
|
|
staffId = 232, // TODO temp for M18 API; revert to config/default when done |
|
|
|
virDeptId = 117, // TODO temp for M18 API |
|
|
|
flowTypeId = flowTypeId, |
|
|
|
staffId = 194, // Steve |
|
|
|
virDeptId = po.shop?.m18Id?.toInt(), |
|
|
|
tDate = (po.estimatedArrivalDate?.toLocalDate() ?: LocalDate.now()).format(DateTimeFormatter.ofPattern("MM/dd/yyyy")), |
|
|
|
status = null, // commented out - omit |
|
|
|
// docDate = ..., locId = ..., cnDeptId = ... |
|
|
|
) |
|
|
|
) |
|
|
|
) |
|
|
|
val sourceId = po.m18DataLog?.m18Id ?: 0L |
|
|
|
val antValues = stockInLines.map { sil -> |
|
|
|
val pol = sil.purchaseOrderLine!! |
|
|
|
val unitIdFromDataLog = (pol.m18DataLog?.dataLog?.get("unitId") as? Number)?.toLong()?.toInt() |
|
|
|
GoodsReceiptNoteAntValue( |
|
|
|
sourceType = "po", |
|
|
|
sourceId = sourceId, |
|
|
|
sourceLot = sil.lotNo ?: "", |
|
|
|
sourceLot = pol.m18Lot ?: "", |
|
|
|
proId = (sil.item?.m18Id ?: 0L).toInt(), |
|
|
|
locId = 39, // TODO temp for M18 API |
|
|
|
unitId = (pol.uom?.m18Id ?: 0L).toInt(), |
|
|
|
locId = 155, |
|
|
|
unitId = unitIdFromDataLog ?: (pol.uom?.m18Id ?: 0L).toInt(), |
|
|
|
qty = sil.acceptedQty?.toDouble() ?: 0.0, |
|
|
|
up = pol.up?.toDouble() ?: 0.0, |
|
|
|
amt = CommonUtils.getAmt( |
|
|
|
up = pol.up ?: BigDecimal.ZERO, |
|
|
|
discount = pol.m18Discount ?: BigDecimal.ZERO, |
|
|
|
qty = sil.acceptedQty ?: BigDecimal.ZERO |
|
|
|
) |
|
|
|
), |
|
|
|
beId = beId, // same as header |
|
|
|
flowTypeId = flowTypeId // same as header: TOA->1, PF->2, PP->3 |
|
|
|
) |
|
|
|
} |
|
|
|
val ant = GoodsReceiptNoteAnt(values = antValues) |
|
|
|
@@ -506,6 +521,10 @@ open class StockInLineService( |
|
|
|
logger.info("[tryUpdatePurchaseOrderAndCreateGrnIfCompleted] DEBUG: Skipping M18 GRN - missing M18 ids for PO id=${savedPo.id} code=${savedPo.code}. m18BeId=${savedPo.m18BeId}, supplier.m18Id=${savedPo.supplier?.m18Id}, currency.m18Id=${savedPo.currency?.m18Id}") |
|
|
|
return |
|
|
|
} |
|
|
|
if (m18GoodsReceiptNoteLogRepository.existsByPurchaseOrderIdAndStatusTrue(savedPo.id!!)) { |
|
|
|
logger.info("[tryUpdatePurchaseOrderAndCreateGrnIfCompleted] Skipping M18 GRN - already created for PO id=${savedPo.id} code=${savedPo.code} (avoids core_201 duplicate)") |
|
|
|
return |
|
|
|
} |
|
|
|
val grnRequest = buildGoodsReceiptNoteRequest(savedPo, linesForGrn) |
|
|
|
val grnRequestJson = Gson().toJson(grnRequest) |
|
|
|
logger.info("[tryUpdatePurchaseOrderAndCreateGrnIfCompleted] M18 GRN API request (for discussion with M18) PO id=${savedPo.id} code=${savedPo.code}: $grnRequestJson") |
|
|
|
|