| @@ -2,6 +2,7 @@ package com.ffii.fpsms.modules.purchaseOrder.entity | |||||
| import com.ffii.core.support.AbstractRepository | import com.ffii.core.support.AbstractRepository | ||||
| import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderLineInfo | import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderLineInfo | ||||
| import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderLineStatus | |||||
| import org.springframework.stereotype.Repository | import org.springframework.stereotype.Repository | ||||
| import java.io.Serializable | import java.io.Serializable | ||||
| @@ -10,6 +11,6 @@ interface PurchaseOrderLineRepository : AbstractRepository<PurchaseOrderLine, Lo | |||||
| fun findByM18DataLogIdAndDeletedIsFalse(m18datalogId: Serializable): PurchaseOrderLine? | fun findByM18DataLogIdAndDeletedIsFalse(m18datalogId: Serializable): PurchaseOrderLine? | ||||
| fun findAllPurchaseOrderLineInfoByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List<PurchaseOrderLineInfo> | fun findAllPurchaseOrderLineInfoByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List<PurchaseOrderLineInfo> | ||||
| fun findAllByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List<PurchaseOrderLine> | fun findAllByPurchaseOrderIdAndDeletedIsFalse(purchaseOrderId: Long): List<PurchaseOrderLine> | ||||
| // fun find | |||||
| fun findAllByPurchaseOrderIdAndStatusNotAndDeletedIsFalse(purchaseOrderId: Long, status: PurchaseOrderLineStatus): List<PurchaseOrderLine> | |||||
| // fun find | |||||
| } | } | ||||
| @@ -6,11 +6,13 @@ import com.ffii.fpsms.m18.entity.M18DataLogRepository | |||||
| import com.ffii.fpsms.modules.master.entity.ShopRepository | import com.ffii.fpsms.modules.master.entity.ShopRepository | ||||
| import com.ffii.fpsms.modules.master.service.CurrencyService | import com.ffii.fpsms.modules.master.service.CurrencyService | ||||
| import com.ffii.fpsms.modules.master.service.ShopService | import com.ffii.fpsms.modules.master.service.ShopService | ||||
| import com.ffii.fpsms.modules.master.web.models.MessageResponse | |||||
| import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrder | import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrder | ||||
| import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLineRepository | import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLineRepository | ||||
| import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository | import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository | ||||
| import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PoLineWithStockInLine | import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PoLineWithStockInLine | ||||
| import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderInfo | import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderInfo | ||||
| import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderLineStatus | |||||
| import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderStatus | import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderStatus | ||||
| import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderType | import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderType | ||||
| import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderRequest | import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderRequest | ||||
| @@ -131,5 +133,38 @@ open class PurchaseOrderService( | |||||
| return savedPurchaseOrder | return savedPurchaseOrder | ||||
| } | } | ||||
| fun checkPolAndCompletePo(id: Long): MessageResponse { | |||||
| val unfinishedLines = purchaseOrderLineRepository | |||||
| .findAllByPurchaseOrderIdAndStatusNotAndDeletedIsFalse( | |||||
| purchaseOrderId = id, | |||||
| status = PurchaseOrderLineStatus.COMPLETED | |||||
| ) | |||||
| val po = purchaseOrderRepository.findById(id).orElseThrow() | |||||
| if (unfinishedLines.isEmpty()) { | |||||
| po.apply { | |||||
| status = PurchaseOrderStatus.COMPLETED | |||||
| } | |||||
| val savedPo = purchaseOrderRepository.saveAndFlush(po) | |||||
| return MessageResponse( | |||||
| id = savedPo.id, | |||||
| name = savedPo.code, | |||||
| code = savedPo.code, | |||||
| type = PurchaseOrderStatus.COMPLETED.value, | |||||
| message = "Update Success", | |||||
| errorPosition = null, | |||||
| entity = savedPo, | |||||
| ) | |||||
| } | |||||
| val unfinishedIds = unfinishedLines.map { it.id } | |||||
| return MessageResponse( | |||||
| id = po.id, | |||||
| name = po.code, | |||||
| code = null, | |||||
| type = PurchaseOrderStatus.RECEIVING.value, | |||||
| message = "Still have unfinished po lines", | |||||
| errorPosition = "Unfinished", | |||||
| entity = unfinishedIds, | |||||
| ) | |||||
| } | |||||
| } | } | ||||
| @@ -3,13 +3,11 @@ package com.ffii.fpsms.modules.purchaseOrder.web | |||||
| import com.ffii.core.support.JdbcDao | import com.ffii.core.support.JdbcDao | ||||
| import com.ffii.fpsms.modules.master.entity.Items | import com.ffii.fpsms.modules.master.entity.Items | ||||
| import com.ffii.fpsms.modules.master.service.ItemsService | import com.ffii.fpsms.modules.master.service.ItemsService | ||||
| import com.ffii.fpsms.modules.master.web.models.MessageResponse | |||||
| import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrder | import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrder | ||||
| import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderInfo | import com.ffii.fpsms.modules.purchaseOrder.entity.projections.PurchaseOrderInfo | ||||
| import com.ffii.fpsms.modules.purchaseOrder.service.PurchaseOrderService | import com.ffii.fpsms.modules.purchaseOrder.service.PurchaseOrderService | ||||
| import org.springframework.web.bind.annotation.GetMapping | |||||
| import org.springframework.web.bind.annotation.PathVariable | |||||
| import org.springframework.web.bind.annotation.RequestMapping | |||||
| import org.springframework.web.bind.annotation.RestController | |||||
| import org.springframework.web.bind.annotation.* | |||||
| @RestController | @RestController | ||||
| @RequestMapping("/po") | @RequestMapping("/po") | ||||
| @@ -20,8 +18,13 @@ class PurchaseOrderController( | |||||
| fun getPoList(): List<PurchaseOrderInfo> { | fun getPoList(): List<PurchaseOrderInfo> { | ||||
| return purchaseOrderService.getPoList() | return purchaseOrderService.getPoList() | ||||
| } | } | ||||
| @GetMapping("/detail/{id}") | |||||
| @GetMapping("/detail/{id}") // purchaseOrderId | |||||
| fun getDetailedPo(@PathVariable id: Long): Map<String, Any> { | fun getDetailedPo(@PathVariable id: Long): Map<String, Any> { | ||||
| return purchaseOrderService.getDetailedPo(id) | return purchaseOrderService.getDetailedPo(id) | ||||
| } | } | ||||
| @PostMapping("/check/{id}") // purchaseOrderId | |||||
| fun checkPolAndCompletePo(@PathVariable id: Long): MessageResponse { | |||||
| return purchaseOrderService.checkPolAndCompletePo(id) | |||||
| } | |||||
| } | } | ||||
| @@ -4,6 +4,8 @@ import org.springframework.beans.factory.annotation.Value | |||||
| interface QcResultInfo { | interface QcResultInfo { | ||||
| val id: Long | val id: Long | ||||
| @get:Value("#{target.qcItem.id}") | |||||
| val qcItemId: Long | |||||
| @get:Value("#{target.qcItem.name}") | @get:Value("#{target.qcItem.name}") | ||||
| val name: String | val name: String | ||||
| @get:Value("#{target.qcItem.code}") | @get:Value("#{target.qcItem.code}") | ||||
| @@ -11,4 +11,5 @@ interface StockInLineRepository : AbstractRepository<StockInLine, Long> { | |||||
| fun findAllStockInLineInfoByStockInIdAndDeletedFalse(stockInId: Long): List<StockInLineInfo> | fun findAllStockInLineInfoByStockInIdAndDeletedFalse(stockInId: Long): List<StockInLineInfo> | ||||
| fun findStockInLineInfoByIdAndDeletedFalse(id: Long): StockInLineInfo | fun findStockInLineInfoByIdAndDeletedFalse(id: Long): StockInLineInfo | ||||
| fun findStockInLineInfoByIdInAndDeletedFalse(id: List<Long>): List<StockInLineInfo> | fun findStockInLineInfoByIdInAndDeletedFalse(id: List<Long>): List<StockInLineInfo> | ||||
| fun findStockInLineInfoByPurchaseOrderLineIdAndStatusNotAndDeletedFalse(purchaseOrderLineId: Long, status: String): List<StockInLineInfo> | |||||
| } | } | ||||
| @@ -2,7 +2,6 @@ package com.ffii.fpsms.modules.stock.service | |||||
| import com.ffii.core.support.AbstractBaseEntityService | import com.ffii.core.support.AbstractBaseEntityService | ||||
| import com.ffii.core.support.JdbcDao | import com.ffii.core.support.JdbcDao | ||||
| import com.ffii.core.utils.JsonUtils | |||||
| import com.ffii.core.utils.QrCodeUtil | import com.ffii.core.utils.QrCodeUtil | ||||
| import com.ffii.fpsms.modules.common.CodeGenerator | import com.ffii.fpsms.modules.common.CodeGenerator | ||||
| import com.ffii.fpsms.modules.master.entity.ItemsRepository | import com.ffii.fpsms.modules.master.entity.ItemsRepository | ||||
| @@ -27,6 +26,10 @@ import java.time.LocalDate | |||||
| import java.time.LocalDateTime | import java.time.LocalDateTime | ||||
| import com.ffii.core.utils.PdfUtils; | import com.ffii.core.utils.PdfUtils; | ||||
| import com.ffii.fpsms.modules.master.entity.WarehouseRepository | import com.ffii.fpsms.modules.master.entity.WarehouseRepository | ||||
| import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository | |||||
| import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderLineStatus | |||||
| import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderStatus | |||||
| import com.ffii.fpsms.modules.stock.entity.projection.StockInLineInfo | |||||
| import java.io.FileNotFoundException | import java.io.FileNotFoundException | ||||
| import java.time.format.DateTimeFormatter | import java.time.format.DateTimeFormatter | ||||
| import kotlinx.serialization.Serializable | import kotlinx.serialization.Serializable | ||||
| @@ -39,6 +42,7 @@ data class QrContent(val itemId: Long, val stockInLineId: Long) | |||||
| @Service | @Service | ||||
| open class StockInLineService( | open class StockInLineService( | ||||
| private val jdbcDao: JdbcDao, | private val jdbcDao: JdbcDao, | ||||
| private val purchaseOrderRepository: PurchaseOrderRepository, | |||||
| private val polRepository: PurchaseOrderLineRepository, | private val polRepository: PurchaseOrderLineRepository, | ||||
| private val qcItemsRepository: QcItemRepository, | private val qcItemsRepository: QcItemRepository, | ||||
| private val qcResultRepository: QcResultRepository, | private val qcResultRepository: QcResultRepository, | ||||
| @@ -51,6 +55,9 @@ open class StockInLineService( | |||||
| private val warehouseRepository: WarehouseRepository, | private val warehouseRepository: WarehouseRepository, | ||||
| ): AbstractBaseEntityService<StockInLine, Long, StockInLineRepository>(jdbcDao, stockInLineRepository) { | ): AbstractBaseEntityService<StockInLine, Long, StockInLineRepository>(jdbcDao, stockInLineRepository) { | ||||
| open fun getStockInLineInfo(stockInLineId: Long): StockInLineInfo { | |||||
| return stockInLineRepository.findStockInLineInfoByIdAndDeletedFalse(stockInLineId) | |||||
| } | |||||
| @Throws(IOException::class) | @Throws(IOException::class) | ||||
| @Transactional | @Transactional | ||||
| open fun create(request: SaveStockInLineRequest): MessageResponse { | open fun create(request: SaveStockInLineRequest): MessageResponse { | ||||
| @@ -136,6 +143,44 @@ open class StockInLineService( | |||||
| } | } | ||||
| return null | return null | ||||
| } | } | ||||
| @Throws(IOException::class) | |||||
| @Transactional | |||||
| fun updatePurchaseOrderStatus(request: SaveStockInLineRequest) { | |||||
| if (request.status == StockInLineStatus.COMPLETE.status) { | |||||
| val unfinishedLines = polRepository.findAllByPurchaseOrderIdAndStatusNotAndDeletedIsFalse( | |||||
| purchaseOrderId = request.purchaseOrderId, | |||||
| status = PurchaseOrderLineStatus.COMPLETED | |||||
| ) | |||||
| if (unfinishedLines.isEmpty()) { | |||||
| val po = purchaseOrderRepository.findById(request.purchaseOrderId).orElseThrow() | |||||
| po.apply { | |||||
| status = PurchaseOrderStatus.COMPLETED | |||||
| } | |||||
| purchaseOrderRepository.saveAndFlush(po) | |||||
| } else { | |||||
| } | |||||
| } | |||||
| } | |||||
| @Throws(IOException::class) | |||||
| @Transactional | |||||
| fun updatePurchaseOrderLineStatus(request: SaveStockInLineRequest) { | |||||
| if (request.status == StockInLineStatus.COMPLETE.status) { | |||||
| val unfinishedLines = stockInLineRepository.findStockInLineInfoByPurchaseOrderLineIdAndStatusNotAndDeletedFalse(purchaseOrderLineId = request.purchaseOrderLineId, status = request.status!!) | |||||
| if (unfinishedLines.isEmpty()) { | |||||
| // all stock in lines finished | |||||
| // change status of purchase order line | |||||
| val purchaseOrderLine = polRepository.findById(request.purchaseOrderLineId).orElseThrow() | |||||
| purchaseOrderLine.apply { | |||||
| status = PurchaseOrderLineStatus.COMPLETED | |||||
| } | |||||
| polRepository.saveAndFlush(purchaseOrderLine) | |||||
| } else { | |||||
| // still have unfinished lines | |||||
| } | |||||
| } | |||||
| } | |||||
| @Throws(IOException::class) | @Throws(IOException::class) | ||||
| @Transactional | @Transactional | ||||
| open fun update(request: SaveStockInLineRequest): MessageResponse { | open fun update(request: SaveStockInLineRequest): MessageResponse { | ||||
| @@ -164,6 +209,7 @@ open class StockInLineService( | |||||
| if (request.status == StockInLineStatus.COMPLETE.status) { | if (request.status == StockInLineStatus.COMPLETE.status) { | ||||
| savedInventoryLotLine = saveInventoryLotLineWhenStockIn(request = request, stockInLine = stockInLine) | savedInventoryLotLine = saveInventoryLotLineWhenStockIn(request = request, stockInLine = stockInLine) | ||||
| } | } | ||||
| // println("checkpoint1") | |||||
| stockInLine.apply { | stockInLine.apply { | ||||
| // user = null | // user = null | ||||
| this.productionDate = request.productionDate?.atStartOfDay() // maybe need to change the request to LocalDateTime | this.productionDate = request.productionDate?.atStartOfDay() // maybe need to change the request to LocalDateTime | ||||
| @@ -175,7 +221,12 @@ open class StockInLineService( | |||||
| this.lotNo = stockInLine.lotNo ?: savedInventoryLot?.lotNo | this.lotNo = stockInLine.lotNo ?: savedInventoryLot?.lotNo | ||||
| } | } | ||||
| val savedStockInLine = saveAndFlush(stockInLine) | val savedStockInLine = saveAndFlush(stockInLine) | ||||
| // check if all line completed | |||||
| updatePurchaseOrderLineStatus(request) | |||||
| updatePurchaseOrderStatus(request) | |||||
| // val allLineByStockInId = find | |||||
| val lineInfo = stockInLineRepository.findStockInLineInfoByIdAndDeletedFalse(savedStockInLine.id!!) | val lineInfo = stockInLineRepository.findStockInLineInfoByIdAndDeletedFalse(savedStockInLine.id!!) | ||||
| // println("checkpoint2") | |||||
| return MessageResponse( | return MessageResponse( | ||||
| id = savedStockInLine.id, | id = savedStockInLine.id, | ||||
| code = null, | code = null, | ||||
| @@ -196,6 +247,11 @@ open class StockInLineService( | |||||
| errorPosition = "request.acceptedQty", | errorPosition = "request.acceptedQty", | ||||
| ) | ) | ||||
| } | } | ||||
| // var newLineAcceptedQty = 0.0 | |||||
| // if (request.rejectQty != null && request.rejectQty!! > BigDecimal.ZERO) { | |||||
| // | |||||
| // } | |||||
| val newStockInLine = StockInLine() | val newStockInLine = StockInLine() | ||||
| newStockInLine.apply { | newStockInLine.apply { | ||||
| this.item = stockInLine.item | this.item = stockInLine.item | ||||
| @@ -237,6 +293,9 @@ open class StockInLineService( | |||||
| val savedEntries = stockInLineRepository.saveAllAndFlush(stockInLineEntries) | val savedEntries = stockInLineRepository.saveAllAndFlush(stockInLineEntries) | ||||
| val ids = savedEntries.map { it.id!! } | val ids = savedEntries.map { it.id!! } | ||||
| val lineInfoList = stockInLineRepository.findStockInLineInfoByIdInAndDeletedFalse(ids) | val lineInfoList = stockInLineRepository.findStockInLineInfoByIdInAndDeletedFalse(ids) | ||||
| // check if all line completed | |||||
| updatePurchaseOrderLineStatus(request) | |||||
| updatePurchaseOrderStatus(request) | |||||
| return MessageResponse( | return MessageResponse( | ||||
| id = stockInLine.id, | id = stockInLine.id, | ||||
| @@ -291,5 +350,4 @@ open class StockInLineService( | |||||
| "fileName" to qrCodeInfo[0].poCode | "fileName" to qrCodeInfo[0].poCode | ||||
| ); | ); | ||||
| } | } | ||||
| } | } | ||||
| @@ -1,6 +1,9 @@ | |||||
| package com.ffii.fpsms.modules.stock.web | package com.ffii.fpsms.modules.stock.web | ||||
| import com.ffii.fpsms.modules.master.web.models.MessageResponse | import com.ffii.fpsms.modules.master.web.models.MessageResponse | ||||
| import com.ffii.fpsms.modules.qc.entity.projection.QcResultInfo | |||||
| import com.ffii.fpsms.modules.stock.entity.StockInLine | |||||
| import com.ffii.fpsms.modules.stock.entity.projection.StockInLineInfo | |||||
| import com.ffii.fpsms.modules.stock.service.StockInLineService | import com.ffii.fpsms.modules.stock.service.StockInLineService | ||||
| import com.ffii.fpsms.modules.stock.web.model.ExportQrCodeRequest | import com.ffii.fpsms.modules.stock.web.model.ExportQrCodeRequest | ||||
| import com.ffii.fpsms.modules.stock.web.model.SaveStockInLineRequest | import com.ffii.fpsms.modules.stock.web.model.SaveStockInLineRequest | ||||
| @@ -9,10 +12,7 @@ import jakarta.validation.Valid | |||||
| import net.sf.jasperreports.engine.JasperExportManager | import net.sf.jasperreports.engine.JasperExportManager | ||||
| import net.sf.jasperreports.engine.JasperPrint | import net.sf.jasperreports.engine.JasperPrint | ||||
| import org.springframework.context.NoSuchMessageException | import org.springframework.context.NoSuchMessageException | ||||
| import org.springframework.web.bind.annotation.PostMapping | |||||
| import org.springframework.web.bind.annotation.RequestBody | |||||
| import org.springframework.web.bind.annotation.RequestMapping | |||||
| import org.springframework.web.bind.annotation.RestController | |||||
| import org.springframework.web.bind.annotation.* | |||||
| import java.io.OutputStream | import java.io.OutputStream | ||||
| import java.io.UnsupportedEncodingException | import java.io.UnsupportedEncodingException | ||||
| import java.text.ParseException | import java.text.ParseException | ||||
| @@ -23,6 +23,10 @@ import java.text.ParseException | |||||
| class StockInLineController( | class StockInLineController( | ||||
| private val stockInLineService: StockInLineService | private val stockInLineService: StockInLineService | ||||
| ) { | ) { | ||||
| @GetMapping("/{stockInLineId}") | |||||
| fun get(@PathVariable stockInLineId: Long): StockInLineInfo { | |||||
| return stockInLineService.getStockInLineInfo(stockInLineId) | |||||
| } | |||||
| @PostMapping("/create") | @PostMapping("/create") | ||||
| fun create(@Valid @RequestBody newItem: SaveStockInLineRequest): MessageResponse { | fun create(@Valid @RequestBody newItem: SaveStockInLineRequest): MessageResponse { | ||||
| return stockInLineService.create(newItem) | return stockInLineService.create(newItem) | ||||
| @@ -47,5 +47,6 @@ data class SaveStockInLineRequest( | |||||
| var receiptDate: LocalDate?, | var receiptDate: LocalDate?, | ||||
| var productionDate: LocalDate?, | var productionDate: LocalDate?, | ||||
| var qcResult: List<SaveQcResultRequest>?, | var qcResult: List<SaveQcResultRequest>?, | ||||
| var warehouseId: Long? | |||||
| var warehouseId: Long?, | |||||
| var rejectQty: BigDecimal? | |||||
| ) | ) | ||||