|
|
@@ -2,14 +2,73 @@ package com.ffii.fpsms.modules.master.service |
|
|
|
|
|
|
|
import com.ffii.core.support.AbstractBaseEntityService |
|
|
|
import com.ffii.core.support.JdbcDao |
|
|
|
import com.ffii.fpsms.modules.master.entity.Material |
|
|
|
import com.ffii.fpsms.modules.master.entity.MaterialRepository |
|
|
|
import com.ffii.fpsms.enums.RelationColumnType |
|
|
|
import com.ffii.fpsms.modules.master.entity.Product |
|
|
|
import com.ffii.fpsms.modules.master.entity.ProductRepository |
|
|
|
import com.ffii.fpsms.modules.master.web.models.NewProductRequest |
|
|
|
import com.ffii.fpsms.modules.master.web.models.NewProductResponse |
|
|
|
import org.springframework.transaction.annotation.Transactional |
|
|
|
import kotlin.jvm.optionals.getOrNull |
|
|
|
|
|
|
|
class ProductService( |
|
|
|
private val jdbcDao: JdbcDao, |
|
|
|
private val productRepository: ProductRepository |
|
|
|
private val productRepository: ProductRepository, |
|
|
|
private val uomService: ProductMaterialUomService, |
|
|
|
private val typeService: ProductMaterialTypeService, |
|
|
|
private val weightUnitService: ProductMaterialWeightUnitService, |
|
|
|
): AbstractBaseEntityService<Product, Long, ProductRepository>(jdbcDao, productRepository) { |
|
|
|
// do mapping with projection |
|
|
|
open fun allProduct(): List<Product> { |
|
|
|
// TODO: Replace by actual logic |
|
|
|
val materials = productRepository.findAll() |
|
|
|
return materials |
|
|
|
} |
|
|
|
open fun getProduct(id: Long): Product? { |
|
|
|
return productRepository.findById(id).getOrNull() |
|
|
|
} |
|
|
|
@Transactional |
|
|
|
open fun saveProduct(request: NewProductRequest): NewProductResponse { |
|
|
|
val duplicateProduct = productRepository.findByCodeAndDeletedIsFalse(request.code) |
|
|
|
val product = |
|
|
|
if (request.id != null && request.id > 0) productRepository.findByIdAndDeletedFalse(request.id) |
|
|
|
else Product() |
|
|
|
if (duplicateProduct != null && duplicateProduct.id != request.id) { |
|
|
|
return NewProductResponse( |
|
|
|
id = request.id, |
|
|
|
code = request.code, |
|
|
|
name = request.name, |
|
|
|
message = "The product code has already existed", |
|
|
|
errorPosition = "code" |
|
|
|
) |
|
|
|
} |
|
|
|
product.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 savedProduct = productRepository.saveAndFlush(product) |
|
|
|
|
|
|
|
val columnName = RelationColumnType.PRODUCT |
|
|
|
if (!request.uom.isNullOrEmpty()) uomService.saveUom(savedProduct.id!!, columnName, request.uom) |
|
|
|
if (!request.weightUnit.isNullOrEmpty()) weightUnitService.saveWeightUnit(savedProduct.id!!, columnName, request.weightUnit) |
|
|
|
if (!request.type.isNullOrEmpty()) typeService.saveType(savedProduct.id!!, columnName, request.type) |
|
|
|
return NewProductResponse( |
|
|
|
id = savedProduct.id, |
|
|
|
name = savedProduct.name, |
|
|
|
code = savedProduct.code, |
|
|
|
message = "Product Save Success", |
|
|
|
errorPosition = null, |
|
|
|
) |
|
|
|
} |
|
|
|
} |