diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/CustomerContactRepository.java b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerContactRepository.java index 781d6fd..b1b11da 100644 --- a/src/main/java/com/ffii/tsms/modules/data/entity/CustomerContactRepository.java +++ b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerContactRepository.java @@ -1,7 +1,11 @@ package com.ffii.tsms.modules.data.entity; import com.ffii.core.support.AbstractRepository; +import org.springframework.data.repository.query.Param; + +import java.util.List; public interface CustomerContactRepository extends AbstractRepository { + List findAllByCustomerId(@Param("customerId") Long customerId); } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/CustomerRepository.java b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerRepository.java index aaab530..a83a25b 100644 --- a/src/main/java/com/ffii/tsms/modules/data/entity/CustomerRepository.java +++ b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerRepository.java @@ -1,9 +1,13 @@ package com.ffii.tsms.modules.data.entity; import java.util.Optional; +import java.util.List; + +import org.springframework.data.repository.query.Param; import com.ffii.core.support.AbstractRepository; public interface CustomerRepository extends AbstractRepository { + Optional findByCode(@Param("code") String code); } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/service/CustomerContactService.kt b/src/main/java/com/ffii/tsms/modules/data/service/CustomerContactService.kt new file mode 100644 index 0000000..72bc9a8 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/service/CustomerContactService.kt @@ -0,0 +1,43 @@ +package com.ffii.tsms.modules.data.service + +import com.ffii.tsms.modules.data.entity.CustomerContact +import com.ffii.tsms.modules.data.entity.CustomerContactRepository +import com.ffii.tsms.modules.data.entity.CustomerRepository +import org.springframework.stereotype.Service + +@Service +class CustomerContactService( + private val customerContactRepository: CustomerContactRepository, + private val customerRepository: CustomerRepository +) { + + fun findAllByCustomerId(customerId: Long): List { + return customerContactRepository.findAllByCustomerId(customerId) + } + + fun saveContactsByCustomer(saveCustomerId: Long, saveCustomerContact: List) { + + val customerContactList = mutableListOf() + + val customerContactSize = saveCustomerContact.size + + for (i in 0 until customerContactSize) { + val customer = customerRepository.findById(saveCustomerId).orElseThrow() + val customerContact = CustomerContact().apply { + id = if(saveCustomerContact[i].id!! > 0) saveCustomerContact[i].id else null + this.customer = customer + name = saveCustomerContact[i].name + phone = saveCustomerContact[i].phone + email = saveCustomerContact[i].email + } + + customerContactList.add(customerContact) + } + + customerContactRepository.saveAll(customerContactList) + } + + fun deleteContactsByCustomer(deleteContactIds: List) { + customerContactRepository.deleteAllById(deleteContactIds.filter { it > 0 }) + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/service/CustomerService.kt b/src/main/java/com/ffii/tsms/modules/data/service/CustomerService.kt index 31dfc5a..f916a93 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/CustomerService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/CustomerService.kt @@ -1,14 +1,22 @@ package com.ffii.tsms.modules.data.service import com.ffii.tsms.modules.data.entity.Customer +import com.ffii.tsms.modules.data.entity.CustomerContact import com.ffii.tsms.modules.data.entity.CustomerType import com.ffii.tsms.modules.data.entity.CustomerRepository import com.ffii.tsms.modules.data.entity.CustomerTypeRepository +import com.ffii.tsms.modules.data.web.models.NewCustomerResponse import com.ffii.tsms.modules.project.web.models.SaveCustomerRequest import org.springframework.stereotype.Service +import java.util.Optional @Service -class CustomerService(private val customerRepository: CustomerRepository, private val customerTypeRepository: CustomerTypeRepository, private val customerSubsidiaryService: CustomerSubsidiaryService) { +class CustomerService( + private val customerRepository: CustomerRepository, + private val customerTypeRepository: CustomerTypeRepository, + private val customerSubsidiaryService: CustomerSubsidiaryService, + private val customerContactService: CustomerContactService, +) { fun allCustomers(): List { return customerRepository.findAll() @@ -17,41 +25,63 @@ class CustomerService(private val customerRepository: CustomerRepository, privat fun allCustomerTypes(): List { return customerTypeRepository.findAll() } - + fun findCustomer(id: Long): Customer { return customerRepository.findById(id).orElseThrow() } - fun saveCustomer(saveCustomer: SaveCustomerRequest): Customer { + fun findCustomerByCode(code: String): Optional { + return customerRepository.findByCode(code); + } + + fun saveCustomer(saveCustomer: SaveCustomerRequest): NewCustomerResponse { + + val duplicateCustomer = findCustomerByCode(saveCustomer.code) + + //TODO: check duplicate customer + if (duplicateCustomer.isPresent()) { + return NewCustomerResponse( + customer = duplicateCustomer.get(), + message = "The customer code has already existed" + ); + } val customerType = customerTypeRepository.findById(saveCustomer.typeId).orElseThrow() val customer = - customerRepository.saveAndFlush( - Customer().apply { - id = saveCustomer.id - code = saveCustomer.code - name = saveCustomer.name - this.customerType = customerType - address = saveCustomer.address - district = saveCustomer.district - brNo = saveCustomer.brNo - } - ) + customerRepository.saveAndFlush( + Customer().apply { + id = saveCustomer.id + code = saveCustomer.code + name = saveCustomer.name + this.customerType = customerType + address = saveCustomer.address + district = saveCustomer.district + brNo = saveCustomer.brNo + } + ) val customerId = customer.id - + if (customerId != null && customerId > 0) { - if (saveCustomer.deleteSubsidiaryIds.size > 0) { + if (saveCustomer.deleteSubsidiaryIds.isNotEmpty()) { customerSubsidiaryService.deleteSubsidiariesByCustomer(customerId, saveCustomer.deleteSubsidiaryIds) } - if (saveCustomer.addSubsidiaryIds.size > 0) { + if (saveCustomer.addSubsidiaryIds.isNotEmpty()) { customerSubsidiaryService.saveSubsidiariesByCustomer(customerId, saveCustomer.addSubsidiaryIds) } + + if (saveCustomer.deleteContactIds.isNotEmpty()) { + customerContactService.deleteContactsByCustomer( saveCustomer.deleteContactIds) + } + + if (saveCustomer.addContacts.isNotEmpty()) { + customerContactService.saveContactsByCustomer(customerId, saveCustomer.addContacts) + } } - - return customer + + return NewCustomerResponse(customer = customer, message = "Success"); } } diff --git a/src/main/java/com/ffii/tsms/modules/data/service/CustomerSubsidiaryService.kt b/src/main/java/com/ffii/tsms/modules/data/service/CustomerSubsidiaryService.kt index 6e5b217..757cab2 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/CustomerSubsidiaryService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/CustomerSubsidiaryService.kt @@ -18,12 +18,15 @@ class CustomerSubsidiaryService( return customerSubsidiaryRepository.findAll() } + fun findAllByCustomerId(customerId : Long) : List { + return customerSubsidiaryRepository.findAllByCustomerId(customerId) + } fun findAllSubsidiaryIdsByCustomerId(customerId : Long) : List { val customerSubsidiaryList: List = customerSubsidiaryRepository.findAllByCustomerId(customerId) - if (customerSubsidiaryList.size > 0) { - return customerSubsidiaryList.map { it.subsidiary.id }.filterNotNull() + if (customerSubsidiaryList.isNotEmpty()) { + return customerSubsidiaryList.mapNotNull { it.subsidiary.id } } else return emptyList() } @@ -49,19 +52,12 @@ class CustomerSubsidiaryService( fun deleteSubsidiariesByCustomer(deleteCustomerId: Long, deleteSubsidiaryIds: List) { - val customerSubsidiaryList = mutableListOf() - - val subsidiaryIdsSize = deleteSubsidiaryIds.size - - for (i in 0 until subsidiaryIdsSize) { - val customer = customerRepository.findById(deleteCustomerId).orElseThrow() - val subsidiary = subsidiaryRepository.findById(deleteSubsidiaryIds[i]).orElseThrow() - val customerSubsidiary = CustomerSubsidiary().apply { - this.customer = customer - this.subsidiary = subsidiary - } + val customerSubsidiaryList: List = findAllByCustomerId(deleteCustomerId) - customerSubsidiaryList.add(customerSubsidiary) + if (customerSubsidiaryList.isNotEmpty()) { + val filteredSubsidiaryIds: List = + customerSubsidiaryList.filter { deleteSubsidiaryIds.contains(it.subsidiary.id!!) }.mapNotNull { it.id } + customerSubsidiaryRepository.deleteAllById(filteredSubsidiaryIds) } } } diff --git a/src/main/java/com/ffii/tsms/modules/data/web/CustomerController.kt b/src/main/java/com/ffii/tsms/modules/data/web/CustomerController.kt index 6ae5780..e7072f6 100644 --- a/src/main/java/com/ffii/tsms/modules/data/web/CustomerController.kt +++ b/src/main/java/com/ffii/tsms/modules/data/web/CustomerController.kt @@ -4,8 +4,9 @@ import com.ffii.tsms.modules.data.entity.Customer import com.ffii.tsms.modules.data.entity.CustomerType import com.ffii.tsms.modules.data.service.CustomerService import com.ffii.tsms.modules.data.service.CustomerSubsidiaryService +import com.ffii.tsms.modules.data.web.models.CustomerResponse +import com.ffii.tsms.modules.data.web.models.NewCustomerResponse import com.ffii.tsms.modules.project.web.models.SaveCustomerRequest -import com.ffii.tsms.modules.project.web.models.CustomerResponse import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @@ -37,7 +38,7 @@ class CustomerController(private val customerService: CustomerService, private v } @PostMapping("/save") - fun saveCustomer(@Valid @RequestBody saveCustomer: SaveCustomerRequest): Customer { + fun saveCustomer(@Valid @RequestBody saveCustomer: SaveCustomerRequest): NewCustomerResponse { return customerService.saveCustomer(saveCustomer) } } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/web/CustomerSubsidiaryController.kt b/src/main/java/com/ffii/tsms/modules/data/web/CustomerSubsidiaryController.kt index 85564b2..f24436f 100644 --- a/src/main/java/com/ffii/tsms/modules/data/web/CustomerSubsidiaryController.kt +++ b/src/main/java/com/ffii/tsms/modules/data/web/CustomerSubsidiaryController.kt @@ -5,7 +5,7 @@ import com.ffii.tsms.modules.data.entity.CustomerSubsidiary import com.ffii.tsms.modules.data.service.CustomerService import com.ffii.tsms.modules.data.service.CustomerSubsidiaryService import com.ffii.tsms.modules.project.web.models.SaveCustomerRequest -import com.ffii.tsms.modules.project.web.models.CustomerResponse +import com.ffii.tsms.modules.data.web.models.CustomerResponse import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController diff --git a/src/main/java/com/ffii/tsms/modules/data/web/models/CustomerResponse.kt b/src/main/java/com/ffii/tsms/modules/data/web/models/CustomerResponse.kt index fee567e..1317cd0 100644 --- a/src/main/java/com/ffii/tsms/modules/data/web/models/CustomerResponse.kt +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/CustomerResponse.kt @@ -1,8 +1,9 @@ -package com.ffii.tsms.modules.project.web.models +package com.ffii.tsms.modules.data.web.models import com.ffii.tsms.modules.data.entity.Customer data class CustomerResponse( val customer: Customer, val subsidiaryIds: List, -) \ No newline at end of file +) + diff --git a/src/main/java/com/ffii/tsms/modules/data/web/models/NewCustomerResponse.kt b/src/main/java/com/ffii/tsms/modules/data/web/models/NewCustomerResponse.kt new file mode 100644 index 0000000..ae36f2b --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/NewCustomerResponse.kt @@ -0,0 +1,8 @@ +package com.ffii.tsms.modules.data.web.models + +import com.ffii.tsms.modules.data.entity.Customer + +data class NewCustomerResponse ( + val customer: Customer, + val message: String, +) \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/web/models/SaveCustomerRequest.kt b/src/main/java/com/ffii/tsms/modules/data/web/models/SaveCustomerRequest.kt index 2b4f4ff..620109c 100644 --- a/src/main/java/com/ffii/tsms/modules/data/web/models/SaveCustomerRequest.kt +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/SaveCustomerRequest.kt @@ -1,5 +1,6 @@ package com.ffii.tsms.modules.project.web.models +import com.ffii.tsms.modules.data.entity.CustomerContact import jakarta.validation.constraints.NotBlank import jakarta.validation.constraints.NotNull @@ -18,5 +19,8 @@ data class SaveCustomerRequest( val deleteSubsidiaryIds: List, val addSubsidiaryIds: List, + val deleteContactIds: List, + val addContacts: List, + val id: Long?, ) \ No newline at end of file