| @@ -0,0 +1,40 @@ | |||
| package com.ffii.fpsms.modules.qc.entity | |||
| import com.ffii.core.entity.BaseEntity | |||
| import com.ffii.fpsms.modules.master.entity.Items | |||
| import com.ffii.fpsms.modules.master.entity.QcItem | |||
| import com.ffii.fpsms.modules.stock.entity.StockInLine | |||
| import com.ffii.fpsms.modules.stock.entity.StockOutLine | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| @Entity | |||
| @Table(name = "qc_result") | |||
| class QcResult: BaseEntity<Long>() { | |||
| @NotNull | |||
| @ManyToOne | |||
| @JoinColumn(name = "qcItemId") | |||
| open var qcItem: QcItem? = null | |||
| @NotNull | |||
| @ManyToOne | |||
| @JoinColumn(name = "itemId") | |||
| open var item: Items? = null | |||
| @ManyToOne | |||
| @JoinColumn(name = "stockInLineId") | |||
| open var stockInLine: StockInLine? = null | |||
| @ManyToOne | |||
| @JoinColumn(name = "stockOutLineId") | |||
| open var stockOutLine: StockOutLine? = null | |||
| @Column(name = "failQty") | |||
| open var failQty: Double? = null | |||
| @Column(name = "type") | |||
| open var type: String? = null | |||
| @Column(name = "remarks") | |||
| open var remarks: String? = null | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.ffii.fpsms.modules.qc.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface QcResultRepository: AbstractRepository<QcResult, Long> { | |||
| } | |||
| @@ -0,0 +1,57 @@ | |||
| package com.ffii.fpsms.modules.qc.service | |||
| import com.ffii.core.support.AbstractBaseEntityService | |||
| import com.ffii.core.support.JdbcDao | |||
| import com.ffii.fpsms.modules.master.entity.ItemsRepository | |||
| import com.ffii.fpsms.modules.master.entity.QcItemRepository | |||
| import com.ffii.fpsms.modules.master.web.models.MessageResponse | |||
| import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLineRepository | |||
| import com.ffii.fpsms.modules.qc.entity.QcResult | |||
| import com.ffii.fpsms.modules.qc.entity.QcResultRepository | |||
| import com.ffii.fpsms.modules.qc.web.model.SaveQcResultRequest | |||
| import com.ffii.fpsms.modules.stock.entity.StockInLine | |||
| import com.ffii.fpsms.modules.stock.entity.StockInLineRepository | |||
| import com.ffii.fpsms.modules.stock.entity.StockOutLIneRepository | |||
| import org.springframework.stereotype.Service | |||
| import org.springframework.transaction.annotation.Transactional | |||
| import java.io.IOException | |||
| @Service | |||
| open class QcResultService( | |||
| private val jdbcDao: JdbcDao, | |||
| private val qcResultRepository: QcResultRepository, | |||
| private val qcItemRepository: QcItemRepository, | |||
| private val itemRepository: ItemsRepository, | |||
| private val stockInLineRepository: StockInLineRepository, | |||
| private val stockOutLIneRepository: StockOutLIneRepository, | |||
| ): AbstractBaseEntityService<QcResult, Long, QcResultRepository>(jdbcDao, qcResultRepository) { | |||
| @Throws(IOException::class) | |||
| @Transactional | |||
| open fun createOrUpdate(request: SaveQcResultRequest): MessageResponse { | |||
| val qcResult = if (request.id != null) qcResultRepository.findById(request.id).orElseThrow() else QcResult() | |||
| val qcItem = qcItemRepository.findById(request.qcItemId).orElseThrow() | |||
| val item = itemRepository.findById(request.itemId).orElseThrow() | |||
| val stockInLine = if (request.stockInLineId != null) stockInLineRepository.findById(request.stockInLineId).orElseThrow() else null | |||
| val stockOutLine = if (request.stockOutLineId != null) stockOutLIneRepository.findById(request.stockOutLineId).orElseThrow() else null | |||
| qcResult.apply { | |||
| this.qcItem = qcItem | |||
| this.item = item | |||
| this.stockInLine = stockInLine | |||
| this.stockOutLine = stockOutLine | |||
| this.failQty = request.failQty | |||
| this.type = request.type | |||
| this.remarks = request.remarks | |||
| } | |||
| val savedQcResult = saveAndFlush(qcResult) | |||
| return MessageResponse( | |||
| id = savedQcResult.id, | |||
| name = savedQcResult.qcItem!!.name, | |||
| code = savedQcResult.qcItem!!.code, | |||
| type = savedQcResult.type, | |||
| message = null, | |||
| errorPosition = null | |||
| ) | |||
| } | |||
| } | |||
| @@ -0,0 +1,23 @@ | |||
| package com.ffii.fpsms.modules.qc.web | |||
| import com.ffii.fpsms.modules.master.web.models.MessageResponse | |||
| import com.ffii.fpsms.modules.master.web.models.NewItemRequest | |||
| import com.ffii.fpsms.modules.qc.service.QcResultService | |||
| import com.ffii.fpsms.modules.qc.web.model.SaveQcResultRequest | |||
| import jakarta.validation.Valid | |||
| 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 | |||
| @RestController | |||
| @RequestMapping("/qcResult") | |||
| class QcResultController( | |||
| private val qcResultService: QcResultService | |||
| ) { | |||
| @PostMapping("/new") | |||
| fun saveItem(@Valid @RequestBody request: SaveQcResultRequest): MessageResponse { | |||
| return qcResultService.createOrUpdate(request) | |||
| } | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| package com.ffii.fpsms.modules.qc.web.model | |||
| data class SaveQcResultRequest( | |||
| val id: Long?, | |||
| val qcItemId: Long, | |||
| val itemId: Long, | |||
| val stockInLineId: Long?, | |||
| val stockOutLineId: Long?, | |||
| val failQty: Double, | |||
| val type: String?, | |||
| val remarks: String?, | |||
| ) | |||
| @@ -4,8 +4,11 @@ import com.ffii.core.support.AbstractBaseEntityService | |||
| import com.ffii.core.support.JdbcDao | |||
| import com.ffii.fpsms.modules.common.CodeGenerator | |||
| import com.ffii.fpsms.modules.master.entity.ItemsRepository | |||
| import com.ffii.fpsms.modules.master.entity.QcItemRepository | |||
| import com.ffii.fpsms.modules.master.web.models.MessageResponse | |||
| import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLineRepository | |||
| import com.ffii.fpsms.modules.qc.entity.QcResult | |||
| import com.ffii.fpsms.modules.qc.entity.QcResultRepository | |||
| import com.ffii.fpsms.modules.stock.entity.* | |||
| import com.ffii.fpsms.modules.stock.web.model.SaveStockInLineRequest | |||
| import com.ffii.fpsms.modules.stock.web.model.SaveStockInRequest | |||
| @@ -23,6 +26,8 @@ import java.time.LocalDateTime | |||
| open class StockInLineService( | |||
| private val jdbcDao: JdbcDao, | |||
| private val polRepository: PurchaseOrderLineRepository, | |||
| private val qcItemsRepository: QcItemRepository, | |||
| private val qcResultRepository: QcResultRepository, | |||
| private val stockInService: StockInService, | |||
| private val stockInRepository: StockInRepository, | |||
| private val stockInLineRepository: StockInLineRepository, | |||
| @@ -60,6 +65,7 @@ open class StockInLineService( | |||
| ) | |||
| } | |||
| @Throws(IOException::class) | |||
| @Transactional | |||
| fun saveInventoryLotWhenStockIn(request: SaveStockInLineRequest, stockInLine: StockInLine): InventoryLot { | |||
| val inventoryLot = InventoryLot() | |||
| @@ -79,18 +85,39 @@ open class StockInLineService( | |||
| } | |||
| return inventoryLotRepository.saveAndFlush(inventoryLot) | |||
| } | |||
| @Throws(IOException::class) | |||
| @Transactional | |||
| fun saveQcResultWhenStockIn(request: SaveStockInLineRequest, stockInLine: StockInLine): List<QcResult>? { | |||
| if (!request.qcResult.isNullOrEmpty()) { | |||
| val qcResultEntries = request.qcResult!!.map { | |||
| val qcItem = qcItemsRepository.findById(it.qcItemId).orElseThrow() | |||
| val item = itemRepository.findById(stockInLine.item!!.id!!).orElseThrow() | |||
| QcResult().apply { | |||
| this.qcItem = qcItem | |||
| this.item = item | |||
| this.stockInLine = stockInLine | |||
| this.failQty = it.failQty | |||
| this.type = "qc" // default as qc for now | |||
| this.remarks = it.remarks | |||
| } | |||
| } | |||
| return qcResultRepository.saveAllAndFlush(qcResultEntries) | |||
| } | |||
| return null | |||
| } | |||
| @Throws(IOException::class) | |||
| @Transactional | |||
| open fun update(request: SaveStockInLineRequest): MessageResponse { | |||
| val stockInLine = if (request.id != null) stockInLineRepository.findById(request.id).orElseThrow() | |||
| else return MessageResponse( | |||
| id = null, | |||
| code = null, | |||
| name = null, | |||
| type = "Found Null", | |||
| message = "stock in line id is null", | |||
| errorPosition = null, | |||
| ) | |||
| val stockInLine = if (request.id != null) stockInLineRepository.findById(request.id!!).orElseThrow() | |||
| else return MessageResponse( | |||
| id = null, | |||
| code = null, | |||
| name = null, | |||
| type = "Found Null", | |||
| message = "stock in line id is null", | |||
| errorPosition = null, | |||
| ) | |||
| if (stockInLine.expiryDate != null && request.expiryDate == null) { | |||
| request.apply { | |||
| expiryDate = stockInLine.expiryDate | |||
| @@ -99,9 +126,9 @@ open class StockInLineService( | |||
| // return list of stock in line, update data grid with the list | |||
| if (request.acceptedQty.compareTo(stockInLine.acceptedQty) == 0) { | |||
| var savedInventoryLot: InventoryLot? = null | |||
| saveQcResultWhenStockIn(request, stockInLine) | |||
| if (request.status == StockInLineStatus.RECEIVED.status) { | |||
| if (request.expiryDate == null) { | |||
| println("trigger1?") | |||
| return MessageResponse( | |||
| id = null, | |||
| code = null, | |||
| @@ -113,8 +140,6 @@ open class StockInLineService( | |||
| } | |||
| savedInventoryLot = saveInventoryLotWhenStockIn(request = request, stockInLine = stockInLine) | |||
| } | |||
| // if (request.status == StockInLineStatus.RECEIVED.status) { | |||
| // } | |||
| stockInLine.apply { | |||
| // user = null | |||
| productionDate = request.productionDate?.atStartOfDay() // maybe need to change the request to LocalDateTime | |||
| @@ -161,6 +186,7 @@ open class StockInLineService( | |||
| status = stockInLine.status // this does update status | |||
| user = stockInLine.user | |||
| } | |||
| saveQcResultWhenStockIn(request, stockInLine) | |||
| var savedInventoryLot: InventoryLot? = null | |||
| if (request.status == StockInLineStatus.RECEIVED.status) { | |||
| if (request.expiryDate == null) { | |||
| @@ -1,5 +1,6 @@ | |||
| package com.ffii.fpsms.modules.stock.web.model | |||
| import com.ffii.fpsms.modules.qc.web.model.SaveQcResultRequest | |||
| import java.math.BigDecimal | |||
| import java.time.LocalDate | |||
| import java.time.LocalDateTime | |||
| @@ -45,4 +46,5 @@ data class SaveStockInLineRequest( | |||
| var productLotNo: String?, | |||
| var receiptDate: LocalDate?, | |||
| var productionDate: LocalDate?, | |||
| var qcResult: List<SaveQcResultRequest>? | |||
| ) | |||