| @@ -150,12 +150,12 @@ open class M18MasterDataService( | |||||
| // type = if (pro.seriesId == m18Config.SERIESID_PF) ProductType.MATERIAL | // type = if (pro.seriesId == m18Config.SERIESID_PF) ProductType.MATERIAL | ||||
| // else ItemType.PRODUCT, | // else ItemType.PRODUCT, | ||||
| type = when (pro.udfProducttype) { | type = when (pro.udfProducttype) { | ||||
| M18ItemType.CONSUMABLES.type -> ItemType.CONSUMABLES | |||||
| M18ItemType.NONCONSUMABLES.type -> ItemType.NONCONSUMABLES | |||||
| M18ItemType.FG.type -> ItemType.FG | |||||
| M18ItemType.SFG.type -> ItemType.SFG | |||||
| M18ItemType.ITEM.type -> ItemType.ITEM | |||||
| else -> ItemType.MATERIAL | |||||
| M18ItemType.CONSUMABLES.type -> ItemType.CONSUMABLES.type | |||||
| M18ItemType.NONCONSUMABLES.type -> ItemType.NONCONSUMABLES.type | |||||
| M18ItemType.FG.type -> ItemType.FG.type | |||||
| M18ItemType.SFG.type -> ItemType.SFG.type | |||||
| M18ItemType.ITEM.type -> ItemType.ITEM.type | |||||
| else -> ItemType.MATERIAL.type | |||||
| }, | }, | ||||
| id = existingItem?.id, | id = existingItem?.id, | ||||
| description = pro.desc, | description = pro.desc, | ||||
| @@ -164,7 +164,8 @@ open class M18MasterDataService( | |||||
| countryOfOrigin = null, | countryOfOrigin = null, | ||||
| maxQty = null, | maxQty = null, | ||||
| m18Id = id, | m18Id = id, | ||||
| m18LastModifyDate = commonUtils.timestampToLocalDateTime(pro.lastModifyDate) | |||||
| m18LastModifyDate = commonUtils.timestampToLocalDateTime(pro.lastModifyDate), | |||||
| qcCategoryId = null | |||||
| ) | ) | ||||
| val savedItem = itemsService.saveItem(saveItemRequest) | val savedItem = itemsService.saveItem(saveItemRequest) | ||||
| @@ -244,12 +245,12 @@ open class M18MasterDataService( | |||||
| // type = if (pro.seriesId == m18Config.SERIESID_PF) ProductType.MATERIAL | // type = if (pro.seriesId == m18Config.SERIESID_PF) ProductType.MATERIAL | ||||
| // else ItemType.PRODUCT, | // else ItemType.PRODUCT, | ||||
| type = when (pro.udfProducttype) { | type = when (pro.udfProducttype) { | ||||
| M18ItemType.CONSUMABLES.type -> ItemType.CONSUMABLES | |||||
| M18ItemType.NONCONSUMABLES.type -> ItemType.NONCONSUMABLES | |||||
| M18ItemType.FG.type -> ItemType.FG | |||||
| M18ItemType.SFG.type -> ItemType.SFG | |||||
| M18ItemType.ITEM.type -> ItemType.ITEM | |||||
| else -> ItemType.MATERIAL | |||||
| M18ItemType.CONSUMABLES.type -> ItemType.CONSUMABLES.type | |||||
| M18ItemType.NONCONSUMABLES.type -> ItemType.NONCONSUMABLES.type | |||||
| M18ItemType.FG.type -> ItemType.FG.type | |||||
| M18ItemType.SFG.type -> ItemType.SFG.type | |||||
| M18ItemType.ITEM.type -> ItemType.ITEM.type | |||||
| else -> ItemType.MATERIAL.type | |||||
| }, | }, | ||||
| id = existingItem?.id, | id = existingItem?.id, | ||||
| description = pro.desc, | description = pro.desc, | ||||
| @@ -258,7 +259,8 @@ open class M18MasterDataService( | |||||
| countryOfOrigin = null, | countryOfOrigin = null, | ||||
| maxQty = null, | maxQty = null, | ||||
| m18Id = item.id, | m18Id = item.id, | ||||
| m18LastModifyDate = commonUtils.timestampToLocalDateTime(pro.lastModifyDate) | |||||
| m18LastModifyDate = commonUtils.timestampToLocalDateTime(pro.lastModifyDate), | |||||
| qcCategoryId = null | |||||
| ) | ) | ||||
| val savedItem = itemsService.saveItem(saveItemRequest) | val savedItem = itemsService.saveItem(saveItemRequest) | ||||
| @@ -1,9 +1,12 @@ | |||||
| package com.ffii.fpsms.modules.master.entity | package com.ffii.fpsms.modules.master.entity | ||||
| import com.ffii.core.support.AbstractRepository | import com.ffii.core.support.AbstractRepository | ||||
| import com.ffii.fpsms.modules.master.entity.projections.QcCategoryCombo | |||||
| import org.springframework.stereotype.Repository | import org.springframework.stereotype.Repository | ||||
| @Repository | @Repository | ||||
| interface QcCategoryRepository : AbstractRepository<QcCategory, Long> { | interface QcCategoryRepository : AbstractRepository<QcCategory, Long> { | ||||
| fun findAllByDeletedIsFalse(): List<QcCategory> | |||||
| fun findAllByDeletedIsFalse(): List<QcCategory>; | |||||
| fun findQcCategoryComboByDeletedIsFalse(): List<QcCategoryCombo>; | |||||
| } | } | ||||
| @@ -0,0 +1,11 @@ | |||||
| package com.ffii.fpsms.modules.master.entity.projections | |||||
| import org.springframework.beans.factory.annotation.Value | |||||
| interface QcCategoryCombo { | |||||
| val id: Long; | |||||
| @get:Value("#{target.id}") | |||||
| val value: Long; | |||||
| @get:Value("#{target.code}") | |||||
| val label: String; | |||||
| } | |||||
| @@ -13,13 +13,14 @@ import java.io.IOException | |||||
| import java.time.LocalDateTime | import java.time.LocalDateTime | ||||
| import java.time.format.DateTimeFormatter | import java.time.format.DateTimeFormatter | ||||
| import java.time.temporal.TemporalAdjusters | import java.time.temporal.TemporalAdjusters | ||||
| import kotlin.jvm.optionals.getOrNull | |||||
| @Service | @Service | ||||
| open class ItemsService( | open class ItemsService( | ||||
| private val jdbcDao: JdbcDao, | private val jdbcDao: JdbcDao, | ||||
| private val itemsRepository: ItemsRepository, | private val itemsRepository: ItemsRepository, | ||||
| private val qcCheckRepository: QcCheckRepository, | private val qcCheckRepository: QcCheckRepository, | ||||
| private val qcItemsRepository: QcItemRepository, | |||||
| private val qcItemsRepository: QcItemRepository, private val qcCategoryRepository: QcCategoryRepository, | |||||
| ): AbstractBaseEntityService<Items, Long, ItemsRepository>(jdbcDao, itemsRepository) { | ): AbstractBaseEntityService<Items, Long, ItemsRepository>(jdbcDao, itemsRepository) { | ||||
| // do mapping with projection | // do mapping with projection | ||||
| open fun allItems(): List<Items> { | open fun allItems(): List<Items> { | ||||
| @@ -170,7 +171,7 @@ open class ItemsService( | |||||
| @Throws(IOException::class) | @Throws(IOException::class) | ||||
| @Transactional | @Transactional | ||||
| open fun saveItem(request: NewItemRequest): MessageResponse { | open fun saveItem(request: NewItemRequest): MessageResponse { | ||||
| val duplicatedItem = itemsRepository.findByCodeAndTypeAndDeletedFalse(request.code, request.type.type) | |||||
| val duplicatedItem = itemsRepository.findByCodeAndTypeAndDeletedFalse(request.code, request.type) | |||||
| if (duplicatedItem != null && duplicatedItem.id != request.id) { | if (duplicatedItem != null && duplicatedItem.id != request.id) { | ||||
| return MessageResponse( | return MessageResponse( | ||||
| id = request.id, | id = request.id, | ||||
| @@ -196,6 +197,8 @@ open class ItemsService( | |||||
| ) | ) | ||||
| } | } | ||||
| val qcCategory = request.qcCategoryId?.let { qcCategoryRepository.findById(it).getOrNull() } | |||||
| item.apply { | item.apply { | ||||
| code = request.code | code = request.code | ||||
| name = request.name | name = request.name | ||||
| @@ -204,7 +207,8 @@ open class ItemsService( | |||||
| shelfLife = request.shelfLife | shelfLife = request.shelfLife | ||||
| countryOfOrigin = request.countryOfOrigin | countryOfOrigin = request.countryOfOrigin | ||||
| maxQty = request.maxQty | maxQty = request.maxQty | ||||
| this.type = request.type.type | |||||
| this.type = request.type | |||||
| this.qcCategory = qcCategory | |||||
| m18Id = request.m18Id ?: this.m18Id | m18Id = request.m18Id ?: this.m18Id | ||||
| m18LastModifyDate = request.m18LastModifyDate ?: this.m18LastModifyDate | m18LastModifyDate = request.m18LastModifyDate ?: this.m18LastModifyDate | ||||
| } | } | ||||
| @@ -3,6 +3,7 @@ package com.ffii.fpsms.modules.master.service | |||||
| import com.ffii.core.support.AbstractBaseEntityService | import com.ffii.core.support.AbstractBaseEntityService | ||||
| import com.ffii.fpsms.modules.master.entity.QcCategory | import com.ffii.fpsms.modules.master.entity.QcCategory | ||||
| import com.ffii.fpsms.modules.master.entity.QcCategoryRepository | import com.ffii.fpsms.modules.master.entity.QcCategoryRepository | ||||
| import com.ffii.fpsms.modules.master.entity.projections.QcCategoryCombo | |||||
| import org.springframework.stereotype.Service | import org.springframework.stereotype.Service | ||||
| @Service | @Service | ||||
| @@ -12,4 +13,8 @@ open class QcCategoryService( | |||||
| open fun allQcCategories(): List<QcCategory> { | open fun allQcCategories(): List<QcCategory> { | ||||
| return qcCategoryRepository.findAllByDeletedIsFalse() | return qcCategoryRepository.findAllByDeletedIsFalse() | ||||
| } | } | ||||
| open fun getQcCategoryCombo(): List<QcCategoryCombo> { | |||||
| return qcCategoryRepository.findQcCategoryComboByDeletedIsFalse(); | |||||
| } | |||||
| } | } | ||||
| @@ -1,6 +1,7 @@ | |||||
| package com.ffii.fpsms.modules.master.web | package com.ffii.fpsms.modules.master.web | ||||
| import com.ffii.fpsms.modules.master.entity.QcCategory | import com.ffii.fpsms.modules.master.entity.QcCategory | ||||
| import com.ffii.fpsms.modules.master.entity.projections.QcCategoryCombo | |||||
| import com.ffii.fpsms.modules.master.service.QcCategoryService | import com.ffii.fpsms.modules.master.service.QcCategoryService | ||||
| import org.springframework.web.bind.annotation.GetMapping | import org.springframework.web.bind.annotation.GetMapping | ||||
| import org.springframework.web.bind.annotation.RequestMapping | import org.springframework.web.bind.annotation.RequestMapping | ||||
| @@ -15,4 +16,9 @@ class QcCategoryController( | |||||
| fun allQcCategories(): List<QcCategory> { | fun allQcCategories(): List<QcCategory> { | ||||
| return qcCategoryService.allQcCategories() | return qcCategoryService.allQcCategories() | ||||
| } | } | ||||
| @GetMapping("/combo") | |||||
| fun getQcCategoryCombo(): List<QcCategoryCombo> { | |||||
| return qcCategoryService.getQcCategoryCombo(); | |||||
| } | |||||
| } | } | ||||
| @@ -34,7 +34,7 @@ data class NewItemRequest( | |||||
| @field:NotBlank(message = "material name cannot be empty") | @field:NotBlank(message = "material name cannot be empty") | ||||
| val name: String, | val name: String, | ||||
| @field:NotNull(message = "typeId cannot be null") | @field:NotNull(message = "typeId cannot be null") | ||||
| val type: ItemType, | |||||
| val type: String, | |||||
| val id: Long?, | val id: Long?, | ||||
| val description: String?, | val description: String?, | ||||
| @@ -44,6 +44,7 @@ data class NewItemRequest( | |||||
| val maxQty: Double?, | val maxQty: Double?, | ||||
| val m18Id: Long?, | val m18Id: Long?, | ||||
| val m18LastModifyDate: LocalDateTime?, | val m18LastModifyDate: LocalDateTime?, | ||||
| val qcCategoryId: Long?, | |||||
| // val type: List<NewTypeRequest>?, | // val type: List<NewTypeRequest>?, | ||||
| // val uom: List<NewUomRequest>?, | // val uom: List<NewUomRequest>?, | ||||
| // val weightUnit: List<NewWeightUnitRequest>?, | // val weightUnit: List<NewWeightUnitRequest>?, | ||||
| @@ -14,13 +14,13 @@ interface InventoryInfo{ | |||||
| @get:Value("#{target.item.type}") | @get:Value("#{target.item.type}") | ||||
| val itemType: String? | val itemType: String? | ||||
| // @get:Value("#{target.qty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") | // @get:Value("#{target.qty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") | ||||
| @get:Value("#{target.onHandQty / (target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioD)}") | |||||
| @get:Value("#{target.onHandQty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") | |||||
| val onHandQty: BigDecimal? | val onHandQty: BigDecimal? | ||||
| @get:Value("#{target.onHoldQty / (target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioD)}") | |||||
| @get:Value("#{target.onHoldQty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") | |||||
| val onHoldQty: BigDecimal? | val onHoldQty: BigDecimal? | ||||
| @get:Value("#{target.unavailableQty / (target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioD)}") | |||||
| @get:Value("#{target.unavailableQty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") | |||||
| val unavailableQty: BigDecimal? | val unavailableQty: BigDecimal? | ||||
| @get:Value("#{(target.onHandQty - target.onHoldQty - target.unavailableQty) / (target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[salesUnit == true && deleted == false]?.ratioD)}") | |||||
| @get:Value("#{(target.onHandQty - target.onHoldQty - target.unavailableQty) / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") | |||||
| val availableQty: BigDecimal? | val availableQty: BigDecimal? | ||||
| @get:Value("#{target.item.itemUoms.^[purchaseUnit == true && deleted == false]?.uom.code}") | @get:Value("#{target.item.itemUoms.^[purchaseUnit == true && deleted == false]?.uom.code}") | ||||
| val uomCode: String? | val uomCode: String? | ||||