| @@ -11,5 +11,7 @@ public interface CustomerSubsidiaryRepository extends AbstractRepository<Custome | |||||
| List<CustomerSubsidiary> findAllByCustomerId(@Param("customerId") Long customerId); | List<CustomerSubsidiary> findAllByCustomerId(@Param("customerId") Long customerId); | ||||
| List<CustomerSubsidiary> findAllBySubsidiaryId(@Param("subsidiaryId") Long subsidiaryId); | |||||
| Optional<CustomerSubsidiary> findByCustomerIdAndSubsidiaryId(@Param("customerId") Long customerId, @Param("subsidiaryId") Long subsidiaryId); | Optional<CustomerSubsidiary> findByCustomerIdAndSubsidiaryId(@Param("customerId") Long customerId, @Param("subsidiaryId") Long subsidiaryId); | ||||
| } | } | ||||
| @@ -1,9 +1,7 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | package com.ffii.tsms.modules.data.entity; | ||||
| import com.ffii.core.entity.BaseEntity; | import com.ffii.core.entity.BaseEntity; | ||||
| import jakarta.persistence.Column; | |||||
| import jakarta.persistence.Entity; | |||||
| import jakarta.persistence.Table; | |||||
| import jakarta.persistence.*; | |||||
| import jakarta.validation.constraints.NotNull; | import jakarta.validation.constraints.NotNull; | ||||
| import java.time.LocalTime; | import java.time.LocalTime; | ||||
| @@ -28,6 +26,11 @@ public class Subsidiary extends BaseEntity<Long> { | |||||
| @Column(name = "district", length = 30) | @Column(name = "district", length = 30) | ||||
| private String district; | private String district; | ||||
| @OneToOne | |||||
| @NotNull | |||||
| @JoinColumn(name = "typeId") | |||||
| private SubsidiaryType subsidiaryType; | |||||
| public String getAddress() { | public String getAddress() { | ||||
| return address; | return address; | ||||
| } | } | ||||
| @@ -67,4 +70,12 @@ public class Subsidiary extends BaseEntity<Long> { | |||||
| public void setName(String name) { | public void setName(String name) { | ||||
| this.name = name; | this.name = name; | ||||
| } | } | ||||
| public SubsidiaryType getSubsidiaryType() { | |||||
| return subsidiaryType; | |||||
| } | |||||
| public void setSubsidiaryType(SubsidiaryType subsidiaryType) { | |||||
| this.subsidiaryType = subsidiaryType; | |||||
| } | |||||
| } | } | ||||
| @@ -1,7 +1,10 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | package com.ffii.tsms.modules.data.entity; | ||||
| import com.ffii.core.support.AbstractRepository; | import com.ffii.core.support.AbstractRepository; | ||||
| import org.springframework.data.repository.query.Param; | |||||
| public interface SubsidiaryContactRepository extends AbstractRepository<SubsidiaryContact, Long> { | |||||
| import java.util.List; | |||||
| public interface SubsidiaryContactRepository extends AbstractRepository<SubsidiaryContact, Long> { | |||||
| List<SubsidiaryContact> findAllBySubsidiaryId(@Param("subsidiary") Long subsidiaryId); | |||||
| } | } | ||||
| @@ -1,6 +1,13 @@ | |||||
| package com.ffii.tsms.modules.data.entity; | package com.ffii.tsms.modules.data.entity; | ||||
| import com.ffii.core.support.AbstractRepository; | import com.ffii.core.support.AbstractRepository; | ||||
| import org.springframework.data.repository.query.Param; | |||||
| import java.util.List; | |||||
| import java.util.Optional; | |||||
| public interface SubsidiaryRepository extends AbstractRepository<Subsidiary, Long> { | public interface SubsidiaryRepository extends AbstractRepository<Subsidiary, Long> { | ||||
| List<Subsidiary> findAllByDeletedFalse(); | |||||
| Optional<Subsidiary> findByCode(@Param("code") String code); | |||||
| } | } | ||||
| @@ -3,6 +3,7 @@ package com.ffii.tsms.modules.data.service | |||||
| import com.ffii.tsms.modules.data.entity.CustomerContact | import com.ffii.tsms.modules.data.entity.CustomerContact | ||||
| import com.ffii.tsms.modules.data.entity.CustomerContactRepository | import com.ffii.tsms.modules.data.entity.CustomerContactRepository | ||||
| import com.ffii.tsms.modules.data.entity.CustomerRepository | import com.ffii.tsms.modules.data.entity.CustomerRepository | ||||
| import org.springframework.beans.BeanUtils | |||||
| import org.springframework.stereotype.Service | import org.springframework.stereotype.Service | ||||
| @Service | @Service | ||||
| @@ -31,18 +32,14 @@ class CustomerContactService( | |||||
| val customerContact = | val customerContact = | ||||
| if (customerContactId != null && customerContactId > 0) customerContactRepository.findById( | if (customerContactId != null && customerContactId > 0) customerContactRepository.findById( | ||||
| customerContactId | customerContactId | ||||
| ).orElseThrow().apply { | |||||
| this.customer = customer | |||||
| name = saveCustomerContact[i].name | |||||
| phone = saveCustomerContact[i].phone | |||||
| email = saveCustomerContact[i].email | |||||
| } else CustomerContact().apply { | |||||
| this.customer = customer | |||||
| name = saveCustomerContact[i].name | |||||
| phone = saveCustomerContact[i].phone | |||||
| email = saveCustomerContact[i].email | |||||
| } | |||||
| ).orElseThrow() else CustomerContact() | |||||
| customerContact.apply { | |||||
| this.customer = customer | |||||
| name = saveCustomerContact[i].name | |||||
| phone = saveCustomerContact[i].phone | |||||
| email = saveCustomerContact[i].email | |||||
| } | |||||
| customerContactList.add(customerContact) | customerContactList.add(customerContact) | ||||
| } | } | ||||
| @@ -3,11 +3,10 @@ package com.ffii.tsms.modules.data.service | |||||
| import com.ffii.core.support.AbstractBaseEntityService | import com.ffii.core.support.AbstractBaseEntityService | ||||
| import com.ffii.core.support.JdbcDao | import com.ffii.core.support.JdbcDao | ||||
| import com.ffii.tsms.modules.data.entity.Customer | 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.CustomerType | ||||
| import com.ffii.tsms.modules.data.entity.CustomerRepository | import com.ffii.tsms.modules.data.entity.CustomerRepository | ||||
| import com.ffii.tsms.modules.data.entity.CustomerTypeRepository | import com.ffii.tsms.modules.data.entity.CustomerTypeRepository | ||||
| import com.ffii.tsms.modules.data.web.models.NewCustomerResponse | |||||
| import com.ffii.tsms.modules.data.web.models.SaveCustomerResponse | |||||
| import com.ffii.tsms.modules.project.web.models.SaveCustomerRequest | import com.ffii.tsms.modules.project.web.models.SaveCustomerRequest | ||||
| import org.springframework.beans.BeanUtils | import org.springframework.beans.BeanUtils | ||||
| import org.springframework.stereotype.Service | import org.springframework.stereotype.Service | ||||
| @@ -38,13 +37,13 @@ open class CustomerService( | |||||
| return customerRepository.findByCode(code); | return customerRepository.findByCode(code); | ||||
| } | } | ||||
| open fun saveCustomer(saveCustomer: SaveCustomerRequest): NewCustomerResponse { | |||||
| open fun saveCustomer(saveCustomer: SaveCustomerRequest): SaveCustomerResponse { | |||||
| val duplicateCustomer = findCustomerByCode(saveCustomer.code) | val duplicateCustomer = findCustomerByCode(saveCustomer.code) | ||||
| //check duplicate customer | //check duplicate customer | ||||
| if (duplicateCustomer.isPresent && duplicateCustomer.orElseThrow().id?.equals(saveCustomer.id) == false) { | if (duplicateCustomer.isPresent && duplicateCustomer.orElseThrow().id?.equals(saveCustomer.id) == false) { | ||||
| return NewCustomerResponse( | |||||
| return SaveCustomerResponse( | |||||
| customer = duplicateCustomer.get(), | customer = duplicateCustomer.get(), | ||||
| message = "The customer code has already existed" | message = "The customer code has already existed" | ||||
| ); | ); | ||||
| @@ -85,6 +84,6 @@ open class CustomerService( | |||||
| } | } | ||||
| } | } | ||||
| return NewCustomerResponse(customer = customer, message = "Success"); | |||||
| return SaveCustomerResponse(customer = customer, message = "Success"); | |||||
| } | } | ||||
| } | } | ||||
| @@ -24,6 +24,10 @@ class CustomerSubsidiaryService( | |||||
| return customerSubsidiaryRepository.findAllByCustomerId(customerId) | return customerSubsidiaryRepository.findAllByCustomerId(customerId) | ||||
| } | } | ||||
| fun findAllBySubsidiaryId(subsidiaryId : Long) : List<CustomerSubsidiary> { | |||||
| return customerSubsidiaryRepository.findAllBySubsidiaryId(subsidiaryId) | |||||
| } | |||||
| fun findByCustomerIdAndSubsidiaryId(customerId : Long, subsidiaryId: Long) : CustomerSubsidiary? { | fun findByCustomerIdAndSubsidiaryId(customerId : Long, subsidiaryId: Long) : CustomerSubsidiary? { | ||||
| return customerSubsidiaryRepository.findByCustomerIdAndSubsidiaryId(customerId, subsidiaryId).getOrNull() | return customerSubsidiaryRepository.findByCustomerIdAndSubsidiaryId(customerId, subsidiaryId).getOrNull() | ||||
| } | } | ||||
| @@ -36,6 +40,15 @@ class CustomerSubsidiaryService( | |||||
| } else return emptyList() | } else return emptyList() | ||||
| } | } | ||||
| fun findAllCustomerIdsBySubsidiaryId(subsidiaryId : Long) : List<Long> { | |||||
| val customerSubsidiaryList: List<CustomerSubsidiary> = customerSubsidiaryRepository.findAllBySubsidiaryId(subsidiaryId) | |||||
| if (customerSubsidiaryList.isNotEmpty()) { | |||||
| return customerSubsidiaryList.mapNotNull { it.customer.id } | |||||
| } else return emptyList() | |||||
| } | |||||
| fun saveSubsidiariesByCustomer(saveCustomerId: Long, saveSubsidiaryIds: List<Long>) { | fun saveSubsidiariesByCustomer(saveCustomerId: Long, saveSubsidiaryIds: List<Long>) { | ||||
| val customerSubsidiaryList = mutableListOf<CustomerSubsidiary>() | val customerSubsidiaryList = mutableListOf<CustomerSubsidiary>() | ||||
| @@ -60,6 +73,30 @@ class CustomerSubsidiaryService( | |||||
| customerSubsidiaryRepository.saveAll(customerSubsidiaryList) | customerSubsidiaryRepository.saveAll(customerSubsidiaryList) | ||||
| } | } | ||||
| fun saveCustomersBySubsidiary(saveSubsidiaryId: Long, saveCustomerIds: List<Long>) { | |||||
| val customerSubsidiaryList = mutableListOf<CustomerSubsidiary>() | |||||
| val customerIdsSize = saveCustomerIds.size | |||||
| for (i in 0 until customerIdsSize) { | |||||
| val checkExist = findByCustomerIdAndSubsidiaryId(saveSubsidiaryId, saveCustomerIds[i]) | |||||
| if (checkExist == null) { | |||||
| val customer = customerRepository.findById(saveCustomerIds[i]).orElseThrow() | |||||
| val subsidiary = subsidiaryRepository.findById(saveSubsidiaryId).orElseThrow() | |||||
| val customerSubsidiary = CustomerSubsidiary().apply { | |||||
| this.customer = customer | |||||
| this.subsidiary = subsidiary | |||||
| } | |||||
| customerSubsidiaryList.add(customerSubsidiary) | |||||
| } | |||||
| } | |||||
| customerSubsidiaryRepository.saveAll(customerSubsidiaryList) | |||||
| } | |||||
| fun deleteSubsidiariesByCustomer(deleteCustomerId: Long, deleteSubsidiaryIds: List<Long>) { | fun deleteSubsidiariesByCustomer(deleteCustomerId: Long, deleteSubsidiaryIds: List<Long>) { | ||||
| val customerSubsidiaryList: List<CustomerSubsidiary> = findAllByCustomerId(deleteCustomerId) | val customerSubsidiaryList: List<CustomerSubsidiary> = findAllByCustomerId(deleteCustomerId) | ||||
| @@ -70,4 +107,15 @@ class CustomerSubsidiaryService( | |||||
| customerSubsidiaryRepository.deleteAllById(filteredSubsidiaryIds) | customerSubsidiaryRepository.deleteAllById(filteredSubsidiaryIds) | ||||
| } | } | ||||
| } | } | ||||
| fun deleteCustomersBySubsidiary(deleteSubsidiaryId: Long, deleteCustomerIds: List<Long>) { | |||||
| val customerSubsidiaryList: List<CustomerSubsidiary> = findAllBySubsidiaryId(deleteSubsidiaryId) | |||||
| if (customerSubsidiaryList.isNotEmpty()) { | |||||
| val filteredCustomerIds: List<Long> = | |||||
| customerSubsidiaryList.filter { deleteCustomerIds.contains(it.customer.id!!) }.mapNotNull { it.id } | |||||
| customerSubsidiaryRepository.deleteAllById(filteredCustomerIds) | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,48 @@ | |||||
| 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 com.ffii.tsms.modules.data.entity.SubsidiaryContact | |||||
| import com.ffii.tsms.modules.data.entity.SubsidiaryContactRepository | |||||
| import com.ffii.tsms.modules.data.entity.SubsidiaryRepository | |||||
| import org.springframework.beans.BeanUtils | |||||
| import org.springframework.stereotype.Service | |||||
| @Service | |||||
| class SubsidiaryContactService( | |||||
| private val subsidiaryContactRepository: SubsidiaryContactRepository, | |||||
| private val subsidiaryRepository: SubsidiaryRepository | |||||
| ) { | |||||
| fun findAllBySubsidiaryId(subsidiaryId: Long): List<SubsidiaryContact> { | |||||
| return subsidiaryContactRepository.findAllBySubsidiaryId(subsidiaryId) | |||||
| } | |||||
| fun saveContactsBySubsidiary(saveSubsidiaryId: Long, saveSubsidiaryContact: List<SubsidiaryContact>) { | |||||
| val subsidiaryContactList = mutableListOf<SubsidiaryContact>() | |||||
| val subsidiaryContactSize = saveSubsidiaryContact.size | |||||
| for (i in 0 until subsidiaryContactSize) { | |||||
| val subsidiary = subsidiaryRepository.findById(saveSubsidiaryId).orElseThrow() | |||||
| val subsidiaryContactId = saveSubsidiaryContact[i].id | |||||
| val subsidiaryContact = | |||||
| if (subsidiaryContactId != null && subsidiaryContactId > 0) subsidiaryContactRepository.findById( | |||||
| subsidiaryContactId | |||||
| ).orElseThrow() else SubsidiaryContact() | |||||
| subsidiaryContact.apply { | |||||
| this.subsidiary = subsidiary | |||||
| name = saveSubsidiaryContact[i].name | |||||
| phone = saveSubsidiaryContact[i].phone | |||||
| email = saveSubsidiaryContact[i].email | |||||
| } | |||||
| subsidiaryContactList.add(subsidiaryContact) | |||||
| } | |||||
| subsidiaryContactRepository.saveAll(subsidiaryContactList) | |||||
| } | |||||
| fun deleteContactsBySubsidiary(deleteContactIds: List<Long>) { | |||||
| subsidiaryContactRepository.deleteAllById(deleteContactIds.filter { it > 0 }) | |||||
| } | |||||
| } | |||||
| @@ -1,30 +1,90 @@ | |||||
| package com.ffii.tsms.modules.project.service | package com.ffii.tsms.modules.project.service | ||||
| import com.ffii.tsms.modules.data.entity.SubsidiaryRepository | |||||
| import com.ffii.core.support.AbstractBaseEntityService | |||||
| import com.ffii.core.support.JdbcDao | |||||
| import com.ffii.tsms.modules.data.entity.Subsidiary | import com.ffii.tsms.modules.data.entity.Subsidiary | ||||
| import com.ffii.tsms.modules.data.service.CustomerService | |||||
| import com.ffii.tsms.modules.project.web.models.NewSubsidiaryRequest | |||||
| import com.ffii.tsms.modules.data.entity.SubsidiaryRepository | |||||
| import com.ffii.tsms.modules.data.entity.SubsidiaryType | |||||
| import com.ffii.tsms.modules.data.entity.SubsidiaryTypeRepository | |||||
| import com.ffii.tsms.modules.data.service.CustomerSubsidiaryService | |||||
| import com.ffii.tsms.modules.data.service.SubsidiaryContactService | |||||
| import com.ffii.tsms.modules.data.web.models.SaveSubsidiaryResponse | |||||
| import com.ffii.tsms.modules.project.web.models.SaveSubsidiaryRequest | |||||
| import org.springframework.beans.BeanUtils | |||||
| import org.springframework.stereotype.Service | import org.springframework.stereotype.Service | ||||
| import java.util.Optional | |||||
| @Service | @Service | ||||
| class SubsidiaryService( | |||||
| private val subsidiaryRepository: SubsidiaryRepository | |||||
| ) { | |||||
| fun allSubsidiaries(): List<Subsidiary> { | |||||
| return subsidiaryRepository.findAll() | |||||
| open class SubsidiaryService( | |||||
| private val subsidiaryRepository: SubsidiaryRepository, | |||||
| private val jdbcDao: JdbcDao, | |||||
| private val customerSubsidiaryService: CustomerSubsidiaryService, | |||||
| private val subsidiaryTypeRepository: SubsidiaryTypeRepository, | |||||
| private val subsidiaryContactService: SubsidiaryContactService, | |||||
| ) : AbstractBaseEntityService<Subsidiary, Long, SubsidiaryRepository>(jdbcDao, subsidiaryRepository) { | |||||
| open fun allSubsidiaries(): List<Subsidiary> { | |||||
| return subsidiaryRepository.findAllByDeletedFalse() | |||||
| } | |||||
| open fun allSubsidiaryTypes(): List<SubsidiaryType> { | |||||
| return subsidiaryTypeRepository.findAll() | |||||
| } | |||||
| open fun findSubsidiary(id: Long): Subsidiary { | |||||
| return subsidiaryRepository.findById(id).orElseThrow() | |||||
| } | } | ||||
| fun saveSubsidiary(request: NewSubsidiaryRequest): Subsidiary { | |||||
| open fun findSubsidiaryByCode(code: String): Optional<Subsidiary> { | |||||
| return subsidiaryRepository.findByCode(code); | |||||
| } | |||||
| open fun saveSubsidiary(saveSubsidiary: SaveSubsidiaryRequest): SaveSubsidiaryResponse { | |||||
| val duplicateSubsidiary = findSubsidiaryByCode(saveSubsidiary.code) | |||||
| //check duplicate customer | |||||
| if (duplicateSubsidiary.isPresent && duplicateSubsidiary.orElseThrow().id?.equals(saveSubsidiary.id) == false) { | |||||
| logger.info(duplicateSubsidiary.get()) | |||||
| return SaveSubsidiaryResponse( | |||||
| subsidiary = duplicateSubsidiary.get(), | |||||
| message = "The subsidiary code has already existed" | |||||
| ); | |||||
| } | |||||
| val subsidiaryType = subsidiaryTypeRepository.findById(saveSubsidiary.typeId).orElseThrow() | |||||
| val instance = if (saveSubsidiary.id != null && saveSubsidiary.id > 0) subsidiaryRepository.findById(saveSubsidiary.id) | |||||
| .orElseThrow() else Subsidiary(); | |||||
| BeanUtils.copyProperties(saveSubsidiary, instance) | |||||
| instance.apply { | |||||
| this.subsidiaryType = subsidiaryType | |||||
| } | |||||
| val subsidiary = | |||||
| subsidiaryRepository.saveAndFlush(instance) | |||||
| val subsidiaryId = subsidiary.id | |||||
| if (subsidiaryId != null && subsidiaryId > 0) { | |||||
| if (saveSubsidiary.deleteCustomerIds.isNotEmpty()) { | |||||
| customerSubsidiaryService.deleteCustomersBySubsidiary(subsidiaryId, saveSubsidiary.deleteCustomerIds) | |||||
| } | |||||
| if (saveSubsidiary.addCustomerIds.isNotEmpty()) { | |||||
| customerSubsidiaryService.saveCustomersBySubsidiary(subsidiaryId, saveSubsidiary.addCustomerIds) | |||||
| } | |||||
| // TODO: Add tasks, milestones, allocated | |||||
| val subsidary = Subsidiary().apply { | |||||
| code = request.code | |||||
| name = request.name | |||||
| brNo = request.brNo | |||||
| address = request.address | |||||
| district = request.district | |||||
| if (saveSubsidiary.deleteContactIds.isNotEmpty()) { | |||||
| subsidiaryContactService.deleteContactsBySubsidiary(saveSubsidiary.deleteContactIds) | |||||
| } | |||||
| if (saveSubsidiary.addContacts.isNotEmpty()) { | |||||
| subsidiaryContactService.saveContactsBySubsidiary(subsidiaryId, saveSubsidiary.addContacts) | |||||
| } | |||||
| } | } | ||||
| return subsidiaryRepository.save(subsidary) | |||||
| return SaveSubsidiaryResponse(subsidiary = subsidiary, message = "Success"); | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,12 +1,12 @@ | |||||
| package com.ffii.tsms.modules.data.web | package com.ffii.tsms.modules.data.web | ||||
| import com.ffii.core.support.AbstractBaseEntityService | |||||
| import com.ffii.core.support.JdbcDao | |||||
| import com.ffii.tsms.modules.data.entity.* | |||||
| import com.ffii.tsms.modules.data.entity.Customer | |||||
| import com.ffii.tsms.modules.data.entity.CustomerType | |||||
| import com.ffii.tsms.modules.data.service.CustomerContactService | |||||
| import com.ffii.tsms.modules.data.service.CustomerService | import com.ffii.tsms.modules.data.service.CustomerService | ||||
| import com.ffii.tsms.modules.data.service.CustomerSubsidiaryService | 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.CustomerResponse | ||||
| import com.ffii.tsms.modules.data.web.models.NewCustomerResponse | |||||
| import com.ffii.tsms.modules.data.web.models.SaveCustomerResponse | |||||
| import com.ffii.tsms.modules.project.web.models.SaveCustomerRequest | import com.ffii.tsms.modules.project.web.models.SaveCustomerRequest | ||||
| import org.springframework.web.bind.annotation.GetMapping | import org.springframework.web.bind.annotation.GetMapping | ||||
| import org.springframework.web.bind.annotation.RequestMapping | import org.springframework.web.bind.annotation.RequestMapping | ||||
| @@ -22,7 +22,7 @@ import org.springframework.web.bind.annotation.ResponseStatus | |||||
| @RestController | @RestController | ||||
| @RequestMapping("/customer") | @RequestMapping("/customer") | ||||
| class CustomerController(private val customerService: CustomerService, private val customerSubsidiaryService: CustomerSubsidiaryService, | class CustomerController(private val customerService: CustomerService, private val customerSubsidiaryService: CustomerSubsidiaryService, | ||||
| private val customerContactRepository: CustomerContactRepository | |||||
| private val customerContactService: CustomerContactService | |||||
| ) { | ) { | ||||
| @GetMapping | @GetMapping | ||||
| fun allCustomers(): List<Customer> { | fun allCustomers(): List<Customer> { | ||||
| @@ -45,13 +45,13 @@ class CustomerController(private val customerService: CustomerService, private v | |||||
| val customer = customerService.findCustomer(id) | val customer = customerService.findCustomer(id) | ||||
| val subsidiaryIds = customerSubsidiaryService.findAllSubsidiaryIdsByCustomerId(id) | val subsidiaryIds = customerSubsidiaryService.findAllSubsidiaryIdsByCustomerId(id) | ||||
| val contacts = customerContactRepository.findAllByCustomerId(id) | |||||
| val contacts = customerContactService.findAllByCustomerId(id) | |||||
| return CustomerResponse(customer, subsidiaryIds, contacts) | return CustomerResponse(customer, subsidiaryIds, contacts) | ||||
| } | } | ||||
| @PostMapping("/save") | @PostMapping("/save") | ||||
| fun saveCustomer(@Valid @RequestBody saveCustomer: SaveCustomerRequest): NewCustomerResponse { | |||||
| fun saveCustomer(@Valid @RequestBody saveCustomer: SaveCustomerRequest): SaveCustomerResponse { | |||||
| return customerService.saveCustomer(saveCustomer) | return customerService.saveCustomer(saveCustomer) | ||||
| } | } | ||||
| } | } | ||||
| @@ -28,4 +28,9 @@ class CustomerSubsidiaryController(private val customerSubsidiaryService: Custom | |||||
| fun findAllSubsidiaryIdsByCustomerId(@PathVariable customerId: Long): List<Long> { | fun findAllSubsidiaryIdsByCustomerId(@PathVariable customerId: Long): List<Long> { | ||||
| return customerSubsidiaryService.findAllSubsidiaryIdsByCustomerId(customerId) | return customerSubsidiaryService.findAllSubsidiaryIdsByCustomerId(customerId) | ||||
| } | } | ||||
| @GetMapping("/customers/{subsidiaryId}") | |||||
| fun findAllCustomerIdsBySubsidiaryId(@PathVariable subsidiaryId: Long): List<Long> { | |||||
| return customerSubsidiaryService.findAllCustomerIdsBySubsidiaryId(subsidiaryId) | |||||
| } | |||||
| } | } | ||||
| @@ -1,27 +1,59 @@ | |||||
| package com.ffii.tsms.modules.data.web | package com.ffii.tsms.modules.data.web | ||||
| import com.ffii.tsms.modules.data.entity.CustomerType | |||||
| import com.ffii.tsms.modules.data.entity.Staff | import com.ffii.tsms.modules.data.entity.Staff | ||||
| import com.ffii.tsms.modules.data.entity.Subsidiary | import com.ffii.tsms.modules.data.entity.Subsidiary | ||||
| import com.ffii.tsms.modules.data.entity.SubsidiaryType | |||||
| import com.ffii.tsms.modules.data.service.CustomerSubsidiaryService | |||||
| import com.ffii.tsms.modules.data.service.StaffsService | import com.ffii.tsms.modules.data.service.StaffsService | ||||
| import com.ffii.tsms.modules.data.service.SubsidiaryContactService | |||||
| import com.ffii.tsms.modules.data.web.models.CustomerResponse | |||||
| import com.ffii.tsms.modules.data.web.models.SaveSubsidiaryResponse | |||||
| import com.ffii.tsms.modules.data.web.models.SubsidiaryResponse | |||||
| import com.ffii.tsms.modules.project.service.SubsidiaryService | import com.ffii.tsms.modules.project.service.SubsidiaryService | ||||
| import com.ffii.tsms.modules.project.web.models.NewSubsidiaryRequest | |||||
| import com.ffii.tsms.modules.project.web.models.SaveSubsidiaryRequest | |||||
| import jakarta.validation.Valid | |||||
| import org.springframework.http.HttpStatus | |||||
| import org.springframework.web.bind.annotation.DeleteMapping | |||||
| import org.springframework.web.bind.annotation.GetMapping | import org.springframework.web.bind.annotation.GetMapping | ||||
| import org.springframework.web.bind.annotation.PathVariable | |||||
| import org.springframework.web.bind.annotation.PostMapping | |||||
| import org.springframework.web.bind.annotation.RequestBody | |||||
| import org.springframework.web.bind.annotation.RequestMapping | import org.springframework.web.bind.annotation.RequestMapping | ||||
| import org.springframework.web.bind.annotation.ResponseStatus | |||||
| import org.springframework.web.bind.annotation.RestController | import org.springframework.web.bind.annotation.RestController | ||||
| import org.springframework.web.bind.annotation.RequestBody | |||||
| import org.springframework.web.bind.annotation.PostMapping | |||||
| import jakarta.validation.Valid | |||||
| @RestController | @RestController | ||||
| @RequestMapping("/subsidiary") | @RequestMapping("/subsidiary") | ||||
| class SubsidiaryController(private val subsidiaryService: SubsidiaryService) { | |||||
| class SubsidiaryController(private val subsidiaryService: SubsidiaryService, private val customerSubsidiaryService: CustomerSubsidiaryService, private val subsidiaryContactService: SubsidiaryContactService) { | |||||
| @GetMapping | @GetMapping | ||||
| fun allSubsidiaries(): List<Subsidiary> { | fun allSubsidiaries(): List<Subsidiary> { | ||||
| return subsidiaryService.allSubsidiaries() | return subsidiaryService.allSubsidiaries() | ||||
| } | } | ||||
| @PostMapping("/new") | |||||
| fun saveSubsidiary(@Valid @RequestBody newSubsidary: NewSubsidiaryRequest): Subsidiary { | |||||
| return subsidiaryService.saveSubsidiary(newSubsidary) | |||||
| @GetMapping("/types") | |||||
| fun allCustomerTypes(): List<SubsidiaryType> { | |||||
| return subsidiaryService.allSubsidiaryTypes() | |||||
| } | |||||
| @DeleteMapping("/{id}") | |||||
| @ResponseStatus(HttpStatus.NO_CONTENT) | |||||
| fun deleteCustomer(@PathVariable id: Long) { | |||||
| subsidiaryService.markDelete(id) | |||||
| } | |||||
| @GetMapping("/{id}") | |||||
| fun findSubsidiary(@PathVariable id: Long): SubsidiaryResponse { | |||||
| val subsidiary = subsidiaryService.findSubsidiary(id) | |||||
| val customerIds = customerSubsidiaryService.findAllCustomerIdsBySubsidiaryId(id) | |||||
| val contacts = subsidiaryContactService.findAllBySubsidiaryId(id) | |||||
| return SubsidiaryResponse(subsidiary, customerIds, contacts) | |||||
| } | |||||
| @PostMapping("/save") | |||||
| fun saveSubsidiary(@Valid @RequestBody saveSubsidiary: SaveSubsidiaryRequest): SaveSubsidiaryResponse { | |||||
| return subsidiaryService.saveSubsidiary(saveSubsidiary) | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,19 +0,0 @@ | |||||
| package com.ffii.tsms.modules.project.web.models | |||||
| import jakarta.validation.constraints.NotBlank | |||||
| data class NewSubsidiaryRequest( | |||||
| @field:NotBlank(message = "subsidary code cannot be empty") | |||||
| val code: String, | |||||
| @field:NotBlank(message = "subsidary name cannot be empty") | |||||
| val name: String, | |||||
| val brNo: String, | |||||
| val contactName: String, | |||||
| val phone: String, | |||||
| val address: String, | |||||
| val district: String, | |||||
| val email: String, | |||||
| val allocatedCustomerIds: List<Long>, | |||||
| ) | |||||
| @@ -9,7 +9,7 @@ data class SaveCustomerRequest( | |||||
| val code: String, | val code: String, | ||||
| @field:NotBlank(message = "customer name cannot be empty") | @field:NotBlank(message = "customer name cannot be empty") | ||||
| val name: String, | val name: String, | ||||
| @field:NotNull(message = "customer name cannot be empty") | |||||
| @field:NotNull(message = "customer type cannot be empty") | |||||
| val typeId: Long, | val typeId: Long, | ||||
| val brNo: String?, | val brNo: String?, | ||||
| @@ -2,7 +2,7 @@ package com.ffii.tsms.modules.data.web.models | |||||
| import com.ffii.tsms.modules.data.entity.Customer | import com.ffii.tsms.modules.data.entity.Customer | ||||
| data class NewCustomerResponse ( | |||||
| data class SaveCustomerResponse ( | |||||
| val customer: Customer, | val customer: Customer, | ||||
| val message: String, | val message: String, | ||||
| ) | ) | ||||
| @@ -0,0 +1,27 @@ | |||||
| package com.ffii.tsms.modules.project.web.models | |||||
| import com.ffii.tsms.modules.data.entity.CustomerContact | |||||
| import com.ffii.tsms.modules.data.entity.SubsidiaryContact | |||||
| import jakarta.validation.constraints.NotBlank | |||||
| import jakarta.validation.constraints.NotNull | |||||
| data class SaveSubsidiaryRequest( | |||||
| @field:NotBlank(message = "subsidiary code cannot be empty") | |||||
| val code: String, | |||||
| @field:NotBlank(message = "subsidiary name cannot be empty") | |||||
| val name: String, | |||||
| @field:NotNull(message = "subsidiary type cannot be empty") | |||||
| val typeId: Long, | |||||
| val brNo: String?, | |||||
| val address: String?, | |||||
| val district: String?, | |||||
| val deleteCustomerIds: List<Long>, | |||||
| val addCustomerIds: List<Long>, | |||||
| val deleteContactIds: List<Long>, | |||||
| val addContacts: List<SubsidiaryContact>, | |||||
| val id: Long?, | |||||
| ) | |||||
| @@ -0,0 +1,8 @@ | |||||
| package com.ffii.tsms.modules.data.web.models | |||||
| import com.ffii.tsms.modules.data.entity.Subsidiary | |||||
| data class SaveSubsidiaryResponse ( | |||||
| val subsidiary: Subsidiary, | |||||
| val message: String, | |||||
| ) | |||||
| @@ -0,0 +1,13 @@ | |||||
| package com.ffii.tsms.modules.data.web.models | |||||
| import com.ffii.tsms.modules.data.entity.Customer | |||||
| import com.ffii.tsms.modules.data.entity.CustomerContact | |||||
| import com.ffii.tsms.modules.data.entity.Subsidiary | |||||
| import com.ffii.tsms.modules.data.entity.SubsidiaryContact | |||||
| data class SubsidiaryResponse( | |||||
| val subsidiary: Subsidiary, | |||||
| val customerIds: List<Long>, | |||||
| val contacts: List<SubsidiaryContact>, | |||||
| ) | |||||