diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt index 1645a8f..2b3a7f4 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt @@ -47,6 +47,9 @@ import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecordReposito import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecord import org.springframework.context.annotation.Lazy import com.ffii.fpsms.modules.pickOrder.entity.PickOrderLineRepository +import com.ffii.fpsms.modules.stock.entity.StockOutLIneRepository +import com.ffii.fpsms.modules.stock.entity.StockLedgerRepository +import com.ffii.fpsms.modules.pickOrder.entity.PickExecutionIssueRepository import com.ffii.fpsms.modules.deliveryOrder.web.models.TicketReleaseTableResponse import com.ffii.fpsms.modules.deliveryOrder.web.models.TruckScheduleDashboardResponse import com.ffii.fpsms.modules.deliveryOrder.web.models.SearchDeliveryOrderInfoRequest @@ -64,7 +67,10 @@ open class DoPickOrderService( private val doPickOrderLineRepository: DoPickOrderLineRepository, @Lazy private val deliveryOrderRepository: DeliveryOrderRepository, private val doPickOrderLineRecordRepository: DoPickOrderLineRecordRepository, - private val pickOrderLineRepository: PickOrderLineRepository + private val pickOrderLineRepository: PickOrderLineRepository, + private val stockOutLineRepository: StockOutLIneRepository, + private val stockLedgerRepository: StockLedgerRepository, + private val pickExecutionIssueRepository: PickExecutionIssueRepository ) { open fun findReleasedDoPickOrders(): List { return doPickOrderRepository.findByTicketStatusIn( @@ -636,7 +642,6 @@ open class DoPickOrderService( } } - open fun getTicketReleaseTable(startDate: LocalDate? = null, endDate: LocalDate? = null): List { val doPickOrders = if (startDate != null && endDate != null) { doPickOrderRepository.findAllByDeletedFalseAndRequiredDeliveryDateBetween(startDate, endDate) @@ -723,6 +728,89 @@ open class DoPickOrderService( return allPickOrderLines.size } + /** + * Reset a DO pick order back to the "non-pick" / pending state so it can be processed again. + * This is used by the Finished Good page to undo a ticket that has already been released/handled. + */ + @Transactional + open fun resetToNonPick(doPickOrderId: Long): MessageResponse { + val doPickOrder = doPickOrderRepository.findById(doPickOrderId).orElse(null) + ?: return MessageResponse( + id = null, + code = "NOT_FOUND", + name = null, + type = null, + message = "DO Pick Order not found", + errorPosition = null, + entity = null + ) + + // Reset handler and ticket status/timestamps back to pending (non-pick) + doPickOrder.handledBy = null + doPickOrder.handlerName = null + doPickOrder.ticketStatus = DoPickOrderStatus.pending + doPickOrder.ticketReleaseTime = null + doPickOrder.ticketCompleteDateTime = null + + // Reset scanned result & unassign related pick orders (do NOT delete pick orders/lines) + val doPickOrderLines = doPickOrderLineRepository.findByDoPickOrderIdAndDeletedFalse(doPickOrder.id!!) + val pickOrderIds = doPickOrderLines.mapNotNull { it.pickOrderId }.distinct() + + if (pickOrderIds.isNotEmpty()) { + // 1) Load all pick-order lines under these pick orders + val allPickOrderLines = pickOrderIds.flatMap { pid -> + pickOrderLineRepository.findAllByPickOrderIdAndDeletedFalse(pid) + } + val pickOrderLineIds = allPickOrderLines.mapNotNull { it.id }.distinct() + + if (pickOrderLineIds.isNotEmpty()) { + // 2) Delete stock_ledger rows linked to these stock_out_line rows + val stockOutLines = stockOutLineRepository.findAllByPickOrderLineIdInAndDeletedFalse(pickOrderLineIds) + if (stockOutLines.isNotEmpty()) { + val stockOutLineIds = stockOutLines.mapNotNull { it.id }.distinct() + if (stockOutLineIds.isNotEmpty()) { + val ledgers = stockLedgerRepository.findAllByStockOutLineIdInAndDeletedFalse(stockOutLineIds) + if (ledgers.isNotEmpty()) { + stockLedgerRepository.deleteAll(ledgers) + } + } + // 3) Delete stock_out_line rows (scan results) + stockOutLineRepository.deleteAll(stockOutLines) + } + + // 4) Delete pick_execution_issue rows for these pick-order lines + pickOrderLineIds.forEach { polId -> + val issues = pickExecutionIssueRepository.findByPickOrderLineIdAndDeletedFalse(polId) + if (issues.isNotEmpty()) { + pickExecutionIssueRepository.deleteAll(issues) + } + } + } + + // 5) Unassign pick orders and reset their status (keep rows) + val pickOrders = pickOrderRepository.findAllById(pickOrderIds) + if (pickOrders.isNotEmpty()) { + pickOrders.forEach { po -> + po.assignTo = null + po.status = PickOrderStatus.PENDING + } + pickOrderRepository.saveAll(pickOrders) + } + } + + val saved = doPickOrderRepository.save(doPickOrder) + + return MessageResponse( + id = saved.id, + code = "SUCCESS", + name = null, + type = null, + message = "DO Pick Order has been reset to non-pick state", + errorPosition = null, + entity = null + ) + } + private fun countFGItemsFromRecord(doPickOrderRecord: DoPickOrderRecord): Int { // RECORD_ID FROM DO_PICK_ORDER_RECORD TABLE diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DoPickOrderController.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DoPickOrderController.kt index f74a198..d9833c1 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DoPickOrderController.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DoPickOrderController.kt @@ -134,4 +134,16 @@ class DoPickOrderController( return doPickOrderService.getTruckScheduleDashboard(date ?: LocalDate.now()) } + @PostMapping("/reset-to-non-pick") + fun resetToNonPick( + @RequestParam("doPickOrderRecordId") doPickOrderRecordId: Long + ): ResponseEntity { + val result = doPickOrderService.resetToNonPick(doPickOrderRecordId) + return if (result.code == "SUCCESS") { + ResponseEntity.noContent().build() + } else { + ResponseEntity.badRequest().build() + } + } + } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockLedgerRepository.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockLedgerRepository.kt index e48a921..5f8d2b6 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockLedgerRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockLedgerRepository.kt @@ -56,5 +56,14 @@ interface StockLedgerRepository: AbstractRepository { WHERE sl.itemId = :itemId AND sl.deleted = false ORDER BY sl.date DESC, sl.id DESC """) -fun findLatestByItemId(@Param("itemId") itemId: Long): List -} \ No newline at end of file + fun findLatestByItemId(@Param("itemId") itemId: Long): List + + @Query(""" + SELECT sl FROM StockLedger sl + WHERE sl.deleted = false + AND sl.stockOutLine.id IN :stockOutLineIds + """) + fun findAllByStockOutLineIdInAndDeletedFalse( + @Param("stockOutLineIds") stockOutLineIds: List + ): List +} \ No newline at end of file