From 3cf33f883e7be7bad427247ac671127c988cfa4c Mon Sep 17 00:00:00 2001 From: "vluk@2fi-solutions.com.hk" Date: Wed, 25 Feb 2026 14:19:34 +0800 Subject: [PATCH] Mark not exist po line as deleted when sync --- .../m18/service/M18PurchaseOrderService.kt | 10 +++++++++- .../entity/PurchaseOrderLineRepository.kt | 1 + .../service/PurchaseOrderLineService.kt | 20 +++++++++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ffii/fpsms/m18/service/M18PurchaseOrderService.kt b/src/main/java/com/ffii/fpsms/m18/service/M18PurchaseOrderService.kt index a847b6f..8d61bcc 100644 --- a/src/main/java/com/ffii/fpsms/m18/service/M18PurchaseOrderService.kt +++ b/src/main/java/com/ffii/fpsms/m18/service/M18PurchaseOrderService.kt @@ -324,7 +324,6 @@ open class M18PurchaseOrderService( } // purchase_order_line + m18_data_log - // TODO: check deleted po line? if (pot != null) { // Loop for Purchase Order Lines (pot) pot.forEach { line -> @@ -426,6 +425,15 @@ open class M18PurchaseOrderService( // logger.error("${poLineRefType}: M18 Data Log Updated! Please see the error. ID: ${saveM18PurchaseOrderLineLog.id}") } } + // Mark as deleted any local PO lines that no longer exist in M18 (removed there) + if (purchaseOrderId != null) { + val m18LineIds = pot.map { it.id }.toSet() + val markedDeleted = + purchaseOrderLineService.markDeletedLinesNotInM18(purchaseOrderId, m18LineIds) + if (markedDeleted > 0) { + logger.info("${poLineRefType}: Marked $markedDeleted line(s) as deleted (not in M18). PO ID: $purchaseOrderId | M18 PO ID: ${purchaseOrder.id}") + } + } } else { // pot // logger.error("${poLineRefType}: Saving Failure!") diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLineRepository.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLineRepository.kt index 4de0519..2fb8f16 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLineRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLineRepository.kt @@ -11,6 +11,7 @@ interface PurchaseOrderLineRepository : AbstractRepository fun findAllByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List + fun findAllByPurchaseOrderIdAndDeletedIsFalseAndM18DataLogIsNotNull(purchaseOrderId: Long): List fun findAllByPurchaseOrderIdAndStatusNotAndDeletedIsFalse(purchaseOrderId: Long, status: PurchaseOrderLineStatus): List // fun findAllByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List // fun find diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderLineService.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderLineService.kt index d20d6a6..583d455 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderLineService.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderLineService.kt @@ -34,6 +34,26 @@ open class PurchaseOrderLineService( return purchaseOrderLineRepository.findByM18DataLogIdAndDeletedIsFalse(m18DataLogId) } + /** + * Mark as deleted any local PO lines for this PO that were synced from M18 but whose M18 line id + * is not in the given set (i.e. the line was deleted in M18). + * @return number of lines marked as deleted + */ + open fun markDeletedLinesNotInM18(purchaseOrderId: Long, m18LineIds: Set): Int { + val linesFromM18 = + purchaseOrderLineRepository.findAllByPurchaseOrderIdAndDeletedIsFalseAndM18DataLogIsNotNull(purchaseOrderId) + var count = 0 + linesFromM18.forEach { line -> + val m18Id = line.m18DataLog?.m18Id ?: return@forEach + if (m18Id !in m18LineIds) { + line.deleted = true + purchaseOrderLineRepository.saveAndFlush(line) + count++ + } + } + return count + } + open fun findAllPoLineInfoByPoId(poId: Long): List { return purchaseOrderLineRepository.findAllPurchaseOrderLineInfoByPurchaseOrderIdAndDeletedIsFalse(poId) }