From f85d458a0cf29e9da6685492b93cc49845cdcf59 Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Tue, 16 Apr 2024 13:55:27 +0800 Subject: [PATCH] update customer master & add subsidiary master --- .../entity/CustomerSubsidiaryRepository.java | 2 + .../tsms/modules/data/entity/Subsidiary.java | 17 +++- .../entity/SubsidiaryContactRepository.java | 5 +- .../data/entity/SubsidiaryRepository.java | 7 ++ .../data/service/CustomerContactService.kt | 21 ++--- .../modules/data/service/CustomerService.kt | 9 +- .../data/service/CustomerSubsidiaryService.kt | 48 ++++++++++ .../data/service/SubsidiaryContactService.kt | 48 ++++++++++ .../modules/data/service/SubsidiaryService.kt | 94 +++++++++++++++---- .../modules/data/web/CustomerController.kt | 14 +-- .../data/web/CustomerSubsidiaryController.kt | 5 + .../modules/data/web/SubsidiaryController.kt | 48 ++++++++-- .../data/web/models/NewSubsidiaryRequest.kt | 19 ---- .../data/web/models/SaveCustomerRequest.kt | 2 +- ...merResponse.kt => SaveCustomerResponse.kt} | 2 +- .../data/web/models/SaveSubsidiaryRequest.kt | 27 ++++++ .../data/web/models/SaveSubsidiaryResponse.kt | 8 ++ .../data/web/models/SubsidiaryResponse.kt | 13 +++ 18 files changed, 315 insertions(+), 74 deletions(-) create mode 100644 src/main/java/com/ffii/tsms/modules/data/service/SubsidiaryContactService.kt delete mode 100644 src/main/java/com/ffii/tsms/modules/data/web/models/NewSubsidiaryRequest.kt rename src/main/java/com/ffii/tsms/modules/data/web/models/{NewCustomerResponse.kt => SaveCustomerResponse.kt} (81%) create mode 100644 src/main/java/com/ffii/tsms/modules/data/web/models/SaveSubsidiaryRequest.kt create mode 100644 src/main/java/com/ffii/tsms/modules/data/web/models/SaveSubsidiaryResponse.kt create mode 100644 src/main/java/com/ffii/tsms/modules/data/web/models/SubsidiaryResponse.kt diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/CustomerSubsidiaryRepository.java b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerSubsidiaryRepository.java index 7b6ce3e..c2a33a8 100644 --- a/src/main/java/com/ffii/tsms/modules/data/entity/CustomerSubsidiaryRepository.java +++ b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerSubsidiaryRepository.java @@ -11,5 +11,7 @@ public interface CustomerSubsidiaryRepository extends AbstractRepository findAllByCustomerId(@Param("customerId") Long customerId); + List findAllBySubsidiaryId(@Param("subsidiaryId") Long subsidiaryId); + Optional findByCustomerIdAndSubsidiaryId(@Param("customerId") Long customerId, @Param("subsidiaryId") Long subsidiaryId); } diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/Subsidiary.java b/src/main/java/com/ffii/tsms/modules/data/entity/Subsidiary.java index 820778b..ed802df 100644 --- a/src/main/java/com/ffii/tsms/modules/data/entity/Subsidiary.java +++ b/src/main/java/com/ffii/tsms/modules/data/entity/Subsidiary.java @@ -1,9 +1,7 @@ package com.ffii.tsms.modules.data.entity; 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 java.time.LocalTime; @@ -28,6 +26,11 @@ public class Subsidiary extends BaseEntity { @Column(name = "district", length = 30) private String district; + @OneToOne + @NotNull + @JoinColumn(name = "typeId") + private SubsidiaryType subsidiaryType; + public String getAddress() { return address; } @@ -67,4 +70,12 @@ public class Subsidiary extends BaseEntity { public void setName(String name) { this.name = name; } + + public SubsidiaryType getSubsidiaryType() { + return subsidiaryType; + } + + public void setSubsidiaryType(SubsidiaryType subsidiaryType) { + this.subsidiaryType = subsidiaryType; + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryContactRepository.java b/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryContactRepository.java index 83dc804..b073c57 100644 --- a/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryContactRepository.java +++ b/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryContactRepository.java @@ -1,7 +1,10 @@ package com.ffii.tsms.modules.data.entity; import com.ffii.core.support.AbstractRepository; +import org.springframework.data.repository.query.Param; -public interface SubsidiaryContactRepository extends AbstractRepository { +import java.util.List; +public interface SubsidiaryContactRepository extends AbstractRepository { + List findAllBySubsidiaryId(@Param("subsidiary") Long subsidiaryId); } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryRepository.java b/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryRepository.java index faaec53..0742bcf 100644 --- a/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryRepository.java +++ b/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryRepository.java @@ -1,6 +1,13 @@ package com.ffii.tsms.modules.data.entity; 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 { + List findAllByDeletedFalse(); + + 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 index 7fec504..350f798 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/CustomerContactService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/CustomerContactService.kt @@ -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.CustomerContactRepository import com.ffii.tsms.modules.data.entity.CustomerRepository +import org.springframework.beans.BeanUtils import org.springframework.stereotype.Service @Service @@ -31,18 +32,14 @@ class CustomerContactService( val customerContact = if (customerContactId != null && customerContactId > 0) customerContactRepository.findById( 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) } 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 6ee99c1..aeca073 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 @@ -3,11 +3,10 @@ package com.ffii.tsms.modules.data.service import com.ffii.core.support.AbstractBaseEntityService import com.ffii.core.support.JdbcDao 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.data.web.models.SaveCustomerResponse import com.ffii.tsms.modules.project.web.models.SaveCustomerRequest import org.springframework.beans.BeanUtils import org.springframework.stereotype.Service @@ -38,13 +37,13 @@ open class CustomerService( return customerRepository.findByCode(code); } - open fun saveCustomer(saveCustomer: SaveCustomerRequest): NewCustomerResponse { + open fun saveCustomer(saveCustomer: SaveCustomerRequest): SaveCustomerResponse { val duplicateCustomer = findCustomerByCode(saveCustomer.code) //check duplicate customer if (duplicateCustomer.isPresent && duplicateCustomer.orElseThrow().id?.equals(saveCustomer.id) == false) { - return NewCustomerResponse( + return SaveCustomerResponse( customer = duplicateCustomer.get(), 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"); } } 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 564554e..9309c46 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 @@ -24,6 +24,10 @@ class CustomerSubsidiaryService( return customerSubsidiaryRepository.findAllByCustomerId(customerId) } + fun findAllBySubsidiaryId(subsidiaryId : Long) : List { + return customerSubsidiaryRepository.findAllBySubsidiaryId(subsidiaryId) + } + fun findByCustomerIdAndSubsidiaryId(customerId : Long, subsidiaryId: Long) : CustomerSubsidiary? { return customerSubsidiaryRepository.findByCustomerIdAndSubsidiaryId(customerId, subsidiaryId).getOrNull() } @@ -36,6 +40,15 @@ class CustomerSubsidiaryService( } else return emptyList() } + fun findAllCustomerIdsBySubsidiaryId(subsidiaryId : Long) : List { + + val customerSubsidiaryList: List = customerSubsidiaryRepository.findAllBySubsidiaryId(subsidiaryId) + + if (customerSubsidiaryList.isNotEmpty()) { + return customerSubsidiaryList.mapNotNull { it.customer.id } + } else return emptyList() + } + fun saveSubsidiariesByCustomer(saveCustomerId: Long, saveSubsidiaryIds: List) { val customerSubsidiaryList = mutableListOf() @@ -60,6 +73,30 @@ class CustomerSubsidiaryService( customerSubsidiaryRepository.saveAll(customerSubsidiaryList) } + fun saveCustomersBySubsidiary(saveSubsidiaryId: Long, saveCustomerIds: List) { + + val customerSubsidiaryList = mutableListOf() + + 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) { val customerSubsidiaryList: List = findAllByCustomerId(deleteCustomerId) @@ -70,4 +107,15 @@ class CustomerSubsidiaryService( customerSubsidiaryRepository.deleteAllById(filteredSubsidiaryIds) } } + + fun deleteCustomersBySubsidiary(deleteSubsidiaryId: Long, deleteCustomerIds: List) { + + val customerSubsidiaryList: List = findAllBySubsidiaryId(deleteSubsidiaryId) + + if (customerSubsidiaryList.isNotEmpty()) { + val filteredCustomerIds: List = + customerSubsidiaryList.filter { deleteCustomerIds.contains(it.customer.id!!) }.mapNotNull { it.id } + customerSubsidiaryRepository.deleteAllById(filteredCustomerIds) + } + } } diff --git a/src/main/java/com/ffii/tsms/modules/data/service/SubsidiaryContactService.kt b/src/main/java/com/ffii/tsms/modules/data/service/SubsidiaryContactService.kt new file mode 100644 index 0000000..22b18c6 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/service/SubsidiaryContactService.kt @@ -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 { + return subsidiaryContactRepository.findAllBySubsidiaryId(subsidiaryId) + } + + fun saveContactsBySubsidiary(saveSubsidiaryId: Long, saveSubsidiaryContact: List) { + + val subsidiaryContactList = mutableListOf() + 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) { + subsidiaryContactRepository.deleteAllById(deleteContactIds.filter { it > 0 }) + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/service/SubsidiaryService.kt b/src/main/java/com/ffii/tsms/modules/data/service/SubsidiaryService.kt index 4baa2d2..32ae5df 100644 --- a/src/main/java/com/ffii/tsms/modules/data/service/SubsidiaryService.kt +++ b/src/main/java/com/ffii/tsms/modules/data/service/SubsidiaryService.kt @@ -1,30 +1,90 @@ 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.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 java.util.Optional @Service -class SubsidiaryService( - private val subsidiaryRepository: SubsidiaryRepository -) { - fun allSubsidiaries(): List { - 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(jdbcDao, subsidiaryRepository) { + open fun allSubsidiaries(): List { + return subsidiaryRepository.findAllByDeletedFalse() + } + + open fun allSubsidiaryTypes(): List { + 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 { + 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"); } } \ No newline at end of file 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 ac810dd..dd5a592 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 @@ -1,12 +1,12 @@ 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.CustomerSubsidiaryService 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 org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping @@ -22,7 +22,7 @@ import org.springframework.web.bind.annotation.ResponseStatus @RestController @RequestMapping("/customer") class CustomerController(private val customerService: CustomerService, private val customerSubsidiaryService: CustomerSubsidiaryService, - private val customerContactRepository: CustomerContactRepository + private val customerContactService: CustomerContactService ) { @GetMapping fun allCustomers(): List { @@ -45,13 +45,13 @@ class CustomerController(private val customerService: CustomerService, private v val customer = customerService.findCustomer(id) val subsidiaryIds = customerSubsidiaryService.findAllSubsidiaryIdsByCustomerId(id) - val contacts = customerContactRepository.findAllByCustomerId(id) + val contacts = customerContactService.findAllByCustomerId(id) return CustomerResponse(customer, subsidiaryIds, contacts) } @PostMapping("/save") - fun saveCustomer(@Valid @RequestBody saveCustomer: SaveCustomerRequest): NewCustomerResponse { + fun saveCustomer(@Valid @RequestBody saveCustomer: SaveCustomerRequest): SaveCustomerResponse { 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 00a1631..f518cab 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 @@ -28,4 +28,9 @@ class CustomerSubsidiaryController(private val customerSubsidiaryService: Custom fun findAllSubsidiaryIdsByCustomerId(@PathVariable customerId: Long): List { return customerSubsidiaryService.findAllSubsidiaryIdsByCustomerId(customerId) } + + @GetMapping("/customers/{subsidiaryId}") + fun findAllCustomerIdsBySubsidiaryId(@PathVariable subsidiaryId: Long): List { + return customerSubsidiaryService.findAllCustomerIdsBySubsidiaryId(subsidiaryId) + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/web/SubsidiaryController.kt b/src/main/java/com/ffii/tsms/modules/data/web/SubsidiaryController.kt index 50a6f4e..4f75799 100644 --- a/src/main/java/com/ffii/tsms/modules/data/web/SubsidiaryController.kt +++ b/src/main/java/com/ffii/tsms/modules/data/web/SubsidiaryController.kt @@ -1,27 +1,59 @@ 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.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.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.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.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.ResponseStatus 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 @RequestMapping("/subsidiary") -class SubsidiaryController(private val subsidiaryService: SubsidiaryService) { +class SubsidiaryController(private val subsidiaryService: SubsidiaryService, private val customerSubsidiaryService: CustomerSubsidiaryService, private val subsidiaryContactService: SubsidiaryContactService) { @GetMapping fun allSubsidiaries(): List { return subsidiaryService.allSubsidiaries() } - @PostMapping("/new") - fun saveSubsidiary(@Valid @RequestBody newSubsidary: NewSubsidiaryRequest): Subsidiary { - return subsidiaryService.saveSubsidiary(newSubsidary) + @GetMapping("/types") + fun allCustomerTypes(): List { + 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) } } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/web/models/NewSubsidiaryRequest.kt b/src/main/java/com/ffii/tsms/modules/data/web/models/NewSubsidiaryRequest.kt deleted file mode 100644 index e01db39..0000000 --- a/src/main/java/com/ffii/tsms/modules/data/web/models/NewSubsidiaryRequest.kt +++ /dev/null @@ -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, -) \ 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 620109c..2f1fc4c 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 @@ -9,7 +9,7 @@ data class SaveCustomerRequest( val code: String, @field:NotBlank(message = "customer name cannot be empty") val name: String, - @field:NotNull(message = "customer name cannot be empty") + @field:NotNull(message = "customer type cannot be empty") val typeId: Long, val brNo: String?, 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/SaveCustomerResponse.kt similarity index 81% rename from src/main/java/com/ffii/tsms/modules/data/web/models/NewCustomerResponse.kt rename to src/main/java/com/ffii/tsms/modules/data/web/models/SaveCustomerResponse.kt index ae36f2b..de42ada 100644 --- a/src/main/java/com/ffii/tsms/modules/data/web/models/NewCustomerResponse.kt +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/SaveCustomerResponse.kt @@ -2,7 +2,7 @@ package com.ffii.tsms.modules.data.web.models import com.ffii.tsms.modules.data.entity.Customer -data class NewCustomerResponse ( +data class SaveCustomerResponse ( 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/SaveSubsidiaryRequest.kt b/src/main/java/com/ffii/tsms/modules/data/web/models/SaveSubsidiaryRequest.kt new file mode 100644 index 0000000..1555d55 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/SaveSubsidiaryRequest.kt @@ -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, + val addCustomerIds: List, + + val deleteContactIds: List, + val addContacts: List, + + val id: Long?, +) \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/web/models/SaveSubsidiaryResponse.kt b/src/main/java/com/ffii/tsms/modules/data/web/models/SaveSubsidiaryResponse.kt new file mode 100644 index 0000000..4eeb714 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/SaveSubsidiaryResponse.kt @@ -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, +) \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/web/models/SubsidiaryResponse.kt b/src/main/java/com/ffii/tsms/modules/data/web/models/SubsidiaryResponse.kt new file mode 100644 index 0000000..d09da8d --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/SubsidiaryResponse.kt @@ -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, + val contacts: List, +) +