| @@ -0,0 +1,52 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.entity.BaseEntity | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| import jakarta.validation.constraints.Size | |||
| import java.math.BigDecimal | |||
| import java.time.Instant | |||
| import java.time.LocalDateTime | |||
| @Table(name = "bom") | |||
| @Entity | |||
| open class Bom : BaseEntity<Long>() { | |||
| @ManyToOne | |||
| @JoinColumn(name = "itemId") | |||
| open var item: Items? = null | |||
| @Size(max = 30) | |||
| @NotNull | |||
| @Column(name = "code", nullable = false, length = 30) | |||
| open var code: String? = null | |||
| @Size(max = 30) | |||
| @NotNull | |||
| @Column(name = "name", nullable = false, length = 30) | |||
| open var name: String? = null | |||
| @Size(max = 100) | |||
| @NotNull | |||
| @Column(name = "description", nullable = false, length = 100) | |||
| open var description: String? = null | |||
| @Column(name = "outputQty", precision = 14, scale = 2) | |||
| open var outputQty: BigDecimal? = null | |||
| @Size(max = 50) | |||
| @Column(name = "outputQtyUom", length = 50) | |||
| open var outputQtyUom: String? = null | |||
| @Column(name = "yield", precision = 14, scale = 2) | |||
| open var yield: BigDecimal? = null | |||
| @ManyToOne | |||
| @JoinColumn(name = "uomId") | |||
| open var uom: UomConversion? = null | |||
| @Column(name = "m18Id") | |||
| open var m18Id: Long? = null | |||
| @Column(name = "m18LastModifyDate") | |||
| open var m18LastModifyDate: LocalDateTime? = null | |||
| } | |||
| @@ -0,0 +1,54 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.entity.BaseEntity | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| import jakarta.validation.constraints.Size | |||
| import java.math.BigDecimal | |||
| import java.time.Instant | |||
| import java.time.LocalDateTime | |||
| @Table(name = "bom_material") | |||
| @Entity | |||
| open class BomMaterial : BaseEntity<Long>() { | |||
| @ManyToOne | |||
| @JoinColumn(name = "itemId") | |||
| open var item: Items? = null | |||
| @Size(max = 50) | |||
| @Column(name = "itemName", length = 50) | |||
| open var itemName: String? = null | |||
| @NotNull | |||
| @Column(name = "isConsumable", nullable = false) | |||
| open var isConsumable: Boolean? = false | |||
| @NotNull | |||
| @Column(name = "qty", nullable = false, precision = 14, scale = 2) | |||
| open var qty: BigDecimal? = null | |||
| @ManyToOne | |||
| @JoinColumn(name = "uomId") | |||
| open var uom: UomConversion? = null | |||
| @Size(max = 50) | |||
| @Column(name = "uomName", length = 50) | |||
| open var uomName: String? = null | |||
| @NotNull | |||
| @ManyToOne(optional = false) | |||
| @JoinColumn(name = "bomId", nullable = false) | |||
| open var bom: Bom? = null | |||
| @NotNull | |||
| @Column(name = "m18Id", nullable = false) | |||
| open var m18Id: Long? = null | |||
| @NotNull | |||
| @Column(name = "m18LastModifyDate", nullable = false) | |||
| open var m18LastModifyDate: LocalDateTime? = null | |||
| @Size(max = 1000) | |||
| @Column(name = "remarks", length = 1000) | |||
| open var remarks: String? = null | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| import java.io.Serializable | |||
| @Repository | |||
| interface BomMaterialRepository : AbstractRepository<BomMaterial, Long> { | |||
| fun findByIdAndDeletedIsFalse(id: Serializable): BomMaterial? | |||
| fun findByM18IdAndDeletedIsFalse(m18Id: Long): BomMaterial? | |||
| } | |||
| @@ -0,0 +1,28 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.entity.BaseEntity | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| @Table(name = "bom_process") | |||
| @Entity | |||
| open class BomProcess : BaseEntity<Long>() { | |||
| @NotNull | |||
| @ManyToOne(optional = false) | |||
| @JoinColumn(name = "processId", nullable = false) | |||
| open var process: Process? = null | |||
| @NotNull | |||
| @ManyToOne(optional = false) | |||
| @JoinColumn(name = "uomId", nullable = false) | |||
| open var uom: UomConversion? = null | |||
| @NotNull | |||
| @Column(name = "seqNo", nullable = false) | |||
| open var seqNo: Long? = null | |||
| @NotNull | |||
| @ManyToOne(optional = false) | |||
| @JoinColumn(name = "bomId", nullable = false) | |||
| open var bom: Bom? = null | |||
| } | |||
| @@ -0,0 +1,19 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.entity.BaseEntity | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| @Table(name = "bom_process_material") | |||
| @Entity | |||
| open class BomProcessMaterial : BaseEntity<Long>() { | |||
| @NotNull | |||
| @ManyToOne(optional = false) | |||
| @JoinColumn(name = "bomProcessId", nullable = false) | |||
| open var bomProcess: BomProcess? = null | |||
| @NotNull | |||
| @ManyToOne(optional = false) | |||
| @JoinColumn(name = "bomMaterialId", nullable = false) | |||
| open var bomMaterial: BomMaterial? = null | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface BomProcessMaterialRepository : AbstractRepository<BomProcessMaterial, Long> { | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface BomProcessRepository : AbstractRepository<BomProcess, Long> { | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| import java.io.Serializable | |||
| @Repository | |||
| interface BomRepository : AbstractRepository<Bom, Long> { | |||
| fun findByIdAndDeletedIsFalse(id: Serializable): Bom? | |||
| fun findByM18IdAndDeletedIsFalse(m18Id: Long): Bom? | |||
| } | |||
| @@ -0,0 +1,29 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.entity.BaseEntity | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| import jakarta.validation.constraints.Size | |||
| @Table(name = "equipment") | |||
| @Entity | |||
| open class Equipment : BaseEntity<Long>() { | |||
| @Size(max = 30) | |||
| @NotNull | |||
| @Column(name = "code", nullable = false, length = 30) | |||
| open var code: String? = null | |||
| @Size(max = 30) | |||
| @NotNull | |||
| @Column(name = "name", nullable = false, length = 30) | |||
| open var name: String? = null | |||
| @Size(max = 500) | |||
| @NotNull | |||
| @Column(name = "description", nullable = false, length = 500) | |||
| open var description: String? = null | |||
| @ManyToOne | |||
| @JoinColumn(name = "equipmentTypeId") | |||
| open var equipmentType: EquipmentType? = null | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface EquipmentRepository : AbstractRepository<Equipment, Long> { | |||
| } | |||
| @@ -0,0 +1,27 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.entity.BaseEntity | |||
| import jakarta.persistence.Column | |||
| import jakarta.persistence.Entity | |||
| import jakarta.persistence.Table | |||
| import jakarta.validation.constraints.NotNull | |||
| import jakarta.validation.constraints.Size | |||
| @Table(name = "equipment_type") | |||
| @Entity | |||
| open class EquipmentType : BaseEntity<Long>() { | |||
| @Size(max = 30) | |||
| @NotNull | |||
| @Column(name = "code", nullable = false, length = 30) | |||
| open var code: String? = null | |||
| @Size(max = 30) | |||
| @NotNull | |||
| @Column(name = "name", nullable = false, length = 30) | |||
| open var name: String? = null | |||
| @Size(max = 500) | |||
| @NotNull | |||
| @Column(name = "description", nullable = false, length = 500) | |||
| open var description: String? = null | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface EquipmentTypeRepository : AbstractRepository<EquipmentType, Long> { | |||
| } | |||
| @@ -1,5 +1,6 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.fasterxml.jackson.annotation.JsonBackReference | |||
| import com.ffii.core.entity.BaseEntity | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| @@ -12,11 +13,13 @@ open class ItemUom : BaseEntity<Long>() { | |||
| @NotNull | |||
| @ManyToOne | |||
| @JoinColumn(name = "uomId", nullable = false) | |||
| @JsonBackReference | |||
| open var uom: UomConversion? = null | |||
| @NotNull | |||
| @ManyToOne | |||
| @JoinColumn(name = "itemId", nullable = false) | |||
| @JsonBackReference | |||
| open var item: Items? = null | |||
| @NotNull | |||
| @@ -1,6 +1,7 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.data.jpa.repository.Query | |||
| import org.springframework.stereotype.Repository | |||
| import java.io.Serializable | |||
| @@ -15,4 +16,6 @@ interface ItemUomRespository : AbstractRepository<ItemUom, Long> { | |||
| fun deleteAllByIdIn(id: List<Serializable>) | |||
| fun findByItemIdAndPurchaseUnitIsTrueAndDeletedIsFalse(itemId: Serializable): ItemUom? | |||
| fun findByItemM18IdAndPurchaseUnitIsTrueAndDeletedIsFalse(itemM18Id: Long): ItemUom? | |||
| } | |||
| @@ -1,5 +1,6 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.fasterxml.jackson.annotation.JsonManagedReference | |||
| import com.ffii.core.entity.BaseEntity | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| @@ -41,6 +42,7 @@ open class Items : BaseEntity<Long>() { | |||
| @Column(name = "m18LastModifyDate") | |||
| open var m18LastModifyDate: LocalDateTime? = null | |||
| @JsonManagedReference | |||
| @OneToMany(mappedBy = "item", cascade = [CascadeType.ALL], orphanRemoval = true) | |||
| open var itemUoms: MutableSet<ItemUom> = mutableSetOf() | |||
| } | |||
| @@ -2,15 +2,54 @@ package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import com.ffii.fpsms.modules.master.web.models.ItemType | |||
| import org.springframework.data.jpa.repository.Query | |||
| import org.springframework.stereotype.Repository | |||
| import java.io.Serializable | |||
| @Repository | |||
| interface ItemsRepository : AbstractRepository<Items, Long> { | |||
| fun findAllByDeletedFalse(): List<Items>; | |||
| fun findByIdAndDeletedFalse(id: Long): Items; | |||
| fun findByIdAndDeletedFalse(id: Long): Items?; | |||
| fun findByCodeAndTypeAndDeletedFalse(code: String, type: String): Items?; | |||
| fun findByM18IdAndDeletedIsFalse(m18Id: Long): Items?; | |||
| @Query( | |||
| """ | |||
| select i from Items i | |||
| join i.itemUoms iu | |||
| join iu.uom u | |||
| where i.name = :name and u.m18Id = :m18UomId and i.deleted = false | |||
| order by i.id | |||
| limit 1 | |||
| """ | |||
| ) | |||
| fun findByNameExactlyAndUomM18Id(name: String, m18UomId: Long): Items?; | |||
| @Query( | |||
| """ | |||
| select i from Items i | |||
| join i.itemUoms iu | |||
| join iu.uom u | |||
| where i.name like %:name% and u.m18Id = :m18UomId and i.deleted = false | |||
| order by i.id | |||
| limit 1 | |||
| """ | |||
| ) | |||
| fun findByNameLikeAndUomM18Id(name: String, m18UomId: Long): Items?; | |||
| @Query( | |||
| nativeQuery = true, | |||
| value = | |||
| """ | |||
| select i.* from items i | |||
| where :m18BomCode like concat('%',i.code,'%') | |||
| and i.deleted = false | |||
| order by i.id | |||
| limit 1 | |||
| """ | |||
| ) | |||
| fun findByM18BomCode(m18BomCode: String): Items?; | |||
| } | |||
| @@ -0,0 +1,32 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.entity.BaseEntity | |||
| import jakarta.persistence.Column | |||
| import jakarta.persistence.Entity | |||
| import jakarta.persistence.Table | |||
| import jakarta.validation.constraints.NotNull | |||
| import jakarta.validation.constraints.Size | |||
| @Table(name = "process") | |||
| @Entity | |||
| open class Process : BaseEntity<Long>() { | |||
| @Size(max = 30) | |||
| @NotNull | |||
| @Column(name = "code", nullable = false, length = 30) | |||
| open var code: String? = null | |||
| @Size(max = 30) | |||
| @NotNull | |||
| @Column(name = "name", nullable = false, length = 30) | |||
| open var name: String? = null | |||
| @Size(max = 1000) | |||
| @NotNull | |||
| @Column(name = "description", nullable = true, length = 1000) | |||
| open var description: String? = null | |||
| @Size(max = 1000) | |||
| @NotNull | |||
| @Column(name = "remarks", nullable = true, length = 1000) | |||
| open var remarks: String? = null | |||
| } | |||
| @@ -0,0 +1,19 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.entity.BaseEntity | |||
| import jakarta.persistence.* | |||
| import jakarta.validation.constraints.NotNull | |||
| @Table(name = "process_equipment") | |||
| @Entity | |||
| open class ProcessEquipment : BaseEntity<Long>() { | |||
| @NotNull | |||
| @ManyToOne(optional = false) | |||
| @JoinColumn(name = "equipmentId", nullable = false) | |||
| open var equipment: Equipment? = null | |||
| @NotNull | |||
| @ManyToOne(optional = false) | |||
| @JoinColumn(name = "processId", nullable = false) | |||
| open var process: Process? = null | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface ProcessEquipmentRepository : AbstractRepository<ProcessEquipment, Long> { | |||
| } | |||
| @@ -0,0 +1,8 @@ | |||
| package com.ffii.fpsms.modules.master.entity | |||
| import com.ffii.core.support.AbstractRepository | |||
| import org.springframework.stereotype.Repository | |||
| @Repository | |||
| interface ProcessRepository: AbstractRepository<Process, Long> { | |||
| } | |||
| @@ -12,15 +12,15 @@ interface ShopRepository : AbstractRepository<Shop, Long> { | |||
| fun findByIdAndDeletedIsFalse(id: Long): Shop? | |||
| fun findByM18IdAndDeletedIsFalse(m18Id: Long): Shop? | |||
| fun findByM18IdAndTypeAndDeletedIsFalse(m18Id: Long, type: ShopType): Shop? | |||
| @Query( | |||
| nativeQuery = true, | |||
| value = "select s.id from Shop s where s.code regexp ?1 and s.type = ?2 and s.deleted = false") | |||
| fun findIdsByCodeRegexpAndTypeAndDeletedIsFalse(codeRegexp: String, type: String): List<Long>? | |||
| value = "select s.m18Id from shop s where s.code regexp ?1 and s.type = ?2 and s.deleted = false") | |||
| fun findM18IdsByCodeRegexpAndTypeAndDeletedIsFalse(codeRegexp: String, type: String): List<Long>? | |||
| @Query( | |||
| nativeQuery = true, | |||
| value = "select s.id from Shop s where s.code not regexp ?1 and s.type = ?2 and s.deleted = false") | |||
| fun findIdsByCodeNotRegexpAndTypeAndDeletedIsFalse(codeNotRegexp: String, type: String): List<Long>? | |||
| value = "select s.m18Id from Shop s where s.code not regexp ?1 and s.type = ?2 and s.deleted = false") | |||
| fun findM18IdsByCodeNotRegexpAndTypeAndDeletedIsFalse(codeNotRegexp: String, type: String): List<Long>? | |||
| } | |||
| @@ -7,7 +7,7 @@ import java.time.LocalDateTime | |||
| @Repository | |||
| interface UomConversionRepository : AbstractRepository<UomConversion, Long> { | |||
| //fun importFromM18(): ArrayList<UomConversion>; | |||
| fun findByIdAndDeletedFalse(id: Long): UomConversion; | |||
| fun findByIdAndDeletedFalse(id: Long): UomConversion?; | |||
| fun findByM18IdAndDeletedFalse(m18Id: Long): UomConversion?; | |||
| @@ -0,0 +1,65 @@ | |||
| package com.ffii.fpsms.modules.master.service | |||
| import com.ffii.fpsms.modules.master.entity.* | |||
| import com.ffii.fpsms.modules.master.web.models.SaveBomMaterialRequest | |||
| import com.ffii.fpsms.modules.master.web.models.SaveBomMaterialResponse | |||
| import org.springframework.stereotype.Service | |||
| @Service | |||
| open class BomMaterialService( | |||
| val bomMaterialRepository: BomMaterialRepository, | |||
| val itemsService: ItemsService, | |||
| val uomConversionService: UomConversionService, | |||
| val bomService: BomService, | |||
| ) { | |||
| open fun findById(id: Long): BomMaterial? { | |||
| return bomMaterialRepository.findByIdAndDeletedIsFalse(id); | |||
| } | |||
| open fun findByM18Id(m18Id: Long): BomMaterial? { | |||
| return bomMaterialRepository.findByM18IdAndDeletedIsFalse(m18Id); | |||
| } | |||
| open fun saveBomMaterial(request: SaveBomMaterialRequest): SaveBomMaterialResponse { | |||
| val bomMaterial = request.m18Id?.let { findByM18Id(it) } | |||
| ?: request.id?.let { findById(it) } | |||
| ?: BomMaterial(); | |||
| val item = request.m18ItemId?.let { itemsService.findByM18Id(it) } | |||
| ?: request.itemId?.let { itemsService.findById(it) } | |||
| val uom = request.m18UomId?.let { uomConversionService.findByM18Id(it) } | |||
| ?: request.uomId?.let { uomConversionService.findById(it) } | |||
| val bom = request.m18BomId?.let { bomService.findById(it) } | |||
| ?: request.bomId?.let { bomService.findById(it) } | |||
| ?: Bom() | |||
| bomMaterial.apply { | |||
| this.item = item | |||
| itemName = request.itemName | |||
| isConsumable = request.isConsumable | |||
| qty = request.qty | |||
| this.uom = uom | |||
| uomName = request.uomName | |||
| this.bom = bom | |||
| m18Id = request.m18Id ?: m18Id | |||
| m18LastModifyDate = request.m18LastModifyDate ?: m18LastModifyDate | |||
| remarks = request.remarks | |||
| } | |||
| val response = bomMaterialRepository.saveAndFlush(bomMaterial).let { | |||
| SaveBomMaterialResponse( | |||
| id = it.id, | |||
| itemName = it.itemName, | |||
| isConsumable = it.isConsumable, | |||
| qty = it.qty, | |||
| uomName = it.uomName, | |||
| bomCode = it.bom?.code, | |||
| remarks = it.remarks | |||
| ) | |||
| } | |||
| return response | |||
| } | |||
| } | |||
| @@ -0,0 +1,64 @@ | |||
| package com.ffii.fpsms.modules.master.service | |||
| import com.ffii.fpsms.modules.master.entity.Bom | |||
| import com.ffii.fpsms.modules.master.entity.BomRepository | |||
| import com.ffii.fpsms.modules.master.web.models.SaveBomRequest | |||
| import com.ffii.fpsms.modules.master.web.models.SaveBomResponse | |||
| import org.springframework.stereotype.Service | |||
| import kotlin.jvm.optionals.getOrNull | |||
| @Service | |||
| open class BomService( | |||
| val bomRepository: BomRepository, | |||
| val itemsService: ItemsService, | |||
| val uomConversionService: UomConversionService | |||
| ) { | |||
| open fun findById(id: Long): Bom? { | |||
| return bomRepository.findByIdAndDeletedIsFalse(id) | |||
| } | |||
| open fun findByM18Id(m18Id: Long): Bom? { | |||
| return bomRepository.findByM18IdAndDeletedIsFalse(m18Id) | |||
| } | |||
| open fun saveBom(request: SaveBomRequest): SaveBomResponse { | |||
| val item = request.code.let { itemsService.findByM18BomCode(it) } ?: request.itemId?.let { itemsService.findById(it) } | |||
| val uom = request.m18UomId?.let { uomConversionService.findByM18Id(it) } | |||
| ?: request.uomId?.let { uomConversionService.findById(it) } | |||
| val bom = request.m18Id?.let { findByM18Id(it) } | |||
| ?: request.id?.let { findById(it) } | |||
| ?: Bom() | |||
| bom.apply { | |||
| this.item = item | |||
| code = request.code | |||
| name = request.name | |||
| description = request.description | |||
| outputQty = request.outputQty | |||
| outputQtyUom = request.outputQtyUom | |||
| yield = request.yield | |||
| this.uom = uom | |||
| m18Id = request.m18Id ?: m18Id | |||
| m18LastModifyDate = request.m18LastModifyDate ?: m18LastModifyDate | |||
| } | |||
| val response = bomRepository.saveAndFlush(bom).let { | |||
| SaveBomResponse( | |||
| id = it.id, | |||
| code = it.code, | |||
| name = it.name, | |||
| description = it.description, | |||
| outputQty = it.outputQty, | |||
| outputQtyUom = it.outputQtyUom, | |||
| yield = it.yield, | |||
| uomName = uom?.udfudesc, | |||
| ) | |||
| } | |||
| return response | |||
| } | |||
| } | |||
| @@ -2,7 +2,7 @@ package com.ffii.fpsms.modules.master.service | |||
| import com.ffii.fpsms.modules.master.entity.Currency | |||
| import com.ffii.fpsms.modules.master.entity.CurrencyRepository | |||
| import com.ffii.fpsms.modules.master.web.models.CurrencyRequest | |||
| import com.ffii.fpsms.modules.master.web.models.SaveCurrencyRequest | |||
| import org.springframework.stereotype.Service | |||
| @Service | |||
| @@ -17,7 +17,7 @@ open class CurrencyService( | |||
| return currencyRepository.findByM18IdAndDeletedIsFalse(m18Id); | |||
| } | |||
| open fun saveCurrency(request: CurrencyRequest): Currency { | |||
| open fun saveCurrency(request: SaveCurrencyRequest): Currency { | |||
| val currency = request.m18Id?.let { findByM18Id(it) } ?: request.id?.let { findById(it) } ?: Currency() | |||
| currency.apply { | |||
| @@ -4,6 +4,8 @@ import com.ffii.fpsms.modules.master.entity.ItemUom | |||
| import com.ffii.fpsms.modules.master.entity.ItemUomRespository | |||
| import com.ffii.fpsms.modules.master.web.models.ItemUomRequest | |||
| import org.springframework.stereotype.Service | |||
| import org.springframework.transaction.annotation.Transactional | |||
| import java.io.IOException | |||
| import kotlin.jvm.optionals.getOrNull | |||
| @Service | |||
| @@ -25,9 +27,21 @@ open class ItemUomService( | |||
| return itemUomRespository.findByM18IdAndDeletedIsFalse(m18Id); | |||
| } | |||
| open fun findPurchaseUnitByItemId(itemId: Long): ItemUom? { | |||
| return itemUomRespository.findByItemIdAndPurchaseUnitIsTrueAndDeletedIsFalse(itemId) | |||
| } | |||
| open fun findPurchaseUnitByM18ItemId(m18ItemId: Long): ItemUom? { | |||
| return itemUomRespository.findByItemM18IdAndPurchaseUnitIsTrueAndDeletedIsFalse(m18ItemId) | |||
| } | |||
| // See if need to update the response | |||
| open fun saveItemUom(request: ItemUomRequest): ItemUom { | |||
| val itemUom = request.m18Id?.let { findByM18Id(it) } ?: request.id?.let { findById(it) } ?: ItemUom() | |||
| if (request.m18LastModifyDate == itemUom.m18LastModifyDate) { | |||
| return itemUom | |||
| } | |||
| val item = request.itemId?.let { itemsService.find(it).getOrNull() } | |||
| val uom = request.m18UomId?.let { uomConversionService.findByM18Id(it) } ?: request.uomId?.let { uomConversionService.find(it).getOrNull() } | |||
| val currency = request.currencyId?.let { currencyService.findById(it) } | |||
| @@ -51,7 +65,12 @@ open class ItemUomService( | |||
| return savedItemUom | |||
| } | |||
| @Throws(IOException::class) | |||
| @Transactional | |||
| open fun deleteItemUoms(deleteIds: List<Long>) { | |||
| itemUomRespository.deleteAllByIdIn(deleteIds) | |||
| // println(deleteIds) | |||
| if (deleteIds.isNotEmpty()) { | |||
| itemUomRespository.deleteAllByIdIn(deleteIds) | |||
| } | |||
| } | |||
| } | |||
| @@ -48,15 +48,34 @@ open class ItemsService( | |||
| return jdbcDao.queryForList(sql.toString(), args); | |||
| } | |||
| open fun findById(id: Long): Items? { | |||
| return itemsRepository.findByIdAndDeletedFalse(id); | |||
| } | |||
| open fun findByM18Id(m18Id: Long): Items? { | |||
| return itemsRepository.findByM18IdAndDeletedIsFalse(m18Id) | |||
| } | |||
| open fun findByNameLikeAndM18UomId(name: String, m18UomId: Long): Items? { | |||
| return itemsRepository.findByNameLikeAndUomM18Id(name, m18UomId); | |||
| } | |||
| open fun findByNameExactlyAndM18UomId(name: String, m18UomId: Long): Items? { | |||
| return itemsRepository.findByNameExactlyAndUomM18Id(name, m18UomId); | |||
| } | |||
| open fun findByNameAndM18UomId(name: String, m18UomId: Long): Items? { | |||
| return findByNameExactlyAndM18UomId(name, m18UomId) ?: findByNameLikeAndM18UomId(name, m18UomId); | |||
| } | |||
| open fun findByM18BomCode(m18BomCode: String): Items? { | |||
| return itemsRepository.findByM18BomCode(m18BomCode); | |||
| } | |||
| // QcCheck included item | |||
| open fun getItem(id: Long): ItemWithQcResponse { | |||
| val list = listOf(1,2) | |||
| val item = itemsRepository.findByIdAndDeletedFalse(id) | |||
| val item = itemsRepository.findByIdAndDeletedFalse(id) ?: Items() | |||
| val qcItems = qcItemsRepository.findAllByDeletedIsFalse() | |||
| val qcCheckMap = qcCheckRepository.findAllByItemIdAndDeletedFalse(id).associateBy { it.id } | |||
| val qc = qcItems.map { | |||
| @@ -100,8 +119,19 @@ open class ItemsService( | |||
| ) | |||
| } | |||
| val item = if (request.m18Id != null) findByM18Id(request.m18Id) ?: Items() | |||
| else if (request.id != null && request.id > 0) itemsRepository.findByIdAndDeletedFalse(request.id) | |||
| else if (request.id != null && request.id > 0) itemsRepository.findByIdAndDeletedFalse(request.id) ?: Items() | |||
| else Items() | |||
| if (item.m18LastModifyDate == request.m18LastModifyDate) { | |||
| return MessageResponse( | |||
| id = item.id, | |||
| code = item.code, | |||
| name = item.name, | |||
| type = item.type.toString(), | |||
| message = "M18 Item does not have any updates", | |||
| errorPosition = "m18LastModifyDate" | |||
| ) | |||
| } | |||
| item.apply { | |||
| code = request.code | |||
| name = request.name | |||
| @@ -21,26 +21,37 @@ open class ShopService( | |||
| return shopRepository.findByIdAndDeletedIsFalse(id) | |||
| } | |||
| open fun findByM18Id(m18Id: Long): Shop? { | |||
| return shopRepository.findByM18IdAndDeletedIsFalse(m18Id) | |||
| open fun findVendorByM18Id(m18Id: Long): Shop? { | |||
| return shopRepository.findByM18IdAndTypeAndDeletedIsFalse(m18Id, ShopType.SUPPLIER) | |||
| } | |||
| open fun findVendorIdsByCodeRegexp(code: List<String>): List<Long>? { | |||
| open fun findM18VendorIdsByCodeRegexp(code: List<String>): List<Long>? { | |||
| val codeRegexp = code.joinToString("|") | |||
| return shopRepository.findIdsByCodeRegexpAndTypeAndDeletedIsFalse(codeRegexp, type = ShopType.SUPPLIER.value) | |||
| return shopRepository.findM18IdsByCodeRegexpAndTypeAndDeletedIsFalse(codeRegexp, type = ShopType.SUPPLIER.value) | |||
| } | |||
| open fun findVendorIdsByCodeNotRegexp(code: List<String>): List<Long>? { | |||
| open fun findM18VendorIdsByCodeNotRegexp(code: List<String>): List<Long>? { | |||
| val codeRegexp = code.joinToString("|") | |||
| return shopRepository.findIdsByCodeNotRegexpAndTypeAndDeletedIsFalse(codeRegexp, type = ShopType.SUPPLIER.value) | |||
| return shopRepository.findM18IdsByCodeNotRegexpAndTypeAndDeletedIsFalse(codeRegexp, type = ShopType.SUPPLIER.value) | |||
| } | |||
| open fun saveShop(request: SaveShopRequest): SaveShopResponse { | |||
| val shop = if (request.m18Id != null) { | |||
| findByM18Id(request.m18Id) ?: Shop() | |||
| findVendorByM18Id(request.m18Id) ?: Shop() | |||
| } else { | |||
| request.id?.let { shopRepository.findById(it).getOrDefault(Shop()) } ?: Shop() | |||
| } | |||
| if (shop.m18LastModifyDate == request.m18LastModifyDate) { | |||
| return shop.let { | |||
| SaveShopResponse( | |||
| id = it.id, | |||
| code = it.code, | |||
| name = it.name, | |||
| ) | |||
| } | |||
| } | |||
| val type = request.type?.let { type -> ShopType.entries.find { it.value == type } } | |||
| shop.apply { | |||
| @@ -196,6 +196,10 @@ open class UomConversionService( | |||
| } | |||
| } | |||
| open fun findById(id: Long): UomConversion? { | |||
| return uomConversionRepository.findByIdAndDeletedFalse(id) | |||
| } | |||
| open fun findByM18Id(m18Id: Long) : UomConversion? { | |||
| return uomConversionRepository.findByM18IdAndDeletedFalse(m18Id) | |||
| } | |||
| @@ -0,0 +1,21 @@ | |||
| package com.ffii.fpsms.modules.master.web.models | |||
| import java.math.BigDecimal | |||
| import java.time.LocalDateTime | |||
| data class SaveBomMaterialRequest( | |||
| val id: Long? = null, | |||
| val itemId: Long? = null, | |||
| val m18ItemId: Long? = null, | |||
| val itemName: String?, | |||
| val isConsumable: Boolean = false, | |||
| val qty: BigDecimal?, | |||
| val uomId: Long? = null, | |||
| val m18UomId: Long? = null, | |||
| val uomName: String? = null, | |||
| val bomId: Long? = null, | |||
| val m18BomId: Long? = null, | |||
| val m18Id: Long? = null, | |||
| val m18LastModifyDate: LocalDateTime? = null, | |||
| val remarks: String? = null | |||
| ) | |||
| @@ -0,0 +1,13 @@ | |||
| package com.ffii.fpsms.modules.master.web.models | |||
| import java.math.BigDecimal | |||
| data class SaveBomMaterialResponse ( | |||
| val id: Long?, | |||
| val itemName: String?, | |||
| val isConsumable: Boolean?, | |||
| val qty: BigDecimal?, | |||
| val uomName: String?, | |||
| val bomCode: String?, | |||
| val remarks: String?, | |||
| ) | |||
| @@ -0,0 +1,23 @@ | |||
| package com.ffii.fpsms.modules.master.web.models | |||
| import jakarta.validation.constraints.NotBlank | |||
| import java.math.BigDecimal | |||
| import java.time.LocalDateTime | |||
| data class SaveBomRequest ( | |||
| val id: Long? = null, | |||
| @field:NotBlank(message = "bom code cannot be empty") | |||
| val code: String, | |||
| @field:NotBlank(message = "bom name cannot be empty") | |||
| val name: String, | |||
| @field:NotBlank(message = "bom description cannot be empty") | |||
| val description: String, | |||
| val itemId: Long? = null, | |||
| val outputQty: BigDecimal? = null, | |||
| val outputQtyUom: String? = null, | |||
| val yield: BigDecimal? = null, | |||
| val uomId: Long? = null, | |||
| val m18UomId: Long? = null, | |||
| val m18Id: Long? = null, | |||
| val m18LastModifyDate: LocalDateTime? = null | |||
| ) | |||
| @@ -0,0 +1,14 @@ | |||
| package com.ffii.fpsms.modules.master.web.models | |||
| import java.math.BigDecimal | |||
| data class SaveBomResponse ( | |||
| val id: Long?, | |||
| val code: String?, | |||
| val name: String?, | |||
| val description: String?, | |||
| val outputQty: BigDecimal? = null, | |||
| val outputQtyUom: String? = null, | |||
| val yield: BigDecimal? = null, | |||
| val uomName: String? = null, | |||
| ) | |||
| @@ -0,0 +1,12 @@ | |||
| package com.ffii.fpsms.modules.master.web.models | |||
| import java.time.LocalDateTime | |||
| data class SaveCurrencyRequest ( | |||
| val id: Long?, | |||
| val code: String?, | |||
| val name: String?, | |||
| val description: String?, | |||
| val m18Id: Long?, | |||
| val m18LastModifyDate: LocalDateTime?, | |||
| ) | |||