diff --git a/src/main/java/com/ffii/tsms/modules/project/entity/Project.kt b/src/main/java/com/ffii/tsms/modules/project/entity/Project.kt index 54267e8..199b1fb 100644 --- a/src/main/java/com/ffii/tsms/modules/project/entity/Project.kt +++ b/src/main/java/com/ffii/tsms/modules/project/entity/Project.kt @@ -43,6 +43,10 @@ open class Project : BaseEntity() { @JoinColumn(name = "teamLead") open var teamLead: Staff? = null + @ManyToOne + @JoinColumn(name = "subTeamLead") + open var subTeamLead: Staff? = null + @ManyToOne @JoinColumn(name = "customerId") open var customer: Customer? = null 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 72a8a96..1e44803 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 @@ -186,6 +186,7 @@ open class ProjectsService( if (request.taskTemplateId != null && request.taskTemplateId > 0) taskTemplateRepository.findById(request.taskTemplateId) .orElseThrow() else null val teamLead = staffRepository.findById(request.projectLeadId).orElseThrow() + val subTeamLead = request.projectSubLeadId?.let { staffRepository.findById(it).orElseThrow() } val customer = customerService.findCustomer(request.clientId) val customerType = request.clientTypeId?.let { customerService.findCustomerType(it) } ?: customer.customerType val subsidiaryContact = @@ -261,6 +262,7 @@ open class ProjectsService( this.taskTemplate = taskTemplate this.teamLead = teamLead + this.subTeamLead = subTeamLead this.customer = customer custLeadName = if (request.isSubsidiaryContact == null || !request.isSubsidiaryContact) clientContact?.name else subsidiaryContact?.name @@ -425,6 +427,7 @@ open class ProjectsService( projectCategoryId = it.projectCategory?.id, projectDescription = it.description, projectLeadId = it.teamLead?.id, + projectSubLeadId = it.subTeamLead?.id, projectActualStart = it.actualStart, projectActualEnd = it.actualEnd, projectPlanStart = it.planStart, @@ -497,8 +500,9 @@ open class ProjectsService( open fun allBuildingTypes(): List { val sortedBuildingType = buildingTypeRepository.findAll().sortedBy { it.name }.sortedWith { a, b -> when { + a.contains("Hidden", ignoreCase = true) && !b.contains("Hidden", ignoreCase = true) -> 2 a.startsWith("Others") && !b.startsWith("Others") -> 1 // Move "Others" to the end - !a.startsWith("Others") && b.startsWith("Others") -> -1 // Keep non-"Others" items above + (!a.startsWith("Others") && b.startsWith("Others")) || (!a.contains("Hidden", ignoreCase = true) && b.contains("Hidden", ignoreCase = true)) -> -1 // Keep non-"Others" items above else -> 0 // Maintain relative order for other items } } @@ -527,6 +531,7 @@ open class ProjectsService( projectCategoryId = project.projectCategory?.id, projectDescription = project.description, projectLeadId = project.teamLead?.id, + projectSubLeadId = project.subTeamLead?.id, projectStatus = project.status, isClpProject = project.isClpProject, serviceTypeId = project.serviceType?.id, diff --git a/src/main/java/com/ffii/tsms/modules/project/web/models/EditProjectDetails.kt b/src/main/java/com/ffii/tsms/modules/project/web/models/EditProjectDetails.kt index 943ad3f..933d777 100644 --- a/src/main/java/com/ffii/tsms/modules/project/web/models/EditProjectDetails.kt +++ b/src/main/java/com/ffii/tsms/modules/project/web/models/EditProjectDetails.kt @@ -11,6 +11,7 @@ data class EditProjectDetails( val projectCategoryId: Long?, val projectDescription: String?, val projectLeadId: Long?, + val projectSubLeadId: Long?, val projectPlanStart: LocalDate?, val projectPlanEnd: LocalDate?, val projectActualStart: LocalDate?, diff --git a/src/main/java/com/ffii/tsms/modules/project/web/models/MainProjectDetails.kt b/src/main/java/com/ffii/tsms/modules/project/web/models/MainProjectDetails.kt index ba2e4bc..0632fcb 100644 --- a/src/main/java/com/ffii/tsms/modules/project/web/models/MainProjectDetails.kt +++ b/src/main/java/com/ffii/tsms/modules/project/web/models/MainProjectDetails.kt @@ -11,6 +11,7 @@ data class MainProjectDetails ( val projectDescription: String?, val projectLeadId: Long?, + val projectSubLeadId: Long?, val projectStatus: String?, val isClpProject: Boolean?, diff --git a/src/main/java/com/ffii/tsms/modules/project/web/models/NewProjectRequest.kt b/src/main/java/com/ffii/tsms/modules/project/web/models/NewProjectRequest.kt index 5356617..022632b 100644 --- a/src/main/java/com/ffii/tsms/modules/project/web/models/NewProjectRequest.kt +++ b/src/main/java/com/ffii/tsms/modules/project/web/models/NewProjectRequest.kt @@ -13,6 +13,7 @@ data class NewProjectRequest( val projectCategoryId: Long, val projectDescription: String, val projectLeadId: Long, + val projectSubLeadId: Long? = null, val projectId: Long?, val projectActualStart: LocalDate?, val projectActualEnd: LocalDate?, diff --git a/src/main/resources/db/changelog/changes/20251129_01_cyril/01_update_project.sql b/src/main/resources/db/changelog/changes/20251129_01_cyril/01_update_project.sql new file mode 100644 index 0000000..01ffdad --- /dev/null +++ b/src/main/resources/db/changelog/changes/20251129_01_cyril/01_update_project.sql @@ -0,0 +1,12 @@ +-- liquibase formatted sql +-- changeset cyril:update_project_by_adding_subTeamLead + +ALTER TABLE `project` + ADD COLUMN `subTeamLead` INT NULL AFTER `teamLead`, +ADD INDEX `FK_PROJECT_ON_SUBTEAMLEAD` (`subTeamLead` ASC) VISIBLE; +ALTER TABLE `project` + ADD CONSTRAINT `FK_PROJECT_ON_SUBTEAMLEAD` + FOREIGN KEY (`subTeamLead`) + REFERENCES `staff` (`id`) + ON DELETE RESTRICT + ON UPDATE RESTRICT;