From edd4a1d0a69f0f2fe674dc3b911c20865fed704f Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Thu, 28 Mar 2024 11:57:32 +0800 Subject: [PATCH] update customer & susidiary (add new table - type & contact; remove columns - contactName, phone, email; add columns - typeId) --- .../tsms/modules/data/entity/Customer.java | 48 +++++-------- .../modules/data/entity/CustomerContact.java | 62 +++++++++++++++++ .../entity/CustomerContactRepository.java | 7 ++ .../data/entity/CustomerRepository.java | 3 + .../data/entity/CustomerSubsidiary.java | 2 +- .../entity/CustomerSubsidiaryRepository.java | 14 ++++ .../modules/data/entity/CustomerType.java | 23 +++++++ .../data/entity/CustomerTypeRepository.java | 7 ++ .../tsms/modules/data/entity/Subsidiary.java | 33 --------- .../data/entity/SubsidiaryContact.java | 62 +++++++++++++++++ .../entity/SubsidiaryContactRepository.java | 7 ++ .../modules/data/entity/SubsidiaryType.java | 23 +++++++ .../data/entity/SubsidiaryTypeRepository.java | 7 ++ .../modules/data/service/CustomerService.kt | 56 +++++++++++++--- .../data/service/CustomerSubsidiaryService.kt | 67 +++++++++++++++++++ .../modules/data/service/SubsidiaryService.kt | 30 +++++++++ .../modules/data/web/CustomerController.kt | 43 ++++++++++++ .../data/web/CustomerSubsidiaryController.kt | 31 +++++++++ .../modules/data/web/SubsidiaryController.kt | 27 ++++++++ .../data/web/models/CustomerResponse.kt | 8 +++ .../data/web/models/NewSubsidiaryRequest.kt | 19 ++++++ .../data/web/models/SaveCustomerRequest.kt | 19 ++++++ .../project/service/ProjectsService.kt | 47 +++++++++---- .../20240327_01_cyril/01_update_customer.sql | 45 +++++++++++++ .../02_update_subsidiary.sql | 45 +++++++++++++ 25 files changed, 643 insertions(+), 92 deletions(-) create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/CustomerContact.java create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/CustomerContactRepository.java create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/CustomerSubsidiaryRepository.java create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/CustomerType.java create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/CustomerTypeRepository.java create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryContact.java create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryContactRepository.java create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryType.java create mode 100644 src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryTypeRepository.java create mode 100644 src/main/java/com/ffii/tsms/modules/data/service/CustomerSubsidiaryService.kt create mode 100644 src/main/java/com/ffii/tsms/modules/data/service/SubsidiaryService.kt create mode 100644 src/main/java/com/ffii/tsms/modules/data/web/CustomerController.kt create mode 100644 src/main/java/com/ffii/tsms/modules/data/web/CustomerSubsidiaryController.kt create mode 100644 src/main/java/com/ffii/tsms/modules/data/web/SubsidiaryController.kt create mode 100644 src/main/java/com/ffii/tsms/modules/data/web/models/CustomerResponse.kt create mode 100644 src/main/java/com/ffii/tsms/modules/data/web/models/NewSubsidiaryRequest.kt create mode 100644 src/main/java/com/ffii/tsms/modules/data/web/models/SaveCustomerRequest.kt create mode 100644 src/main/resources/db/changelog/changes/20240327_01_cyril/01_update_customer.sql create mode 100644 src/main/resources/db/changelog/changes/20240327_01_cyril/02_update_subsidiary.sql diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/Customer.java b/src/main/java/com/ffii/tsms/modules/data/entity/Customer.java index 33d8411..0731801 100644 --- a/src/main/java/com/ffii/tsms/modules/data/entity/Customer.java +++ b/src/main/java/com/ffii/tsms/modules/data/entity/Customer.java @@ -3,6 +3,9 @@ package com.ffii.tsms.modules.data.entity; import com.ffii.core.entity.BaseEntity; import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import jakarta.validation.constraints.NotNull; @@ -23,18 +26,13 @@ public class Customer extends BaseEntity { @Column(name = "district", length = 30) private String district; - @Column(name = "email") - private String email; - - @Column(name = "phone", length = 20) - private String phone; - - @Column(name = "contactName", length = 30) - private String contactName; - @Column(name = "brNo", length = 20) private String brNo; + @OneToOne + @JoinColumn(name = "typeId") + private CustomerType customerType; + public String getAddress() { return address; } @@ -51,30 +49,6 @@ public class Customer extends BaseEntity { this.district = district; } - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public String getContactName() { - return contactName; - } - - public void setContactName(String contactName) { - this.contactName = contactName; - } - public String getBrNo() { return brNo; } @@ -98,4 +72,12 @@ public class Customer extends BaseEntity { public void setCode(String code) { this.code = code; } + + public CustomerType getCustomerType() { + return customerType; + } + + public void setCustomerType(CustomerType customerType) { + this.customerType = customerType; + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/CustomerContact.java b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerContact.java new file mode 100644 index 0000000..b359dee --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerContact.java @@ -0,0 +1,62 @@ +package com.ffii.tsms.modules.data.entity; + +import com.ffii.core.entity.IdEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; + +@Entity +@Table(name = "customer_contact") +public class CustomerContact extends IdEntity { + @NotNull + @OneToOne + @JoinColumn(name = "customerId") + private Customer customer; + + @NotNull + @Column(name = "name", length = 30) + private String name; + + @NotNull + @Column(name = "email", length = 255) + private String email; + + @NotNull + @Column(name = "phone", length = 20) + private String phone; + + public Customer getCustomer() { + return customer; + } + + public void setCustomer(Customer customer) { + this.customer = customer; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..781d6fd --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerContactRepository.java @@ -0,0 +1,7 @@ +package com.ffii.tsms.modules.data.entity; + +import com.ffii.core.support.AbstractRepository; + +public interface CustomerContactRepository extends AbstractRepository { + +} \ 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 743a41c..aaab530 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,6 +1,9 @@ package com.ffii.tsms.modules.data.entity; +import java.util.Optional; + import com.ffii.core.support.AbstractRepository; public interface CustomerRepository extends AbstractRepository { + } \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/CustomerSubsidiary.java b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerSubsidiary.java index 6065480..8e7618c 100644 --- a/src/main/java/com/ffii/tsms/modules/data/entity/CustomerSubsidiary.java +++ b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerSubsidiary.java @@ -29,7 +29,7 @@ public class CustomerSubsidiary extends IdEntity { return customer; } - public void setCustomerId(Customer customer) { + public void setCustomer(Customer customer) { this.customer = customer; } } \ No newline at end of file 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 new file mode 100644 index 0000000..c9b3347 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerSubsidiaryRepository.java @@ -0,0 +1,14 @@ +package com.ffii.tsms.modules.data.entity; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.repository.query.Param; + +import com.ffii.core.support.AbstractRepository; + +public interface CustomerSubsidiaryRepository extends AbstractRepository { + + List findAllByCustomerId(@Param("customerId") Long customerId); + +} diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/CustomerType.java b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerType.java new file mode 100644 index 0000000..95dc35d --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerType.java @@ -0,0 +1,23 @@ +package com.ffii.tsms.modules.data.entity; + +import com.ffii.core.entity.IdEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; + +@Entity +@Table(name = "customer_type") +public class CustomerType extends IdEntity { + @NotNull + @Column(name = "name") + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/CustomerTypeRepository.java b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerTypeRepository.java new file mode 100644 index 0000000..425d1be --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/CustomerTypeRepository.java @@ -0,0 +1,7 @@ +package com.ffii.tsms.modules.data.entity; + +import com.ffii.core.support.AbstractRepository; + +public interface CustomerTypeRepository extends AbstractRepository { + +} \ No newline at end of file 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 d0ff445..820778b 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 @@ -22,21 +22,12 @@ public class Subsidiary extends BaseEntity { @Column(name = "brNo", length = 20) private String brNo; - @Column(name = "contactName", length = 30) - private String contactName; - - @Column(name = "phone", length = 20) - private String phone; - @Column(name = "address", length = 500) private String address; @Column(name = "district", length = 30) private String district; - @Column(name = "email") - private String email; - public String getAddress() { return address; } @@ -53,30 +44,6 @@ public class Subsidiary extends BaseEntity { this.district = district; } - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getPhone() { - return phone; - } - - public void setPhone(String phone) { - this.phone = phone; - } - - public String getContactName() { - return contactName; - } - - public void setContactName(String contactName) { - this.contactName = contactName; - } - public String getBrNo() { return brNo; } diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryContact.java b/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryContact.java new file mode 100644 index 0000000..8355b8e --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryContact.java @@ -0,0 +1,62 @@ +package com.ffii.tsms.modules.data.entity; + +import com.ffii.core.entity.IdEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.OneToOne; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; + +@Entity +@Table(name = "subsidiary_contact") +public class SubsidiaryContact extends IdEntity { + @NotNull + @OneToOne + @JoinColumn(name = "subsidiaryId") + private Subsidiary subsidiary; + + @NotNull + @Column(name = "name", length = 30) + private String name; + + @NotNull + @Column(name = "email", length = 255) + private String email; + + @NotNull + @Column(name = "phone", length = 20) + private String phone; + + public Subsidiary getSubsidiary() { + return subsidiary; + } + + public void setSubsidiary(Subsidiary subsidiary) { + this.subsidiary = subsidiary; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } +} \ 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 new file mode 100644 index 0000000..83dc804 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryContactRepository.java @@ -0,0 +1,7 @@ +package com.ffii.tsms.modules.data.entity; + +import com.ffii.core.support.AbstractRepository; + +public interface SubsidiaryContactRepository extends AbstractRepository { + +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryType.java b/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryType.java new file mode 100644 index 0000000..d6c93dc --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryType.java @@ -0,0 +1,23 @@ +package com.ffii.tsms.modules.data.entity; + +import com.ffii.core.entity.IdEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; + +@Entity +@Table(name = "subsidiary_type") +public class SubsidiaryType extends IdEntity { + @NotNull + @Column(name = "name") + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryTypeRepository.java b/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryTypeRepository.java new file mode 100644 index 0000000..f2a9b35 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/entity/SubsidiaryTypeRepository.java @@ -0,0 +1,7 @@ +package com.ffii.tsms.modules.data.entity; + +import com.ffii.core.support.AbstractRepository; + +public interface SubsidiaryTypeRepository extends AbstractRepository { + +} \ 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 7f6faad..b5a3b72 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,20 +1,54 @@ package com.ffii.tsms.modules.data.service import com.ffii.tsms.modules.data.entity.Customer +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.project.web.models.SaveCustomerRequest import org.springframework.stereotype.Service @Service -class CustomerService(private val customerRepository: CustomerRepository) { - fun saveCustomer(name: String, code: String, email: String, phone: String, contactName: String): Customer { - return customerRepository.save( - Customer().apply { - this.name = name - this.email = email - this.phone = phone - this.code = code - this.contactName = contactName +class CustomerService(private val customerRepository: CustomerRepository, private val customerTypeRepository: CustomerTypeRepository, private val customerSubsidiaryService: CustomerSubsidiaryService) { + + fun allCustomers(): List { + return customerRepository.findAll() + } + + fun allCustomerTypes(): List { + return customerTypeRepository.findAll() + } + + fun findCustomer(id: Long): Customer { + return customerRepository.findById(id).orElseThrow() + } + + fun saveCustomer(saveCustomer: SaveCustomerRequest): Customer { + + val customer = + customerRepository.saveAndFlush( + Customer().apply { + id = saveCustomer.id + code = saveCustomer.code + name = saveCustomer.name + address = saveCustomer.address + district = saveCustomer.district + brNo = saveCustomer.brNo + } + ) + + val customerId = customer.id + + if (customerId != null && customerId > 0) { + + if (saveCustomer.deleteSubsidiaryIds.size > 0) { + customerSubsidiaryService.deleteSubsidiariesByCustomer(customerId, saveCustomer.deleteSubsidiaryIds) + } + + if (saveCustomer.addSubsidiaryIds.size > 0) { + customerSubsidiaryService.saveSubsidiariesByCustomer(customerId, saveCustomer.addSubsidiaryIds) } - ) + } + + return customer } -} \ No newline at end of file +} 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 new file mode 100644 index 0000000..6e5b217 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/service/CustomerSubsidiaryService.kt @@ -0,0 +1,67 @@ +package com.ffii.tsms.modules.data.service + +import com.ffii.tsms.modules.data.entity.CustomerRepository +import com.ffii.tsms.modules.data.entity.CustomerSubsidiary +import com.ffii.tsms.modules.data.entity.CustomerSubsidiaryRepository +import com.ffii.tsms.modules.data.entity.SubsidiaryRepository +import org.springframework.stereotype.Service + +@Service +class CustomerSubsidiaryService( + private val customerSubsidiaryRepository: CustomerSubsidiaryRepository, + private val customerRepository: CustomerRepository, + private val subsidiaryRepository: SubsidiaryRepository +) { + + + fun allCustomeriesSubsidiaries(): List { + return customerSubsidiaryRepository.findAll() + } + + fun findAllSubsidiaryIdsByCustomerId(customerId : Long) : List { + + val customerSubsidiaryList: List = customerSubsidiaryRepository.findAllByCustomerId(customerId) + + if (customerSubsidiaryList.size > 0) { + return customerSubsidiaryList.map { it.subsidiary.id }.filterNotNull() + } else return emptyList() + } + + fun saveSubsidiariesByCustomer(saveCustomerId: Long, saveSubsidiaryIds: List) { + + val customerSubsidiaryList = mutableListOf() + + val subsidiaryIdsSize = saveSubsidiaryIds.size + + for (i in 0 until subsidiaryIdsSize) { + val customer = customerRepository.findById(saveCustomerId).orElseThrow() + val subsidiary = subsidiaryRepository.findById(saveSubsidiaryIds[i]).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 = 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 + } + + customerSubsidiaryList.add(customerSubsidiary) + } + } +} 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 new file mode 100644 index 0000000..4baa2d2 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/service/SubsidiaryService.kt @@ -0,0 +1,30 @@ +package com.ffii.tsms.modules.project.service + +import com.ffii.tsms.modules.data.entity.SubsidiaryRepository +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 org.springframework.stereotype.Service + +@Service +class SubsidiaryService( + private val subsidiaryRepository: SubsidiaryRepository +) { + fun allSubsidiaries(): List { + return subsidiaryRepository.findAll() + } + + fun saveSubsidiary(request: NewSubsidiaryRequest): Subsidiary { + + // TODO: Add tasks, milestones, allocated + val subsidary = Subsidiary().apply { + code = request.code + name = request.name + brNo = request.brNo + address = request.address + district = request.district + } + + return subsidiaryRepository.save(subsidary) + } +} \ 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 new file mode 100644 index 0000000..6ae5780 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/web/CustomerController.kt @@ -0,0 +1,43 @@ +package com.ffii.tsms.modules.data.web + +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.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 +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.PathVariable +import jakarta.validation.Valid + +@RestController +@RequestMapping("/customer") +class CustomerController(private val customerService: CustomerService, private val customerSubsidiaryService: CustomerSubsidiaryService) { + @GetMapping + fun allCustomers(): List { + return customerService.allCustomers() + } + + @GetMapping("/types") + fun allCustomerTypes(): List { + return customerService.allCustomerTypes() + } + + @GetMapping("/{id}") + fun findCustomer(@PathVariable id: Long): CustomerResponse { + + val customer = customerService.findCustomer(id) + val subsidiaryIds = customerSubsidiaryService.findAllSubsidiaryIdsByCustomerId(id) + + return CustomerResponse(customer, subsidiaryIds) + } + + @PostMapping("/save") + fun saveCustomer(@Valid @RequestBody saveCustomer: SaveCustomerRequest): Customer { + 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 new file mode 100644 index 0000000..85564b2 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/web/CustomerSubsidiaryController.kt @@ -0,0 +1,31 @@ +package com.ffii.tsms.modules.data.web + +import com.ffii.tsms.modules.data.entity.Customer +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 org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.PathVariable +import jakarta.validation.Valid +import com.ffii.core.support.JdbcDao + +@RestController +@RequestMapping("/customer-subsidiary") +class CustomerSubsidiaryController(private val customerSubsidiaryService: CustomerSubsidiaryService) { + @GetMapping + fun allCustomeriesSubsidiaries(): List { + // JdbcDao.queryForString(sql) + return customerSubsidiaryService.allCustomeriesSubsidiaries() + } + + @GetMapping("/subsidiaries/{customerId}") + fun findAllSubsidiaryIdsByCustomerId(@PathVariable customerId: Long): List { + return customerSubsidiaryService.findAllSubsidiaryIdsByCustomerId(customerId) + } +} \ 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 new file mode 100644 index 0000000..50a6f4e --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/web/SubsidiaryController.kt @@ -0,0 +1,27 @@ +package com.ffii.tsms.modules.data.web + +import com.ffii.tsms.modules.data.entity.Staff +import com.ffii.tsms.modules.data.entity.Subsidiary +import com.ffii.tsms.modules.data.service.StaffsService +import com.ffii.tsms.modules.project.service.SubsidiaryService +import com.ffii.tsms.modules.project.web.models.NewSubsidiaryRequest +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +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) { + @GetMapping + fun allSubsidiaries(): List { + return subsidiaryService.allSubsidiaries() + } + + @PostMapping("/new") + fun saveSubsidiary(@Valid @RequestBody newSubsidary: NewSubsidiaryRequest): Subsidiary { + return subsidiaryService.saveSubsidiary(newSubsidary) + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..fee567e --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/CustomerResponse.kt @@ -0,0 +1,8 @@ +package com.ffii.tsms.modules.project.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/NewSubsidiaryRequest.kt b/src/main/java/com/ffii/tsms/modules/data/web/models/NewSubsidiaryRequest.kt new file mode 100644 index 0000000..e01db39 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/NewSubsidiaryRequest.kt @@ -0,0 +1,19 @@ +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 new file mode 100644 index 0000000..c1146b2 --- /dev/null +++ b/src/main/java/com/ffii/tsms/modules/data/web/models/SaveCustomerRequest.kt @@ -0,0 +1,19 @@ +package com.ffii.tsms.modules.project.web.models + +import jakarta.validation.constraints.NotBlank + +data class SaveCustomerRequest( + @field:NotBlank(message = "customer code cannot be empty") + val code: String, + @field:NotBlank(message = "customer name cannot be empty") + val name: String, + + val brNo: String?, + val address: String?, + val district: String?, + + val deleteSubsidiaryIds: List, + val addSubsidiaryIds: List, + + val id: Long?, +) \ No newline at end of file diff --git a/src/main/java/com/ffii/tsms/modules/project/service/ProjectsService.kt b/src/main/java/com/ffii/tsms/modules/project/service/ProjectsService.kt index ff3aaec..0ad7e09 100644 --- a/src/main/java/com/ffii/tsms/modules/project/service/ProjectsService.kt +++ b/src/main/java/com/ffii/tsms/modules/project/service/ProjectsService.kt @@ -8,13 +8,15 @@ import com.ffii.tsms.modules.project.entity.ProjectCategory import com.ffii.tsms.modules.project.entity.ProjectCategoryRepository import com.ffii.tsms.modules.project.entity.ProjectRepository import com.ffii.tsms.modules.project.web.models.NewProjectRequest +import com.ffii.tsms.modules.project.web.models.SaveCustomerRequest import org.springframework.stereotype.Service @Service class ProjectsService( - private val projectRepository: ProjectRepository, - private val customerService: CustomerService, private val projectCategoryRepository: ProjectCategoryRepository, - private val staffRepository: StaffRepository + private val projectRepository: ProjectRepository, + private val customerService: CustomerService, + private val projectCategoryRepository: ProjectCategoryRepository, + private val staffRepository: StaffRepository ) { fun allProjects(): List { return projectRepository.findProjectSearchInfoBy() @@ -25,20 +27,37 @@ class ProjectsService( } fun saveProject(request: NewProjectRequest): Project { - val projectCategory = projectCategoryRepository.findById(request.projectCategoryId).orElseThrow() + val projectCategory = + projectCategoryRepository.findById(request.projectCategoryId).orElseThrow() val teamLead = staffRepository.findById(request.projectLeadId).orElseThrow() - val customer = customerService.saveCustomer(request.clientName, request.clientCode, request.clientEmail, request.clientPhone, request.clientContactName) + + val _customer = + SaveCustomerRequest( + name = request.clientName, + code = request.clientCode, + // email = request.clientEmail, + // phone = request.clientPhone, + // contactName = request.clientContactName, + brNo = null, + address = null, + district = null, + deleteSubsidiaryIds = emptyList(), + addSubsidiaryIds = emptyList(), + id = null + ) + val customer = customerService.saveCustomer(_customer) // TODO: Add tasks, milestones, allocated - val project = Project().apply { - name = request.projectName - description = request.projectDescription - code = request.projectCode - this.projectCategory = projectCategory - this.teamLead = teamLead - this.customer = customer - } + val project = + Project().apply { + name = request.projectName + description = request.projectDescription + code = request.projectCode + this.projectCategory = projectCategory + this.teamLead = teamLead + this.customer = customer + } return projectRepository.save(project) } -} \ No newline at end of file +} diff --git a/src/main/resources/db/changelog/changes/20240327_01_cyril/01_update_customer.sql b/src/main/resources/db/changelog/changes/20240327_01_cyril/01_update_customer.sql new file mode 100644 index 0000000..546c5c1 --- /dev/null +++ b/src/main/resources/db/changelog/changes/20240327_01_cyril/01_update_customer.sql @@ -0,0 +1,45 @@ +-- liquibase formatted sql +-- changeset cyril:update_customer + +ALTER TABLE `customer` +DROP COLUMN `contactName`, +DROP COLUMN `phone`, +DROP COLUMN `email`, +ADD COLUMN `typeId` INT NOT NULL AFTER `brNo`; + +CREATE TABLE `customer_type` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(20) NOT NULL, + PRIMARY KEY (`id`)); + +ALTER TABLE customer ADD CONSTRAINT FK_CUSTOMER_ON_TYPEID FOREIGN KEY (typeId) REFERENCES customer (id); + +CREATE TABLE `customer_contact` ( + `id` INT NOT NULL AUTO_INCREMENT, + `version` INT NOT NULL DEFAULT '0', + `created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` VARCHAR(30) NULL DEFAULT NULL, + `modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `modifiedBy` VARCHAR(30) NULL DEFAULT NULL, + `deleted` TINYINT(1) NOT NULL DEFAULT '0', + `customerId` INT NOT NULL, + `name` VARCHAR(30) NOT NULL, + `email` VARCHAR(255) NOT NULL, + `phone` VARCHAR(20) NOT NULL, + PRIMARY KEY (`id`)); + +ALTER TABLE customer_contact ADD CONSTRAINT FK_CUSTOMER_CONTACT_ON_CUSTOMERID FOREIGN KEY (customerId) REFERENCES customer (id); + +INSERT +INTO + customer_type + (name) +VALUES + ('Architect'), + ('Contractor'), + ('Developer'), + ('Government'), + ('Institution'), + ('NGO'), + ('Private'), + ('Utility'); diff --git a/src/main/resources/db/changelog/changes/20240327_01_cyril/02_update_subsidiary.sql b/src/main/resources/db/changelog/changes/20240327_01_cyril/02_update_subsidiary.sql new file mode 100644 index 0000000..75d6622 --- /dev/null +++ b/src/main/resources/db/changelog/changes/20240327_01_cyril/02_update_subsidiary.sql @@ -0,0 +1,45 @@ +-- liquibase formatted sql +-- changeset cyril:update_subsidiary + +ALTER TABLE `subsidiary` +DROP COLUMN `contactName`, +DROP COLUMN `phone`, +DROP COLUMN `email`, +ADD COLUMN `typeId` INT NOT NULL AFTER `brNo`; + +CREATE TABLE `subsidiary_type` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` VARCHAR(20) NOT NULL, + PRIMARY KEY (`id`)); + +ALTER TABLE subsidiary ADD CONSTRAINT FK_SUBSIDIARY_ON_TYPEID FOREIGN KEY (typeId) REFERENCES subsidiary (id); + +CREATE TABLE `subsidiary_contact` ( + `id` INT NOT NULL AUTO_INCREMENT, + `version` INT NOT NULL DEFAULT '0', + `created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `createdBy` VARCHAR(30) NULL DEFAULT NULL, + `modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `modifiedBy` VARCHAR(30) NULL DEFAULT NULL, + `deleted` TINYINT(1) NOT NULL DEFAULT '0', + `subsidiaryId` INT NOT NULL, + `name` VARCHAR(30) NOT NULL, + `email` VARCHAR(255) NOT NULL, + `phone` VARCHAR(20) NOT NULL, + PRIMARY KEY (`id`)); + +ALTER TABLE subsidiary_contact ADD CONSTRAINT FK_SUBSIDIARY_CONTACT_ON_SUBSIDIARYID FOREIGN KEY (subsidiaryId) REFERENCES subsidiary (id); + +INSERT +INTO + subsidiary_type + (name) +VALUES + ('Architect'), + ('Contractor'), + ('Developer'), + ('Government'), + ('Institution'), + ('NGO'), + ('Private'), + ('Utility');