From ecf32377096c6cc069b6cfd9ee006194ed3987da Mon Sep 17 00:00:00 2001 From: "MSI\\derek" Date: Mon, 10 Mar 2025 18:36:27 +0800 Subject: [PATCH] update save material --- build.gradle | 9 +-- src/main/java/com/ffii/fpsms/enums/Enums.kt | 10 ++++ .../fpsms/modules/master/entity/Material.kt | 2 +- .../master/entity/MaterialRepository.kt | 6 +- .../fpsms/modules/master/entity/Product.kt | 2 +- .../master/entity/ProductMaterialType.kt | 10 ++-- .../entity/ProductMaterialTypeRepository.kt | 14 +++++ .../master/entity/ProductMaterialUom.kt | 6 +- .../entity/ProductMaterialUomRepository.kt | 17 ++++++ .../entity/ProductMaterialWeightUnit.kt | 6 +- .../ProductMaterialWeightUnitRepository.kt | 12 ++++ .../master/entity/ProductRepository.kt | 1 + .../modules/master/service/MaterialService.kt | 58 ++++++++++++++++++- .../service/ProductMaterialTypeService.kt | 48 +++++++++++++++ .../service/ProductMaterialUomService.kt | 48 +++++++++++++++ .../ProductMaterialWeightUnitService.kt | 48 +++++++++++++++ .../modules/master/web/MaterialController.kt | 20 +++++-- .../master/web/models/MaterialResponse.kt | 9 +++ .../master/web/models/MessageResponse.kt | 7 +++ .../master/web/models/NewMaterialRequest.kt | 40 +++++++++++++ .../master/web/models/NewProductRequest.kt | 30 ++++++++++ .../master/web/models/ProductResponse.kt | 9 +++ .../01_update_master_relation_tables.sql | 10 ++++ .../01_update_ProdMat_type_col.sql | 6 ++ .../02_update_shelfLife_prodMat.sql | 9 +++ 25 files changed, 409 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/ffii/fpsms/enums/Enums.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialTypeRepository.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialUomRepository.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialWeightUnitRepository.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/service/ProductMaterialTypeService.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/service/ProductMaterialUomService.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/service/ProductMaterialWeightUnitService.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/web/models/MaterialResponse.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/web/models/MessageResponse.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/web/models/NewMaterialRequest.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/web/models/NewProductRequest.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/master/web/models/ProductResponse.kt create mode 100644 src/main/resources/db/changelog/changes/20250307_01_derek/01_update_master_relation_tables.sql create mode 100644 src/main/resources/db/changelog/changes/20250310_01_derek/01_update_ProdMat_type_col.sql create mode 100644 src/main/resources/db/changelog/changes/20250310_01_derek/02_update_shelfLife_prodMat.sql diff --git a/build.gradle b/build.gradle index 0842663..634babf 100644 --- a/build.gradle +++ b/build.gradle @@ -38,24 +38,25 @@ dependencies { implementation group: 'jakarta.validation', name: 'jakarta.validation-api', version: '3.0.2' implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.15.2' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.15.2' + implementation group: 'com.fasterxml.jackson.module', name: 'jackson-module-kotlin', version: '2.15.2' implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5' implementation group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5' implementation group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + implementation "org.jetbrains.kotlin:kotlin-reflect" + compileOnly group: 'jakarta.servlet', name: 'jakarta.servlet-api', version: '6.0.0' runtimeOnly 'com.mysql:mysql-connector-j' - runtimeOnly 'com.unboundid:unboundid-ldapsdk:6.0.9' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" - implementation "org.jetbrains.kotlin:kotlin-reflect" } configurations { - all { + configureEach { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' } } diff --git a/src/main/java/com/ffii/fpsms/enums/Enums.kt b/src/main/java/com/ffii/fpsms/enums/Enums.kt new file mode 100644 index 0000000..5452e4a --- /dev/null +++ b/src/main/java/com/ffii/fpsms/enums/Enums.kt @@ -0,0 +1,10 @@ +package com.ffii.fpsms.enums + +enum class Status(val value: Int) { + PENDING(1), + COMPLETE(2) +} +enum class RelationColumnType(val col: String) { + MATERIAL("materialId"), + PRODUCT("productId") +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/Material.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/Material.kt index 5e84959..9c7b333 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/Material.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/Material.kt @@ -43,7 +43,7 @@ open class Material : BaseEntity() { private val type: Set = HashSet() @Column(name = "shelfLife") - open var shelfLife: Number? = null + open var shelfLife: Double? = null @Column(name = "countryOfOrigin") open var countryOfOrigin: String? = null diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/MaterialRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/MaterialRepository.kt index 275e429..95b0e63 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/MaterialRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/MaterialRepository.kt @@ -2,9 +2,11 @@ package com.ffii.fpsms.modules.master.entity import com.ffii.core.support.AbstractRepository import org.springframework.stereotype.Repository +import java.util.Optional @Repository interface MaterialRepository : AbstractRepository { -// fun findAllByDeletedFalse(): List; - + fun findAllByDeletedFalse(): List; + fun findByIdAndDeletedFalse(id: Long): Material; + fun findByCodeAndDeletedIsFalse(code: String): Material?; } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/Product.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/Product.kt index 2cd0e34..969df77 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/Product.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/Product.kt @@ -43,7 +43,7 @@ open class Product : BaseEntity() { private val type: Set = HashSet() @Column(name = "shelfLife") - open var shelfLife: Number? = null + open var shelfLife: Double? = null @Column(name = "countryOfOrigin") open var countryOfOrigin: String? = null diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialType.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialType.kt index 2448498..35b93c8 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialType.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialType.kt @@ -1,27 +1,25 @@ package com.ffii.fpsms.modules.master.entity import com.fasterxml.jackson.annotation.JsonBackReference +import com.ffii.core.entity.IdEntity import jakarta.persistence.* import jakarta.validation.constraints.NotNull @Entity @Table(name = "product_material_type") -open class ProductMaterialType { +open class ProductMaterialType: IdEntity() { @ManyToOne @JoinColumn(name = "productId") @JsonBackReference - @NotNull open var product: Product? = null @ManyToOne @JoinColumn(name = "materialId") @JsonBackReference - @NotNull open var material: Material? = null - @Id @NotNull - @Column(name = "name") - open var name: String? = null + @Column(name = "type") + open var type: String? = null } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialTypeRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialTypeRepository.kt new file mode 100644 index 0000000..5d336aa --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialTypeRepository.kt @@ -0,0 +1,14 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.stereotype.Repository +import org.springframework.transaction.annotation.Transactional +import java.util.Optional + +@Repository +interface ProductMaterialTypeRepository : AbstractRepository { + @Transactional + fun deleteAllByMaterialId(id: Long) + @Transactional + fun deleteAllByProductId(id: Long) +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialUom.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialUom.kt index 99ed014..645006e 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialUom.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialUom.kt @@ -1,25 +1,23 @@ package com.ffii.fpsms.modules.master.entity import com.fasterxml.jackson.annotation.JsonBackReference +import com.ffii.core.entity.IdEntity import jakarta.persistence.* import jakarta.validation.constraints.NotNull @Entity @Table(name = "product_material_uom") -open class ProductMaterialUom { +open class ProductMaterialUom: IdEntity() { @ManyToOne @JoinColumn(name = "productId") @JsonBackReference - @NotNull open var product: Product? = null @ManyToOne @JoinColumn(name = "materialId") @JsonBackReference - @NotNull open var material: Material? = null - @Id @NotNull @Column(name = "uom") open var uom: String? = null diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialUomRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialUomRepository.kt new file mode 100644 index 0000000..1d56edb --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialUomRepository.kt @@ -0,0 +1,17 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.data.jpa.repository.Modifying +import org.springframework.data.jpa.repository.Query +import org.springframework.stereotype.Repository +import org.springframework.transaction.annotation.Transactional + + +@Repository +interface ProductMaterialUomRepository : AbstractRepository { + + @Transactional + fun deleteAllByMaterialId(id: Long) + @Transactional + fun deleteAllByProductId(id: Long) +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialWeightUnit.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialWeightUnit.kt index db01d69..d0b181c 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialWeightUnit.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialWeightUnit.kt @@ -1,25 +1,23 @@ package com.ffii.fpsms.modules.master.entity import com.fasterxml.jackson.annotation.JsonBackReference +import com.ffii.core.entity.IdEntity import jakarta.persistence.* import jakarta.validation.constraints.NotNull @Entity @Table(name = "product_material_weightUnit") -open class ProductMaterialWeightUnit { +open class ProductMaterialWeightUnit: IdEntity() { @ManyToOne @JoinColumn(name = "productId") @JsonBackReference - @NotNull open var product: Product? = null @ManyToOne @JoinColumn(name = "materialId") @JsonBackReference - @NotNull open var material: Material? = null - @Id @NotNull @Column(name = "weightUnit") open var weightUnit: String? = null diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialWeightUnitRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialWeightUnitRepository.kt new file mode 100644 index 0000000..cfb4f65 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductMaterialWeightUnitRepository.kt @@ -0,0 +1,12 @@ +package com.ffii.fpsms.modules.master.entity + +import com.ffii.core.support.AbstractRepository +import org.springframework.stereotype.Repository +import org.springframework.transaction.annotation.Transactional +@Repository +interface ProductMaterialWeightUnitRepository : AbstractRepository { + @Transactional + fun deleteAllByMaterialId(id: Long) + @Transactional + fun deleteAllByProductId(id: Long) +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/entity/ProductRepository.kt b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductRepository.kt index 73735fd..1bb0363 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/entity/ProductRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/entity/ProductRepository.kt @@ -5,4 +5,5 @@ import com.ffii.core.support.AbstractRepository interface ProductRepository: AbstractRepository { fun findAllByDeletedFalse(): List; + fun findByIdAndDeletedFalse(id: Long): Product; } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/MaterialService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/MaterialService.kt index c63e43c..fd912e8 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/service/MaterialService.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/service/MaterialService.kt @@ -2,19 +2,75 @@ package com.ffii.fpsms.modules.master.service import com.ffii.core.support.AbstractBaseEntityService import com.ffii.core.support.JdbcDao +import com.ffii.fpsms.enums.RelationColumnType import com.ffii.fpsms.modules.master.entity.Material import com.ffii.fpsms.modules.master.entity.MaterialRepository +import com.ffii.fpsms.modules.master.web.models.NewMaterialRequest +import com.ffii.fpsms.modules.master.web.models.NewMaterialResponse import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import kotlin.jvm.optionals.getOrNull @Service open class MaterialService( private val jdbcDao: JdbcDao, private val materialRepository: MaterialRepository, + private val uomService: ProductMaterialUomService, + private val typeService: ProductMaterialTypeService, + private val weightUnitService: ProductMaterialWeightUnitService, ): AbstractBaseEntityService(jdbcDao, materialRepository) { // do mapping with projection - open fun getMaterials(): List { + open fun allMaterials(): List { // TODO: Replace by actual logic val materials = materialRepository.findAll() return materials } + open fun getMaterial(id: Long): Material? { + return materialRepository.findById(id).getOrNull() + } + @Transactional + open fun saveMaterial(request: NewMaterialRequest): NewMaterialResponse { + val duplicateMaterial = materialRepository.findByCodeAndDeletedIsFalse(request.code) + val material = + if (request.id != null && request.id > 0) materialRepository.findByIdAndDeletedFalse(request.id) + else Material() + if (duplicateMaterial != null && duplicateMaterial.id != request.id) { + return NewMaterialResponse( + id = request.id, + code = request.code, + name = request.name, + message = "The material code has already existed", + errorPosition = "code" + ) + } + material.apply { + code = request.code + name = request.name + isConsumables = request.isConsumables + description = request.description + remarks = request.remarks + shelfLife = request.shelfLife + countryOfOrigin = request.countryOfOrigin + minHumid = request.minHumid + maxHumid = request.maxHumid + minTemp = request.minTemp + maxTemp = request.maxTemp + sampleRate = request.sampleRate + passingRate = request.passingRate + netWeight = request.netWeight + } + val savedMaterial = materialRepository.saveAndFlush(material) + + val columnName = RelationColumnType.MATERIAL + if (!request.uom.isNullOrEmpty()) uomService.saveUom(savedMaterial.id!!, columnName, request.uom) + if (!request.weightUnit.isNullOrEmpty()) weightUnitService.saveWeightUnit(savedMaterial.id!!, columnName, request.weightUnit) + if (!request.type.isNullOrEmpty()) typeService.saveType(savedMaterial.id!!, columnName, request.type) + return NewMaterialResponse( + id = savedMaterial.id, + name = savedMaterial.name, + code = savedMaterial.code, + message = "Material Save Success", + errorPosition = null, + ) + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/ProductMaterialTypeService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/ProductMaterialTypeService.kt new file mode 100644 index 0000000..40dde94 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/service/ProductMaterialTypeService.kt @@ -0,0 +1,48 @@ +package com.ffii.fpsms.modules.master.service + +import com.ffii.core.support.JdbcDao +import com.ffii.fpsms.enums.RelationColumnType +import com.ffii.fpsms.modules.master.entity.* +import com.ffii.fpsms.modules.master.web.models.MessageResponse +import com.ffii.fpsms.modules.master.web.models.NewTypeRequest +import com.ffii.fpsms.modules.master.web.models.NewWeightUnitRequest +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Service +open class ProductMaterialTypeService( + private val jdbcDao: JdbcDao, + private val materialRepository: MaterialRepository, + private val productRepository: ProductRepository, + private val productMaterialTypeRepository: ProductMaterialTypeRepository + ) { + @Transactional + open fun saveType(id: Long, columnType: RelationColumnType, typeList: List): MessageResponse { + var material: Material? = null + var product: Product? = null + when (columnType) { + RelationColumnType.MATERIAL -> { + productMaterialTypeRepository.deleteAllByMaterialId(id) + material = materialRepository.findByIdAndDeletedFalse(id) + } + RelationColumnType.PRODUCT -> { + productMaterialTypeRepository.deleteAllByProductId(id) + product = productRepository.findByIdAndDeletedFalse(id) + } + } + val entries = mutableListOf() + for (entry in typeList) { + entries += ProductMaterialType().apply { + this.material = material + this.product = product + type = entry.type + } + } + productMaterialTypeRepository.saveAll(entries) + return MessageResponse( + id = id, + message = "Weight unit save success", + errorPosition = null + ) + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/ProductMaterialUomService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/ProductMaterialUomService.kt new file mode 100644 index 0000000..6dd0f00 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/service/ProductMaterialUomService.kt @@ -0,0 +1,48 @@ +package com.ffii.fpsms.modules.master.service + +import com.ffii.core.support.AbstractIdEntityService +import com.ffii.core.support.JdbcDao +import com.ffii.fpsms.enums.RelationColumnType +import com.ffii.fpsms.modules.master.entity.* +import com.ffii.fpsms.modules.master.web.models.MessageResponse +import com.ffii.fpsms.modules.master.web.models.NewUomRequest +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Service +open class ProductMaterialUomService( + private val jdbcDao: JdbcDao, + private val uomRepository: ProductMaterialUomRepository, + private val materialRepository: MaterialRepository, + private val productRepository: ProductRepository, + ): AbstractIdEntityService(jdbcDao, uomRepository) { + @Transactional + open fun saveUom(id: Long, columnType: RelationColumnType, uomList: List): MessageResponse { + var material: Material? = null + var product: Product? = null + when (columnType) { + RelationColumnType.MATERIAL -> { + uomRepository.deleteAllByMaterialId(id) + material = materialRepository.findByIdAndDeletedFalse(id) + } + RelationColumnType.PRODUCT -> { + uomRepository.deleteAllByProductId(id) + product = productRepository.findByIdAndDeletedFalse(id) + } + } + val entries = mutableListOf() + for (entry in uomList) { + entries += ProductMaterialUom().apply { + this.material = material + this.product = product + uom = entry.uom + } + } + uomRepository.saveAll(entries) + return MessageResponse( + id = id, + message = "Uom save success", + errorPosition = null + ) + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/service/ProductMaterialWeightUnitService.kt b/src/main/java/com/ffii/fpsms/modules/master/service/ProductMaterialWeightUnitService.kt new file mode 100644 index 0000000..4ddebda --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/service/ProductMaterialWeightUnitService.kt @@ -0,0 +1,48 @@ +package com.ffii.fpsms.modules.master.service + +import com.ffii.core.support.JdbcDao +import com.ffii.fpsms.enums.RelationColumnType +import com.ffii.fpsms.modules.master.entity.* +import com.ffii.fpsms.modules.master.web.models.MessageResponse +import com.ffii.fpsms.modules.master.web.models.NewWeightUnitRequest +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional + +@Service +open class ProductMaterialWeightUnitService( + private val jdbcDao: JdbcDao, + private val weightUnitRepository: ProductMaterialWeightUnitRepository, + private val materialRepository: MaterialRepository, + private val productRepository: ProductRepository, + ) { + @Transactional + open fun saveWeightUnit(id: Long, columnType: RelationColumnType, weightUnits: List): MessageResponse { + var material: Material? = null + var product: Product? = null + when (columnType) { + RelationColumnType.MATERIAL -> { + weightUnitRepository.deleteAllByMaterialId(id) + material = materialRepository.findByIdAndDeletedFalse(id) + } + RelationColumnType.PRODUCT -> { + weightUnitRepository.deleteAllByProductId(id) + product = productRepository.findByIdAndDeletedFalse(id) + } + } + val entries = mutableListOf() + for (entry in weightUnits) { + entries += ProductMaterialWeightUnit().apply { + this.material = material + this.product = product + weightUnit = entry.weightUnit + conversion = entry.conversion + } + } + weightUnitRepository.saveAll(entries) + return MessageResponse( + id = id, + message = "Weight unit save success", + errorPosition = null + ) + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/MaterialController.kt b/src/main/java/com/ffii/fpsms/modules/master/web/MaterialController.kt index 879e4fc..99fbdb3 100644 --- a/src/main/java/com/ffii/fpsms/modules/master/web/MaterialController.kt +++ b/src/main/java/com/ffii/fpsms/modules/master/web/MaterialController.kt @@ -1,18 +1,28 @@ package com.ffii.fpsms.modules.master.web +import com.ffii.core.exception.NotFoundException import com.ffii.fpsms.modules.master.entity.Material import com.ffii.fpsms.modules.master.service.MaterialService -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController +import com.ffii.fpsms.modules.master.web.models.NewMaterialRequest +import com.ffii.fpsms.modules.master.web.models.NewMaterialResponse +import jakarta.validation.Valid +import org.springframework.web.bind.annotation.* @RestController -@RequestMapping("/materials") +@RequestMapping("/material") class MaterialController( private val materialService: MaterialService ) { @GetMapping fun allMaterial(): List { - return materialService.getMaterials() + return materialService.allMaterials() + } + @GetMapping("/details/{id}") + fun getMaterial(@PathVariable id: Long): Material { + return materialService.getMaterial(id) ?: throw NotFoundException() + } + @PostMapping("/new") + fun saveMaterial(@Valid @RequestBody newMaterial: NewMaterialRequest): NewMaterialResponse { + return materialService.saveMaterial(newMaterial) } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/MaterialResponse.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/MaterialResponse.kt new file mode 100644 index 0000000..cd45bf9 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/MaterialResponse.kt @@ -0,0 +1,9 @@ +package com.ffii.fpsms.modules.master.web.models + +data class NewMaterialResponse( + val id: Long?, + val name: String?, + val code: String?, + val message: String?, // e.g. duplicated code + val errorPosition: String?, //error field +) diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/MessageResponse.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/MessageResponse.kt new file mode 100644 index 0000000..aac1139 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/MessageResponse.kt @@ -0,0 +1,7 @@ +package com.ffii.fpsms.modules.master.web.models + +data class MessageResponse( + val id: Long?, + val message: String?, + val errorPosition: String?, // e.g. duplicated code +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/NewMaterialRequest.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/NewMaterialRequest.kt new file mode 100644 index 0000000..aa4e9bc --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/NewMaterialRequest.kt @@ -0,0 +1,40 @@ +package com.ffii.fpsms.modules.master.web.models + +import jakarta.validation.constraints.NotBlank +import jakarta.validation.constraints.NotNull + +data class NewMaterialRequest( + @field:NotBlank(message = "material code cannot be empty") + val code: String, + @field:NotBlank(message = "material name cannot be empty") + val name: String, + @field:NotNull(message = "isConsumables cannot be null") + val isConsumables: Boolean, + + val id: Long?, + val description: String?, + val remarks: String?, + val shelfLife: Double?, + val countryOfOrigin: String?, + val minHumid: Double?, + val maxHumid: Double?, + val minTemp: Double?, + val maxTemp: Double?, + val sampleRate: Double?, + val passingRate: Double?, + val netWeight: Double?, + val type: List?, + val uom: List?, + val weightUnit: List?, +) + +data class NewUomRequest( + val uom: String +) +data class NewTypeRequest( + val type: String, +) +data class NewWeightUnitRequest( + val conversion: Double?, + val weightUnit: String, +) diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/NewProductRequest.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/NewProductRequest.kt new file mode 100644 index 0000000..e5523d3 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/NewProductRequest.kt @@ -0,0 +1,30 @@ +package com.ffii.fpsms.modules.master.web.models + +import jakarta.validation.constraints.NotBlank +import jakarta.validation.constraints.NotNull + +data class NewProductRequest( + + @field:NotBlank(message = "product name cannot be empty") + val code: String, + @field:NotBlank(message = "product name cannot be empty") + val name: String, + @field:NotNull(message = "isConsumables cannot be empty") + val isConsumables: Boolean, + + val id: Long?, + val description: String?, + val remarks: String?, + val shelfLife: Number?, + val countryOfOrigin: String?, + val minHumid: Double?, + val maxHumid: Double?, + val minTemp: Double?, + val maxTemp: Double?, + val sampleRate: Double?, + val passingRate: Double?, + val netWeight: Double?, + val type: List?, + val uom: List?, + val weightUnit: List?, +) diff --git a/src/main/java/com/ffii/fpsms/modules/master/web/models/ProductResponse.kt b/src/main/java/com/ffii/fpsms/modules/master/web/models/ProductResponse.kt new file mode 100644 index 0000000..adc4a3c --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/master/web/models/ProductResponse.kt @@ -0,0 +1,9 @@ +package com.ffii.fpsms.modules.master.web.models + +data class NewProductResponse( + val id: Long?, + val name: String?, + val code: String?, + val message: String?, + val errorPosition: String?, // e.g. duplicated code +) \ No newline at end of file diff --git a/src/main/resources/db/changelog/changes/20250307_01_derek/01_update_master_relation_tables.sql b/src/main/resources/db/changelog/changes/20250307_01_derek/01_update_master_relation_tables.sql new file mode 100644 index 0000000..6f6399c --- /dev/null +++ b/src/main/resources/db/changelog/changes/20250307_01_derek/01_update_master_relation_tables.sql @@ -0,0 +1,10 @@ +-- liquibase formatted sql + +-- changeset derek:update_master_relation_tables + +ALTER TABLE `product_material_type` +ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; +ALTER TABLE `product_material_uom` +ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; +ALTER TABLE `product_material_weightUnit` +ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST; \ No newline at end of file diff --git a/src/main/resources/db/changelog/changes/20250310_01_derek/01_update_ProdMat_type_col.sql b/src/main/resources/db/changelog/changes/20250310_01_derek/01_update_ProdMat_type_col.sql new file mode 100644 index 0000000..9f4472f --- /dev/null +++ b/src/main/resources/db/changelog/changes/20250310_01_derek/01_update_ProdMat_type_col.sql @@ -0,0 +1,6 @@ +-- liquibase formatted sql + +-- changeset derek:update ProdMat type col name + +ALTER TABLE `product_material_type` +CHANGE COLUMN `name` `type` VARCHAR(30) NOT NULL; \ No newline at end of file diff --git a/src/main/resources/db/changelog/changes/20250310_01_derek/02_update_shelfLife_prodMat.sql b/src/main/resources/db/changelog/changes/20250310_01_derek/02_update_shelfLife_prodMat.sql new file mode 100644 index 0000000..faca964 --- /dev/null +++ b/src/main/resources/db/changelog/changes/20250310_01_derek/02_update_shelfLife_prodMat.sql @@ -0,0 +1,9 @@ +-- liquibase formatted sql + +-- changeset derek:update ProdMat shelfLife col name + +ALTER TABLE `product` +CHANGE COLUMN `shelfLife` `shelfLife` DECIMAL(14,1) NOT NULL; + +ALTER TABLE `material` +CHANGE COLUMN `shelfLife` `shelfLife` DECIMAL(14,1) NOT NULL; \ No newline at end of file