diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/Items.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/Items.kt index 1fe6afe..0db4657 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/Items.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/Items.kt @@ -4,6 +4,7 @@ import com.ffii.core.entity.BaseEntity import com.ffii.fpsms.modules.master.web.models.ItemType import jakarta.persistence.* import jakarta.validation.constraints.NotNull +import java.time.LocalDateTime @Entity @Table(name = "items") @@ -37,4 +38,7 @@ open class Items : BaseEntity() { @Column(name = "m18Id") open var m18Id: Long? = null + + @Column(name = "m18LastModifyDate") + open var m18LastModifyDate: LocalDateTime? = null } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ItemsRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ItemsRepository.kt index dd60959..633ff16 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/ItemsRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ItemsRepository.kt @@ -7,6 +7,10 @@ import org.springframework.stereotype.Repository @Repository interface ItemsRepository : AbstractRepository { fun findAllByDeletedFalse(): List; + fun findByIdAndDeletedFalse(id: Long): Items; + fun findByCodeAndTypeAndDeletedFalse(code: String, type: String): Items?; + + fun findByM18IdAndDeletedIsFalse(m18Id: Long): Items?; } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/Shop.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/Shop.kt index 3d58278..3abbbb8 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/Shop.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/Shop.kt @@ -1,63 +1,75 @@ package com.ffii.fpsms.modules.master.entity import com.ffii.core.entity.BaseEntity +import com.ffii.fpsms.modules.master.enums.ShopType +import com.ffii.fpsms.modules.master.enums.ShopTypeConverter import jakarta.persistence.Column +import jakarta.persistence.Convert import jakarta.persistence.Entity import jakarta.persistence.Table import jakarta.validation.constraints.NotNull import jakarta.validation.constraints.Size +import java.time.LocalDateTime @Entity @Table(name = "shop") open class Shop : BaseEntity() { - @Size(max = 30) + @Size(max = 50) @NotNull - @Column(name = "code", nullable = false, length = 30) + @Column(name = "code", nullable = false, length = 50) open var code: String? = null - @Size(max = 30) + @Size(max = 300) @NotNull - @Column(name = "name", nullable = false, length = 30) + @Column(name = "name", nullable = false, length = 300) open var name: String? = null - @Size(max = 30) - @Column(name = "brNo", length = 30) + @Size(max = 50) + @Column(name = "brNo", length = 50) open var brNo: String? = null - @Size(max = 30) - @Column(name = "contactNo", length = 30) + @Size(max = 50) + @Column(name = "contactNo", length = 50) open var contactNo: String? = null - @Size(max = 30) - @Column(name = "contactEmail", length = 30) + @Size(max = 50) + @Column(name = "contactEmail", length = 50) open var contactEmail: String? = null - @Size(max = 30) - @Column(name = "contactName", length = 30) + @Size(max = 50) + @Column(name = "contactName", length = 50) open var contactName: String? = null - @Size(max = 30) - @Column(name = "addr1", length = 30) + @Size(max = 300) + @Column(name = "addr1", length = 300) open var addr1: String? = null - @Size(max = 30) - @Column(name = "addr2", length = 30) + @Size(max = 300) + @Column(name = "addr2", length = 300) open var addr2: String? = null - @Size(max = 30) - @Column(name = "addr3", length = 30) + @Size(max = 300) + @Column(name = "addr3", length = 300) open var addr3: String? = null - @Size(max = 30) - @Column(name = "addr4", length = 30) + @Size(max = 300) + @Column(name = "addr4", length = 300) open var addr4: String? = null - @Size(max = 30) - @Column(name = "district", length = 30) + @Size(max = 300) + @Column(name = "district", length = 300) open var district: String? = null - @Size(max = 10) + @Convert(converter = ShopTypeConverter::class) @Column(name = "type", length = 10) - open var type: String? = null + open var type: ShopType? = null + + @NotNull + @Column(name = "m18Id", nullable = false) + open var m18Id: Long? = null + + @NotNull + @Column(name = "m18LastModifyDate", nullable = false) + open var m18LastModifyDate: LocalDateTime? = null } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ShopRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ShopRepository.kt index edf5784..ab87775 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/ShopRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ShopRepository.kt @@ -5,4 +5,9 @@ import org.springframework.stereotype.Repository @Repository interface ShopRepository : AbstractRepository { + fun findAllByDeletedIsFalse(): List + + fun findByIdAndDeletedIsFalse(id: Long): Shop? + + fun findByM18IdAndDeletedIsFalse(m18Id: Long): Shop? } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/enums/ShopType.kt b/src/main/java/com/ffii/fpsms/modules/master/enums/ShopType.kt new file mode 100644 index 0000000..2d9dae4 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/enums/ShopType.kt @@ -0,0 +1,6 @@ +package com.ffii.fpsms.modules.master.enums + +enum class ShopType(val value: String) { + SUPPLIER("supplier"), + SHOP("shop"); +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/enums/ShopTypeConverter.kt b/src/main/java/com/ffii/fpsms/modules/master/enums/ShopTypeConverter.kt new file mode 100644 index 0000000..48499d6 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/enums/ShopTypeConverter.kt @@ -0,0 +1,17 @@ +package com.ffii.fpsms.modules.master.enums + +import jakarta.persistence.AttributeConverter +import jakarta.persistence.Converter + +@Converter(autoApply = true) +class ShopTypeConverter : AttributeConverter { + override fun convertToDatabaseColumn(type: ShopType?): String? { + return type?.value + } + + override fun convertToEntityAttribute(value: String?): ShopType? { + return value?.let { v -> + ShopType.entries.find { it.value == v } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt index 83b93cc..f664ffe 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/ItemsService.kt @@ -48,6 +48,11 @@ open class ItemsService( return jdbcDao.queryForList(sql.toString(), args); } + + open fun findByM18Id(m18Id: Long): Items? { + return itemsRepository.findByM18IdAndDeletedIsFalse(m18Id) + } + // QcCheck included item open fun getItem(id: Long): ItemWithQcResponse { val list = listOf(1,2) @@ -83,7 +88,7 @@ open class ItemsService( @Throws(IOException::class) @Transactional open fun saveItem(request: NewItemRequest): MessageResponse { - val duplicatedItem = itemsRepository.findByCodeAndTypeAndDeletedFalse(request.code, request.type.name) + val duplicatedItem = itemsRepository.findByCodeAndTypeAndDeletedFalse(request.code, request.type.type) if (duplicatedItem != null && duplicatedItem.id != request.id) { return MessageResponse( id = request.id, @@ -94,7 +99,8 @@ open class ItemsService( errorPosition = "code" ) } - val item = if (request.id != null && request.id > 0) itemsRepository.findByIdAndDeletedFalse(request.id) + val item = if (request.m18Id != null) findByM18Id(request.m18Id) ?: Items() + else if (request.id != null && request.id > 0) itemsRepository.findByIdAndDeletedFalse(request.id) else Items() item.apply { code = request.code @@ -104,7 +110,9 @@ open class ItemsService( shelfLife = request.shelfLife countryOfOrigin = request.countryOfOrigin maxQty = request.maxQty - this.type = request.type.name + this.type = request.type.type + m18Id = request.m18Id ?: this.m18Id + m18LastModifyDate = request.m18LastModifyDate ?: this.m18LastModifyDate } val savedItem = itemsRepository.saveAndFlush(item) return MessageResponse( diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/QcItemService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/QcItemService.kt index 7f4fd00..75f9edc 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/QcItemService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/QcItemService.kt @@ -4,7 +4,11 @@ import com.ffii.core.support.AbstractBaseEntityService import com.ffii.core.support.JdbcDao import com.ffii.fpsms.modules.master.entity.QcItem import com.ffii.fpsms.modules.master.entity.QcItemRepository +import com.ffii.fpsms.modules.master.web.models.SaveQcItemRequest +import com.ffii.fpsms.modules.master.web.models.SaveQcItemResponse +import jakarta.validation.Valid import org.springframework.stereotype.Service +import org.springframework.web.bind.annotation.RequestBody @Service open class QcItemService( @@ -31,4 +35,49 @@ open class QcItemService( return allQcItems() } + + open fun saveQcItem(@Valid @RequestBody request: SaveQcItemRequest): SaveQcItemResponse { + +// val qcItemProperties = QcItem::class.members.filterIsInstance>() + val errors = mutableMapOf() + val id = request.id + val qcItem = if (id != null) qcItemRepository.findById(id).orElseThrow() else QcItem() + + // check duplicated code + val duplicateQcItem = findQcItemByCode(request.code) + if (duplicateQcItem != null && duplicateQcItem.id != qcItem.id) { + errors["code"] = "Code is duplicated" + } + + if (errors.isNotEmpty()) { + request.let { + SaveQcItemResponse( + id = it.id, + code = it.code, + name = it.name, + description = it.description, + errors = errors + ) + } + } + + // Save Qc Item + qcItem.apply { + code = request.code + name = request.name + description = request.description + } + + val savedQcItem = qcItemRepository.save(qcItem) + + return savedQcItem.let { + SaveQcItemResponse( + id = it.id, + code = it.code, + name = it.name, + description = it.description, + errors = null + ) + } + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/ShopService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/ShopService.kt new file mode 100644 index 0000000..9a9cf24 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/service/ShopService.kt @@ -0,0 +1,62 @@ +package com.ffii.fpsms.modules.master.service + +import com.ffii.fpsms.modules.master.entity.Shop +import com.ffii.fpsms.modules.master.entity.ShopRepository +import com.ffii.fpsms.modules.master.enums.ShopType +import com.ffii.fpsms.modules.master.web.models.SaveShopRequest +import com.ffii.fpsms.modules.master.web.models.SaveShopResponse +import org.springframework.stereotype.Service +import kotlin.jvm.optionals.getOrDefault + +@Service +open class ShopService( + val shopRepository: ShopRepository +) { + open fun findAll(): List { + return shopRepository.findAllByDeletedIsFalse() + } + + open fun findById(id: Long): Shop? { + return shopRepository.findByIdAndDeletedIsFalse(id) + } + + open fun findByM18Id(m18Id: Long): Shop? { + return shopRepository.findByM18IdAndDeletedIsFalse(m18Id) + } + + open fun saveShop(request: SaveShopRequest): SaveShopResponse { + val shop = if (request.m18Id != null) { + findByM18Id(request.m18Id) ?: Shop() + } else { + request.id?.let { shopRepository.findById(it).getOrDefault(Shop()) } ?: Shop() + } + val type = request.type?.let { type -> ShopType.entries.find { it.value == type } } + + shop.apply { + code = request.code + name = request.name + brNo = request.brNo + contactNo = request.contactNo + contactEmail = request.contactEmail + contactName = request.contactName + addr1 = request.addr1 + addr2 = request.addr2 + addr3 = request.addr3 + addr4 = request.addr4 + district = request.district + this.type = type + m18Id = request.m18Id ?: this.m18Id + m18LastModifyDate = request.m18LastModifyDate ?: this.m18LastModifyDate + } + + val response = shopRepository.saveAndFlush(shop).let { + SaveShopResponse( + id = it.id, + code = it.code, + name = it.name, + ) + } + + return response + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/NewItemRequest.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/NewItemRequest.kt index c360614..aa8a0c2 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/web/models/NewItemRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/NewItemRequest.kt @@ -2,8 +2,9 @@ package com.ffii.fpsms.modules.master.web.models import jakarta.validation.constraints.NotBlank import jakarta.validation.constraints.NotNull +import java.time.LocalDateTime -enum class ItemType(type: String) { +enum class ItemType(val type: String) { MATERIAL("mat"), BY_PRODUCT("byp"), PRODUCT("product"), @@ -24,6 +25,7 @@ data class NewItemRequest( val countryOfOrigin: String?, val maxQty: Double?, val m18Id: Long?, + val m18LastModifyDate: LocalDateTime?, // val type: List?, // val uom: List?, // val weightUnit: List?, diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveShopRequest.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveShopRequest.kt new file mode 100644 index 0000000..ce8cb7c --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveShopRequest.kt @@ -0,0 +1,21 @@ +package com.ffii.fpsms.modules.master.web.models + +import java.time.LocalDateTime + +data class SaveShopRequest ( + val id: Long?, + val code: String?, + val name: String?, + val brNo: String?, + val contactNo: String?, + val contactEmail: String?, + val contactName: String?, + val addr1: String?, + val addr2: String?, + val addr3: String?, + val addr4: String?, + val district: String?, + val type: String?, + val m18Id: Long?, + val m18LastModifyDate: LocalDateTime?, +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveShopResponse.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveShopResponse.kt new file mode 100644 index 0000000..b36f1c8 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/SaveShopResponse.kt @@ -0,0 +1,7 @@ +package com.ffii.fpsms.modules.master.web.models + +data class SaveShopResponse ( + val id: Long?, + val code: String?, + val name: String?, +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrder.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrder.kt index 61ba98c..69f7226 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrder.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrder.kt @@ -2,7 +2,9 @@ package com.ffii.fpsms.modules.purchaseOrder.entity import com.ffii.core.entity.BaseEntity import com.ffii.fpsms.modules.master.entity.Shop -import com.ffii.fpsms.modules.stock.entity.M18DataLog +import com.ffii.fpsms.m18.entity.M18DataLog +import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderStatus +import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderStatusConverter import jakarta.persistence.* import jakarta.validation.constraints.NotNull import jakarta.validation.constraints.Size @@ -24,16 +26,16 @@ open class PurchaseOrder : BaseEntity() { @Column(name = "orderDate") open var orderDate: LocalDateTime? = null - @Column(name = "estimatedCompleteDate") - open var estimatedCompleteDate: LocalDate? = null + @Column(name = "estimatedArrivalDate") + open var estimatedArrivalDate: LocalDateTime? = null @Column(name = "completeDate") open var completeDate: LocalDateTime? = null - @Size(max = 10) @NotNull @Column(name = "status", nullable = false, length = 10) - open var status: String? = null + @Convert(converter = PurchaseOrderStatusConverter::class) + open var status: PurchaseOrderStatus? = null @NotNull @ManyToOne(fetch = FetchType.LAZY, optional = false) diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLine.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLine.kt index 30dbc64..cc462c8 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLine.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLine.kt @@ -2,7 +2,10 @@ package com.ffii.fpsms.modules.purchaseOrder.entity import com.ffii.core.entity.BaseEntity import com.ffii.fpsms.modules.master.entity.Items -import com.ffii.fpsms.modules.stock.entity.M18DataLog +import com.ffii.fpsms.m18.entity.M18DataLog +import com.ffii.fpsms.modules.master.enums.ShopTypeConverter +import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderLineStatus +import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderLineStatusConverter import jakarta.persistence.* import jakarta.validation.constraints.NotNull import jakarta.validation.constraints.Size @@ -10,7 +13,7 @@ import java.math.BigDecimal @Entity @Table(name = "purchase_order_line") -class PurchaseOrderLine : BaseEntity(){ +open class PurchaseOrderLine : BaseEntity(){ @NotNull @ManyToOne(fetch = FetchType.LAZY, optional = false) @JoinColumn(name = "itemId", nullable = false) @@ -21,6 +24,11 @@ class PurchaseOrderLine : BaseEntity(){ @Column(name = "itemNo", nullable = false, length = 20) open var itemNo: String? = null +// @NotNull +// @ManyToOne(fetch = FetchType.LAZY, optional = false) +// @JoinColumn(name = "uomId", nullable = false) +// open var uom: UomConversion? = null + @NotNull @ManyToOne(fetch = FetchType.LAZY, optional = false) @JoinColumn(name = "purchaseOrderId", nullable = false) @@ -36,10 +44,10 @@ class PurchaseOrderLine : BaseEntity(){ @Column(name = "priceUnit", length = 5) open var priceUnit: String? = null - @Size(max = 10) + @Convert(converter = PurchaseOrderLineStatusConverter::class) @NotNull @Column(name = "status", nullable = false, length = 10) - open var status: String? = null + open var status: PurchaseOrderLineStatus? = null @NotNull @ManyToOne(fetch = FetchType.LAZY, optional = false) diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLineRepository.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLineRepository.kt index 63f1f66..9bb07d0 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLineRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderLineRepository.kt @@ -2,7 +2,9 @@ package com.ffii.fpsms.modules.purchaseOrder.entity import com.ffii.core.support.AbstractRepository import org.springframework.stereotype.Repository +import java.io.Serializable @Repository interface PurchaseOrderLineRepository : AbstractRepository { + fun findByM18DataLogIdAndDeletedIsFalse(m18datalogId: Serializable): PurchaseOrderLine? } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderRepository.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderRepository.kt index 7e28a40..4e80f50 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/entity/PurchaseOrderRepository.kt @@ -2,7 +2,9 @@ package com.ffii.fpsms.modules.purchaseOrder.entity import com.ffii.core.support.AbstractRepository import org.springframework.stereotype.Repository +import java.io.Serializable @Repository interface PurchaseOrderRepository : AbstractRepository { + fun findByM18DataLogIdAndDeletedIsFalse(m18datalogId: Serializable): PurchaseOrder? } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/enums/PurchaseOrderLineStatus.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/enums/PurchaseOrderLineStatus.kt new file mode 100644 index 0000000..c7371a1 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/enums/PurchaseOrderLineStatus.kt @@ -0,0 +1,10 @@ +package com.ffii.fpsms.modules.purchaseOrder.enums + +import com.ffii.fpsms.modules.master.enums.ShopType + +enum class PurchaseOrderLineStatus(val value: String) { + PENDING("pending"), + PICKING("picking"), + COMPLETED("completed"); +} + diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/enums/PurchaseOrderLineStatusConverter.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/enums/PurchaseOrderLineStatusConverter.kt new file mode 100644 index 0000000..d6901fd --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/enums/PurchaseOrderLineStatusConverter.kt @@ -0,0 +1,17 @@ +package com.ffii.fpsms.modules.purchaseOrder.enums + +import jakarta.persistence.AttributeConverter +import jakarta.persistence.Converter + +@Converter(autoApply = true) +class PurchaseOrderLineStatusConverter : AttributeConverter { + override fun convertToDatabaseColumn(status: PurchaseOrderLineStatus?): String? { + return status?.value + } + + override fun convertToEntityAttribute(value: String?): PurchaseOrderLineStatus? { + return value?.let { v -> + PurchaseOrderLineStatus.entries.find { it.value == v } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/enums/PurchaseOrderStatus.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/enums/PurchaseOrderStatus.kt new file mode 100644 index 0000000..c0d4b6d --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/enums/PurchaseOrderStatus.kt @@ -0,0 +1,16 @@ +package com.ffii.fpsms.modules.purchaseOrder.enums + +import com.ffii.fpsms.modules.master.enums.ShopType + +enum class PurchaseOrderStatus(val value: String) { + PENDING ("pending"), + RECEIVING ("receiving"), + COMPLETED ("completed"); + + companion object { + fun fromValue(value: String): ShopType { + return ShopType.entries.find { it.value == value } + ?: throw IllegalArgumentException("No enum constant with value: $value") + } + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/enums/PurchaseOrderStatusConverter.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/enums/PurchaseOrderStatusConverter.kt new file mode 100644 index 0000000..5507231 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/enums/PurchaseOrderStatusConverter.kt @@ -0,0 +1,17 @@ +package com.ffii.fpsms.modules.purchaseOrder.enums + +import jakarta.persistence.AttributeConverter +import jakarta.persistence.Converter + +@Converter(autoApply = true) +class PurchaseOrderStatusConverter : AttributeConverter{ + override fun convertToDatabaseColumn(status: PurchaseOrderStatus?): String? { + return status?.value + } + + override fun convertToEntityAttribute(value: String?): PurchaseOrderStatus? { + return value?.let { v -> + PurchaseOrderStatus.entries.find { it.value == v } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderLineService.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderLineService.kt new file mode 100644 index 0000000..53814c3 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderLineService.kt @@ -0,0 +1,67 @@ +package com.ffii.fpsms.modules.purchaseOrder.service + +import com.ffii.fpsms.m18.entity.M18DataLogRepository +import com.ffii.fpsms.modules.master.entity.ItemsRepository +import com.ffii.fpsms.modules.master.service.ItemsService +import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrder +import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLine +import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLineRepository +import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository +import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderLineStatus +import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderLineRequest +import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderLineResponse +import org.springframework.stereotype.Service +import java.math.BigDecimal +import kotlin.jvm.optionals.getOrDefault +import kotlin.jvm.optionals.getOrNull + +@Service +open class PurchaseOrderLineService( + val purchaseOrderLineRepository: PurchaseOrderLineRepository, + val itemsService: ItemsService, + val itemsRepository: ItemsRepository, + val purchaseOrderRepository: PurchaseOrderRepository, + val m18DataLogRepository: M18DataLogRepository +) { + open fun allPurchaseOrderLine(): List { + return purchaseOrderLineRepository.findAll() + } + + open fun findPurchaseOrderLineByM18Id(m18DataLogId: Long): PurchaseOrderLine? { + return purchaseOrderLineRepository.findByM18DataLogIdAndDeletedIsFalse(m18DataLogId) + } + + open fun savePurchaseOrderLine(request: SavePurchaseOrderLineRequest): SavePurchaseOrderLineResponse { + val purchaseOrderLine = + request.id?.let { purchaseOrderLineRepository.findById(it).getOrDefault(PurchaseOrderLine()) } + ?: PurchaseOrderLine() + val item = request.itemId?.let { itemsRepository.findById(it).getOrNull() } + val purchaseOrder = request.purchaseOrderId?.let { purchaseOrderRepository.findById(it).getOrNull() } + val status = request.status?.let { status -> PurchaseOrderLineStatus.entries.find { it.value == status } } + val m18DataLog = request.m18DataLogId?.let { m18DataLogRepository.findById(it).getOrNull() } + + purchaseOrderLine.apply { + this.item = item + itemNo = item?.code + this.purchaseOrder = purchaseOrder + qty = request.qty + price = request.price + priceUnit = request.priceUnit + this.status = status + this.m18DataLog = m18DataLog ?: this.m18DataLog + } + + val savedPurchaseOrderLine = purchaseOrderLineRepository.saveAndFlush(purchaseOrderLine).let { + SavePurchaseOrderLineResponse( + id = it.id, + itemNo = it.itemNo, + qty = it.qty, + price = it.price, + priceUnit = it.priceUnit, + status = it.status?.value + ) + } + + return savedPurchaseOrderLine + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt index 3e9f960..98ffe77 100644 --- a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/service/PurchaseOrderService.kt @@ -1,14 +1,60 @@ package com.ffii.fpsms.modules.purchaseOrder.service +import com.ffii.fpsms.m18.entity.M18DataLogRepository +import com.ffii.fpsms.modules.master.entity.ShopRepository import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrder import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository +import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderStatus +import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderRequest +import com.ffii.fpsms.modules.purchaseOrder.web.model.SavePurchaseOrderResponse import org.springframework.stereotype.Service +import kotlin.jvm.optionals.getOrDefault +import kotlin.jvm.optionals.getOrNull @Service open class PurchaseOrderService( - val purchaseOrderRepository: PurchaseOrderRepository + val purchaseOrderRepository: PurchaseOrderRepository, + val shopRepository: ShopRepository, + val m18DataLogRepository: M18DataLogRepository, ) { open fun allPurchaseOrder(): List { return purchaseOrderRepository.findAll() } + + open fun findPurchaseOrderByM18Id(m18DataLogId: Long): PurchaseOrder? { + return purchaseOrderRepository.findByM18DataLogIdAndDeletedIsFalse(m18DataLogId) + } + open fun savePurchaseOrder(request: SavePurchaseOrderRequest): SavePurchaseOrderResponse { + val purchaseOrder = + request.id?.let { purchaseOrderRepository.findById(it).getOrDefault(PurchaseOrder()) } ?: PurchaseOrder() + val supplier = request.supplierId?.let { shopRepository.findById(it).getOrNull() } + val status = request.status?.let { status -> PurchaseOrderStatus.entries.find { it.value == status } } + val m18DataLog = request.m18DataLogId?.let { m18DataLogRepository.findById(it).getOrNull() } + + //Need check duplicate? + + purchaseOrder.apply { + code = request.code + this.supplier = supplier + orderDate = request.orderDate + estimatedArrivalDate = request.estimatedArrivalDate + completeDate = request.completeDate + this.status = status + this.m18DataLog = m18DataLog + } + + val savedPurchaseOrder = purchaseOrderRepository.saveAndFlush(purchaseOrder).let { + SavePurchaseOrderResponse( + id = it.id, + code = it.code, + supplierCode = it.supplier?.code, + orderDate = it.orderDate, + estimatedArrivalDate = it.estimatedArrivalDate, + completeDate = it.completeDate, + status = it.status?.value + ) + } + + return savedPurchaseOrder + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderLineRequest.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderLineRequest.kt new file mode 100644 index 0000000..0a01644 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderLineRequest.kt @@ -0,0 +1,16 @@ +package com.ffii.fpsms.modules.purchaseOrder.web.model + +import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderLineStatus +import java.math.BigDecimal + +data class SavePurchaseOrderLineRequest( + val id: Long?, + val itemId: Long?, + val uomId: Long?, + val purchaseOrderId: Long?, + val qty: BigDecimal?, + val price: BigDecimal?, + val priceUnit: String?, + val status: String?, + val m18DataLogId: Long?, +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderLineResponse.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderLineResponse.kt new file mode 100644 index 0000000..d198d95 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderLineResponse.kt @@ -0,0 +1,13 @@ +package com.ffii.fpsms.modules.purchaseOrder.web.model + +import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderLineStatus +import java.math.BigDecimal + +data class SavePurchaseOrderLineResponse ( + val id: Long?, + val itemNo: String?, + val qty: BigDecimal?, + val price: BigDecimal?, + val priceUnit: String?, + val status: String?, +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderRequest.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderRequest.kt new file mode 100644 index 0000000..60043bf --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderRequest.kt @@ -0,0 +1,16 @@ +package com.ffii.fpsms.modules.purchaseOrder.web.model + +import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderStatus +import java.time.LocalDate +import java.time.LocalDateTime + +data class SavePurchaseOrderRequest ( + val id: Long?, + val code: String?, + val supplierId: Long?, + val orderDate: LocalDateTime?, + val estimatedArrivalDate: LocalDateTime?, + val completeDate: LocalDateTime?, + val status: String?, + val m18DataLogId: Long? +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderResponse.kt b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderResponse.kt new file mode 100644 index 0000000..3dd9004 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/purchaseOrder/web/model/SavePurchaseOrderResponse.kt @@ -0,0 +1,15 @@ +package com.ffii.fpsms.modules.purchaseOrder.web.model + +import com.ffii.fpsms.modules.purchaseOrder.enums.PurchaseOrderStatus +import java.time.LocalDate +import java.time.LocalDateTime + +data class SavePurchaseOrderResponse ( + val id: Long?, + val code: String?, + val supplierCode: String?, + val orderDate: LocalDateTime?, + val estimatedArrivalDate: LocalDateTime?, + val completeDate: LocalDateTime?, + val status: String?, +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLine.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLine.kt index 56bcf54..6c218bd 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLine.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLine.kt @@ -1,6 +1,7 @@ package com.ffii.fpsms.modules.stock.entity import com.ffii.core.entity.BaseEntity +import com.ffii.fpsms.m18.entity.M18DataLog import com.ffii.fpsms.modules.master.entity.Items import com.ffii.fpsms.modules.stock.entity.enum.StockInLineStatus import com.ffii.fpsms.modules.user.entity.User