From a56da3c440ed43b61b08f25fae1215dd78e9787b Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Fri, 3 May 2024 11:15:30 +0800 Subject: [PATCH] update project --- .../project/service/ProjectsService.kt | 22 +++++++++++++++++-- .../modules/project/web/ProjectsController.kt | 7 ++++++ .../project/web/models/EditProjectDetails.kt | 6 +++++ .../project/web/models/NewProjectRequest.kt | 4 ++++ 4 files changed, 37 insertions(+), 2 deletions(-) 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 5718faf..2c32f2c 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 @@ -15,6 +15,7 @@ import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import java.time.LocalDate import java.time.format.DateTimeFormatter +import kotlin.jvm.optionals.getOrElse import kotlin.jvm.optionals.getOrNull @Service @@ -54,6 +55,10 @@ open class ProjectsService( return projectRepository.findInvoiceInfoSearchInfoById(id) } + open fun markDeleted(id: Long) { + projectRepository.save(projectRepository.findById(id).orElseThrow().apply { deleted = true }) + } + open fun allAssignedProjects(): List { return SecurityUtils.getUser().getOrNull()?.let { user -> staffRepository.findByUserId(user.id).getOrNull()?.let { staff -> @@ -105,13 +110,15 @@ open class ProjectsService( val taskGroupMap = tasksService.allTaskGroups().associateBy { it.id } val gradeMap = gradeService.allGrades().associateBy { it.id } - val project = - Project().apply { + val project = if (request.projectId != null && request.projectId > 0) projectRepository.findById(request.projectId).orElseThrow() else Project() + project.apply { name = request.projectName description = request.projectDescription code = request.projectCode expectedTotalFee = request.expectedProjectFee totalManhour = request.totalManhour + actualStart = request.projectActualStart + actualEnd = request.projectActualEnd this.projectCategory = projectCategory this.fundingType = fundingType @@ -170,6 +177,13 @@ open class ProjectsService( } } + if (milestones.isNotEmpty()) { + project.apply { + planStart = milestones.mapNotNull { it.startDate }.minOrNull() + planEnd = milestones.mapNotNull { it.endDate }.maxOrNull() + } + } + val savedProject = projectRepository.save(project) milestoneRepository.saveAll(milestones) projectTaskRepository.saveAll(tasksToSave) @@ -206,11 +220,15 @@ open class ProjectsService( .associateBy { milestone -> milestone.taskGroup!!.id!! } EditProjectDetails( + projectId = it.id, + projectDeleted = it.deleted, projectCode = it.code, projectName = it.name, projectCategoryId = it.projectCategory?.id, projectDescription = it.description, projectLeadId = it.teamLead?.id, + projectActualStart = it.actualStart, + projectActualEnd = it.actualEnd, serviceTypeId = it.serviceType?.id, fundingTypeId = it.fundingType?.id, contractTypeId = it.contractType?.id, diff --git a/src/main/java/com/ffii/tsms/modules/project/web/ProjectsController.kt b/src/main/java/com/ffii/tsms/modules/project/web/ProjectsController.kt index 9c7e87b..71e7321 100644 --- a/src/main/java/com/ffii/tsms/modules/project/web/ProjectsController.kt +++ b/src/main/java/com/ffii/tsms/modules/project/web/ProjectsController.kt @@ -10,6 +10,7 @@ import com.ffii.tsms.modules.project.web.models.EditProjectDetails import com.ffii.tsms.modules.project.web.models.NewProjectRequest import com.ffii.tsms.modules.project.web.models.NewProjectResponse import jakarta.validation.Valid +import org.springframework.http.HttpStatus import org.springframework.web.bind.annotation.* @RestController @@ -20,6 +21,12 @@ class ProjectsController(private val projectsService: ProjectsService) { return projectsService.allProjects() } + @DeleteMapping("/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + fun deleteProject(@PathVariable id: Long) { + projectsService.markDeleted(id) + } + @GetMapping("/assignedProjects") fun assignedProjects(): List { return projectsService.allAssignedProjects() 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 bf2755e..7bd324b 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 @@ -1,12 +1,18 @@ package com.ffii.tsms.modules.project.web.models +import java.time.LocalDate + data class EditProjectDetails( // Project details + val projectId: Long?, + val projectDeleted: Boolean?, val projectCode: String?, val projectName: String?, val projectCategoryId: Long?, val projectDescription: String?, val projectLeadId: Long?, + val projectActualStart: LocalDate?, + val projectActualEnd: LocalDate?, val serviceTypeId: Long?, val fundingTypeId: Long?, 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 cd34e4c..26f11f4 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 @@ -1,6 +1,7 @@ package com.ffii.tsms.modules.project.web.models import jakarta.validation.constraints.NotBlank +import java.time.LocalDate data class NewProjectRequest( // Project details @@ -11,6 +12,9 @@ data class NewProjectRequest( val projectCategoryId: Long, val projectDescription: String, val projectLeadId: Long, + val projectId: Long?, + val projectActualStart: LocalDate?, + val projectActualEnd: LocalDate?, val serviceTypeId: Long, val fundingTypeId: Long,