@@ -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?, | |||
) |