@@ -1,19 +1,23 @@ | |||
package com.ffii.fpsms.modules.pickOrder.service | |||
import com.ffii.core.response.RecordsRes | |||
import com.ffii.core.support.AbstractBaseEntityService | |||
import com.ffii.core.support.JdbcDao | |||
import com.ffii.fpsms.modules.common.SecurityUtils | |||
import com.ffii.fpsms.modules.pickOrder.entity.PickOrder | |||
import com.ffii.fpsms.modules.pickOrder.entity.PickOrderRepository | |||
import com.ffii.fpsms.modules.pickOrder.entity.projection.PickOrderInfo | |||
import com.ffii.fpsms.modules.pickOrder.enums.PickOrderStatus | |||
import com.ffii.fpsms.modules.pickOrder.web.models.* | |||
import com.ffii.fpsms.modules.stock.entity.InventoryLotLineRepository | |||
import com.ffii.fpsms.modules.stock.entity.StockOut | |||
import com.ffii.fpsms.modules.stock.entity.StockOutLIneRepository | |||
import com.ffii.fpsms.modules.stock.entity.StockOutRepository | |||
import com.ffii.fpsms.modules.stock.entity.projection.CurrentInventoryItemInfo | |||
import com.ffii.fpsms.modules.stock.service.InventoryService | |||
import com.ffii.fpsms.modules.stock.service.StockOutLineService | |||
import com.ffii.fpsms.modules.stock.service.SuggestedPickLotService | |||
import com.ffii.fpsms.modules.stock.web.model.StockOutLineStatus | |||
import com.ffii.fpsms.modules.stock.web.model.StockOutStatus | |||
import com.ffii.fpsms.modules.stock.web.model.SuggestedPickLotForPoRequest | |||
import com.ffii.fpsms.modules.user.entity.UserRepository | |||
@@ -23,6 +27,7 @@ import org.springframework.http.HttpStatus | |||
import org.springframework.http.ResponseEntity | |||
import org.springframework.stereotype.Service | |||
import org.springframework.transaction.annotation.Transactional | |||
import java.io.IOException | |||
import java.io.Serializable | |||
import java.math.BigDecimal | |||
import java.time.LocalDate | |||
@@ -34,13 +39,13 @@ import kotlin.jvm.optionals.getOrNull | |||
open class PickOrderService( | |||
private val jdbcDao: JdbcDao, | |||
val pickOrderRepository: PickOrderRepository, | |||
val stockOutLineService: StockOutLineService, | |||
val suggestedPickLotService: SuggestedPickLotService, | |||
val userService: UserService, | |||
private val stockOutLIneRepository: StockOutLIneRepository, | |||
private val inventoryLotLineRepository: InventoryLotLineRepository, | |||
val inventoryService: InventoryService, | |||
private val stockOutRepository: StockOutRepository | |||
) { | |||
): AbstractBaseEntityService<PickOrder, Long, PickOrderRepository>(jdbcDao, pickOrderRepository) { | |||
open fun localDateTimeParse(dateTime: String?, pattern: String? = "YYYY-MM-DD hh:mm:ss"): LocalDateTime? { | |||
try { | |||
val formatter = DateTimeFormatter.ofPattern(pattern!!) | |||
@@ -424,4 +429,30 @@ open class PickOrderService( | |||
return releaseConsoPickOrderInfo(request.consoCode) | |||
} | |||
@Throws(IOException::class) | |||
@Transactional | |||
open fun completeStockOut(consoCode: String): Boolean { | |||
val stockOut = stockOutRepository.findByConsoPickOrderCode(consoCode).orElseThrow() | |||
val stockOutLines = stockOutLIneRepository.findAllByStockOutId(stockOut.id!!) | |||
val unfinishedLines = stockOutLines.filter { | |||
it.status != StockOutLineStatus.COMPLETE.status | |||
&& it.status != StockOutLineStatus.REJECTED.status | |||
} | |||
if (unfinishedLines.isEmpty()) { | |||
stockOut.apply { | |||
this.status = StockOutStatus.COMPLETE.status | |||
} | |||
stockOutRepository.save(stockOut) | |||
val pickOrderEntries = pickOrderRepository.findAllByConsoCode(consoCode).map { | |||
it.apply { | |||
it.status = PickOrderStatus.COMPLETED | |||
} | |||
} | |||
pickOrderRepository.saveAll(pickOrderEntries) | |||
return true | |||
} else { | |||
return false | |||
} | |||
} | |||
} |
@@ -101,4 +101,10 @@ class PickOrderController( | |||
fun pickConsoPickOrderInfo(@PathVariable consoCode: String): ReleasePickOrderInfoResponse { | |||
return pickOrderService.releaseConsoPickOrderInfo(consoCode); | |||
} | |||
@PostMapping("/consoPickOrder/complete/{consoCode}") | |||
fun completeConsoPickOrders(@PathVariable consoCode: String): Boolean { | |||
return pickOrderService.completeStockOut(consoCode) | |||
} | |||
} |
@@ -14,4 +14,6 @@ interface StockOutLIneRepository: AbstractRepository<StockOutLine, Long> { | |||
fun findAllByIdIn(id: List<Long>): List<StockOutLineInfo> | |||
fun findStockOutLineInfoById(id: Long): StockOutLineInfo | |||
fun findAllByStockOutId(stockOutId: Long): List<StockOutLine> | |||
} |
@@ -5,6 +5,8 @@ import com.ffii.core.support.JdbcDao | |||
import com.ffii.fpsms.modules.master.entity.Items | |||
import com.ffii.fpsms.modules.master.entity.ItemsRepository | |||
import com.ffii.fpsms.modules.master.web.models.MessageResponse | |||
import com.ffii.fpsms.modules.pickOrder.entity.PickOrderRepository | |||
import com.ffii.fpsms.modules.pickOrder.enums.PickOrderStatus | |||
import com.ffii.fpsms.modules.stock.entity.* | |||
import com.ffii.fpsms.modules.stock.web.model.SaveStockOutRequest | |||
import com.ffii.fpsms.modules.stock.web.model.StockOutLineStatus | |||
@@ -18,79 +20,11 @@ import java.time.LocalDateTime | |||
@Service | |||
open class StockOutService( | |||
private val jdbcDao: JdbcDao, | |||
private val pickOrderRepository: PickOrderRepository, | |||
private val stockOutRepository: StockOutRepository, | |||
private val stockOutLIneRepository: StockOutLIneRepository, | |||
private val stockOutLineService: StockOutLineService, | |||
private val stockLedgerRepository: StockLedgerRepository, | |||
): AbstractBaseEntityService<StockOut, Long, StockOutRepository>(jdbcDao, stockOutRepository) { | |||
@Throws(IOException::class) | |||
@Transactional | |||
open fun complete(request: SaveStockOutRequest): MessageResponse { | |||
if (request.id === null) { | |||
return MessageResponse( | |||
id = null, | |||
code = null, | |||
name = null, | |||
type = null, | |||
message = "id cannot be null", | |||
errorPosition = "id" | |||
) | |||
} | |||
/// checking pick quantity | |||
val stockOut = stockOutRepository.findById(request.id).orElseThrow() | |||
val allLines = stockOutLineService.findAllByStockOutId(request.id) | |||
val isBalanced = allLines.all{ | |||
val status = it.status | |||
var sum = 0.0 | |||
when (status) { | |||
StockOutLineStatus.PENDING.status -> sum += it.qty ?: 0.0; | |||
// StockOutLineStatus.PICKED.status -> sum -= it.qty ?: 0.0; | |||
} | |||
sum == 0.0 | |||
} | |||
if (!isBalanced) { | |||
return MessageResponse( | |||
id = request.id, | |||
code = "stockOut.consoCode", | |||
name = "stockOut.pickOrderCode ?: stockOut.deliveryOrderCode", | |||
type = stockOut.type, | |||
message = "there are items not picked", | |||
errorPosition = null | |||
) | |||
} | |||
// remove base record | |||
val baseLines = allLines.filter { stockOutLine -> stockOutLine.status === StockOutLineStatus.PENDING.status} | |||
// update pick record to complete | |||
val pickLines = allLines | |||
// .filter { stockOutLine -> stockOutLine.status === StockOutLineStatus.PICKED.status} | |||
.map { stockOutLine -> | |||
stockOutLine.apply { | |||
status = StockOutLineStatus.COMPLETE.status | |||
} | |||
} | |||
// write ledger | |||
val ledgers = pickLines.map {stockOutLine -> | |||
StockLedger().apply { | |||
this.stockOutLine = stockOutLine | |||
// this.inventory = stockOutLine.inventory | |||
outQty = stockOutLine.qty | |||
} | |||
} | |||
stockLedgerRepository.saveAll(ledgers) | |||
stockOutLIneRepository.deleteAll(baseLines) | |||
stockOutLIneRepository.saveAll(pickLines) | |||
stockOut.apply { | |||
completeDate = LocalDateTime.now() | |||
status = StockOutStatus.COMPLETE.status | |||
} | |||
val savedStockOut = stockOutRepository.saveAndFlush(stockOut) | |||
return MessageResponse( | |||
id = savedStockOut.id, | |||
code = "savedStockOut.consoCode", | |||
name = "savedStockOut.pickOrderCode ?: savedStockOut.deliveryOrderCode", | |||
type = savedStockOut.type, | |||
message = "stock out completed", | |||
errorPosition = null | |||
) | |||
} | |||
} |
@@ -0,0 +1,12 @@ | |||
package com.ffii.fpsms.modules.stock.web | |||
import com.ffii.fpsms.modules.stock.service.StockOutService | |||
import org.springframework.web.bind.annotation.RequestMapping | |||
import org.springframework.web.bind.annotation.RestController | |||
@RestController | |||
@RequestMapping("/stockOut") | |||
class StockOutController( | |||
private val stockOutService: StockOutService | |||
) { | |||
} |