| @@ -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<Long> { | |||
| @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<Long> { | |||
| 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<Long> { | |||
| public void setCode(String code) { | |||
| this.code = code; | |||
| } | |||
| public CustomerType getCustomerType() { | |||
| return customerType; | |||
| } | |||
| public void setCustomerType(CustomerType customerType) { | |||
| this.customerType = customerType; | |||
| } | |||
| } | |||
| @@ -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<Long> { | |||
| @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; | |||
| } | |||
| } | |||
| @@ -0,0 +1,7 @@ | |||
| package com.ffii.tsms.modules.data.entity; | |||
| import com.ffii.core.support.AbstractRepository; | |||
| public interface CustomerContactRepository extends AbstractRepository<CustomerContact, Long> { | |||
| } | |||
| @@ -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<Customer, Long> { | |||
| } | |||
| @@ -29,7 +29,7 @@ public class CustomerSubsidiary extends IdEntity<Long> { | |||
| return customer; | |||
| } | |||
| public void setCustomerId(Customer customer) { | |||
| public void setCustomer(Customer customer) { | |||
| this.customer = customer; | |||
| } | |||
| } | |||
| @@ -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<CustomerSubsidiary, Long> { | |||
| List<CustomerSubsidiary> findAllByCustomerId(@Param("customerId") Long customerId); | |||
| } | |||
| @@ -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<Long> { | |||
| @NotNull | |||
| @Column(name = "name") | |||
| private String name; | |||
| public String getName() { | |||
| return name; | |||
| } | |||
| public void setName(String name) { | |||
| this.name = name; | |||
| } | |||
| } | |||
| @@ -0,0 +1,7 @@ | |||
| package com.ffii.tsms.modules.data.entity; | |||
| import com.ffii.core.support.AbstractRepository; | |||
| public interface CustomerTypeRepository extends AbstractRepository<CustomerType, Long> { | |||
| } | |||
| @@ -22,21 +22,12 @@ public class Subsidiary extends BaseEntity<Long> { | |||
| @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<Long> { | |||
| 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; | |||
| } | |||
| @@ -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<Long> { | |||
| @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; | |||
| } | |||
| } | |||
| @@ -0,0 +1,7 @@ | |||
| package com.ffii.tsms.modules.data.entity; | |||
| import com.ffii.core.support.AbstractRepository; | |||
| public interface SubsidiaryContactRepository extends AbstractRepository<SubsidiaryContact, Long> { | |||
| } | |||
| @@ -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<Long> { | |||
| @NotNull | |||
| @Column(name = "name") | |||
| private String name; | |||
| public String getName() { | |||
| return name; | |||
| } | |||
| public void setName(String name) { | |||
| this.name = name; | |||
| } | |||
| } | |||
| @@ -0,0 +1,7 @@ | |||
| package com.ffii.tsms.modules.data.entity; | |||
| import com.ffii.core.support.AbstractRepository; | |||
| public interface SubsidiaryTypeRepository extends AbstractRepository<SubsidiaryType, Long> { | |||
| } | |||
| @@ -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<Customer> { | |||
| return customerRepository.findAll() | |||
| } | |||
| fun allCustomerTypes(): List<CustomerType> { | |||
| 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 | |||
| } | |||
| } | |||
| } | |||
| @@ -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<CustomerSubsidiary> { | |||
| return customerSubsidiaryRepository.findAll() | |||
| } | |||
| fun findAllSubsidiaryIdsByCustomerId(customerId : Long) : List<Long> { | |||
| val customerSubsidiaryList: List<CustomerSubsidiary> = customerSubsidiaryRepository.findAllByCustomerId(customerId) | |||
| if (customerSubsidiaryList.size > 0) { | |||
| return customerSubsidiaryList.map { it.subsidiary.id }.filterNotNull() | |||
| } else return emptyList() | |||
| } | |||
| fun saveSubsidiariesByCustomer(saveCustomerId: Long, saveSubsidiaryIds: List<Long>) { | |||
| val customerSubsidiaryList = mutableListOf<CustomerSubsidiary>() | |||
| 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<Long>) { | |||
| val customerSubsidiaryList = mutableListOf<CustomerSubsidiary>() | |||
| val subsidiaryIdsSize = deleteSubsidiaryIds.size | |||
| for (i in 0 until subsidiaryIdsSize) { | |||
| val customer = customerRepository.findById(deleteCustomerId).orElseThrow() | |||
| val subsidiary = subsidiaryRepository.findById(deleteSubsidiaryIds[i]).orElseThrow() | |||
| val customerSubsidiary = CustomerSubsidiary().apply { | |||
| this.customer = customer | |||
| this.subsidiary = subsidiary | |||
| } | |||
| customerSubsidiaryList.add(customerSubsidiary) | |||
| } | |||
| } | |||
| } | |||
| @@ -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<Subsidiary> { | |||
| 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) | |||
| } | |||
| } | |||
| @@ -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<Customer> { | |||
| return customerService.allCustomers() | |||
| } | |||
| @GetMapping("/types") | |||
| fun allCustomerTypes(): List<CustomerType> { | |||
| 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) | |||
| } | |||
| } | |||
| @@ -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<CustomerSubsidiary> { | |||
| // JdbcDao.queryForString(sql) | |||
| return customerSubsidiaryService.allCustomeriesSubsidiaries() | |||
| } | |||
| @GetMapping("/subsidiaries/{customerId}") | |||
| fun findAllSubsidiaryIdsByCustomerId(@PathVariable customerId: Long): List<Long> { | |||
| return customerSubsidiaryService.findAllSubsidiaryIdsByCustomerId(customerId) | |||
| } | |||
| } | |||
| @@ -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<Subsidiary> { | |||
| return subsidiaryService.allSubsidiaries() | |||
| } | |||
| @PostMapping("/new") | |||
| fun saveSubsidiary(@Valid @RequestBody newSubsidary: NewSubsidiaryRequest): Subsidiary { | |||
| return subsidiaryService.saveSubsidiary(newSubsidary) | |||
| } | |||
| } | |||
| @@ -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<Long>, | |||
| ) | |||
| @@ -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<Long>, | |||
| ) | |||
| @@ -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<Long>, | |||
| val addSubsidiaryIds: List<Long>, | |||
| val id: Long?, | |||
| ) | |||
| @@ -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<ProjectSearchInfo> { | |||
| 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) | |||
| } | |||
| } | |||
| } | |||
| @@ -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'); | |||
| @@ -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'); | |||