| @@ -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<CustomerContact, Long> { | |||
| List<CustomerContact> findAllByCustomerId(@Param("customerId") Long customerId); | |||
| } | |||
| @@ -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<Customer, Long> { | |||
| Optional<Customer> findByCode(@Param("code") String code); | |||
| } | |||
| @@ -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<CustomerContact> { | |||
| return customerContactRepository.findAllByCustomerId(customerId) | |||
| } | |||
| fun saveContactsByCustomer(saveCustomerId: Long, saveCustomerContact: List<CustomerContact>) { | |||
| val customerContactList = mutableListOf<CustomerContact>() | |||
| 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<Long>) { | |||
| customerContactRepository.deleteAllById(deleteContactIds.filter { it > 0 }) | |||
| } | |||
| } | |||
| @@ -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<Customer> { | |||
| return customerRepository.findAll() | |||
| @@ -17,41 +25,63 @@ class CustomerService(private val customerRepository: CustomerRepository, privat | |||
| fun allCustomerTypes(): List<CustomerType> { | |||
| return customerTypeRepository.findAll() | |||
| } | |||
| fun findCustomer(id: Long): Customer { | |||
| return customerRepository.findById(id).orElseThrow() | |||
| } | |||
| fun saveCustomer(saveCustomer: SaveCustomerRequest): Customer { | |||
| fun findCustomerByCode(code: String): Optional<Customer> { | |||
| 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"); | |||
| } | |||
| } | |||
| @@ -18,12 +18,15 @@ class CustomerSubsidiaryService( | |||
| return customerSubsidiaryRepository.findAll() | |||
| } | |||
| fun findAllByCustomerId(customerId : Long) : List<CustomerSubsidiary> { | |||
| return customerSubsidiaryRepository.findAllByCustomerId(customerId) | |||
| } | |||
| fun findAllSubsidiaryIdsByCustomerId(customerId : Long) : List<Long> { | |||
| val customerSubsidiaryList: List<CustomerSubsidiary> = 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<Long>) { | |||
| val customerSubsidiaryList = mutableListOf<CustomerSubsidiary>() | |||
| 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<CustomerSubsidiary> = findAllByCustomerId(deleteCustomerId) | |||
| customerSubsidiaryList.add(customerSubsidiary) | |||
| if (customerSubsidiaryList.isNotEmpty()) { | |||
| val filteredSubsidiaryIds: List<Long> = | |||
| customerSubsidiaryList.filter { deleteSubsidiaryIds.contains(it.subsidiary.id!!) }.mapNotNull { it.id } | |||
| customerSubsidiaryRepository.deleteAllById(filteredSubsidiaryIds) | |||
| } | |||
| } | |||
| } | |||
| @@ -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) | |||
| } | |||
| } | |||
| @@ -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 | |||
| @@ -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<Long>, | |||
| ) | |||
| ) | |||
| @@ -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, | |||
| ) | |||
| @@ -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<Long>, | |||
| val addSubsidiaryIds: List<Long>, | |||
| val deleteContactIds: List<Long>, | |||
| val addContacts: List<CustomerContact>, | |||
| val id: Long?, | |||
| ) | |||