diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 9f3d63ef..144f8f65 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -78,6 +78,10 @@ public class GepafinConstant { public static final String UPDATE_USER_STATUS_SUCCESS_MSG = "update.user.status.success"; public static final String FIELD_NOT_NULL = "field.not.null"; public static final String FIELD_NOT_EMPTY = "field.not.empty"; - + public static final String UPDATE_CALL_STATUS_SUCCESS_MSG = "update_call_status_success_msg"; + public static final String STATUS_SAME_ERROR = "status.same.error"; + public static final String INVALID_STATUS_CHANGE_FROM_DRAFT = "invalid.status.change.from.draft"; + public static final String STATUS_CANNOT_BE_CHANGED = "status.cannot.be.changed"; + public static final String INVALID_STATUS_TRANSITION = "invalid.status.transition"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 647696ab..65dae9ef 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.response.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -120,26 +121,26 @@ public class CallDao { if (criteriaReqList == null) { return null; } - List existingCriteria = evaluationCriteriaRepository.findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), type.getValue()); + List existingCriteria = evaluationCriteriaRepository.findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), type.getValue()); List incomingIds = criteriaReqList.stream().map(EvaluationCriteriaReq::getId) .filter(id -> id != null && id > 0).collect(Collectors.toList()); existingCriteria.stream().filter(criteria -> !incomingIds.contains(criteria.getId())).forEach(this::softDeleteEvaluationCriteria); - + List evaluationCriteriaEntities = criteriaReqList.stream() .map(req -> convertToEvaluationCriteriaEntity(req, callEntity, type)).collect(Collectors.toList()); evaluationCriteriaRepository.saveAll(evaluationCriteriaEntities); return evaluationCriteriaEntities; } - + private void softDeleteEvaluationCriteria(EvaluationCriteriaEntity evaluationCriteriaEntity) { evaluationCriteriaEntity.setIsDeleted(true); evaluationCriteriaRepository.save(evaluationCriteriaEntity); } private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, - CallEntity callEntity, LookUpDataTypeEnum type) { + CallEntity callEntity, LookUpDataTypeEnum type) { EvaluationCriteriaEntity criteriaEntity = null; LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(criteriaReq, type); if (criteriaReq.getId() == null && criteriaReq.getId().equals(0l)) { @@ -161,11 +162,11 @@ public class CallDao { public List convertToDocumentEntities(List documentReqList, CallEntity callEntity, - DocumentTypeEnum documentType) { + DocumentTypeEnum documentType) { if (documentReqList == null) { return null; } - + List existingDocuments = documentRepository .findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), documentType.getValue()); @@ -179,7 +180,7 @@ public class CallDao { documentRepository.saveAll(documentEntities); return documentEntities; } - + private void softDeleteDocument(DocumentEntity documentEntity) { documentEntity.setIsDeleted(true); documentRepository.save(documentEntity); @@ -203,10 +204,10 @@ public class CallDao { return faqEntities; } - public FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { - FaqEntity faqEntity = new FaqEntity(); - validateFaqEntity(faqReq.getQuestion()); - UserEntity userEntity = userService.validateUser(userId); + public FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) { + FaqEntity faqEntity = new FaqEntity(); + validateFaqEntity(faqReq.getQuestion()); + UserEntity userEntity = userService.validateUser(userId); faqEntity.setUser(userEntity); faqEntity.setIsVisible(true); if (faqReq.getIsVisible() != null) { @@ -258,11 +259,11 @@ public class CallDao { } if (createCallRequest.getStartDate().toLocalDate().isBefore(LocalDate.now()) || createCallRequest.getEndDate().toLocalDate().isBefore(LocalDate.now()) || createCallRequest - .getStartDate().toLocalDate().isAfter(createCallRequest.getEndDate().toLocalDate())) { + .getStartDate().toLocalDate().isAfter(createCallRequest.getEndDate().toLocalDate())) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); } - + } public CallResponse convertToCallResponseBean(CallEntity callEntity) { @@ -326,8 +327,8 @@ public class CallDao { } public CallResponse assembleCreateCallResponseBean(CallEntity callEntity, - List evaluationCriteriaEntities, List documentEntities, - List faqEntities, List images) { + List evaluationCriteriaEntities, List documentEntities, + List faqEntities, List images) { CallResponse callResponseBean = convertToCallResponseBean(callEntity); @@ -351,7 +352,7 @@ public class CallDao { } public List convertLookUpDataEntities(List lookUpData, CallEntity callEntity, - LookUpDataEntity.LookUpDataTypeEnum type) { + LookUpDataEntity.LookUpDataTypeEnum type) { List lookUpDataEntities = lookUpData.stream() .map(req -> convertLookUpDataRequestIntoLookUpDataEntity(req, type)).collect(Collectors.toList()); @@ -359,7 +360,7 @@ public class CallDao { } private List createCallTargetAudienceCheckList(CallEntity callEntity, - List lookUpDataEntities) { + List lookUpDataEntities) { List lookUpDataResponses = new ArrayList<>(); for (LookUpDataEntity lookUpDataEntity : lookUpDataEntities) { CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity = new CallTargetAudienceChecklistEntity(); @@ -375,7 +376,7 @@ public class CallDao { } private LookUpDataEntity convertLookUpDataRequestIntoLookUpDataEntity(LookUpDataReq req, - LookUpDataEntity.LookUpDataTypeEnum type) { + LookUpDataEntity.LookUpDataTypeEnum type) { if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(0l)) { LookUpDataEntity newEntity = new LookUpDataEntity(); newEntity.setValue(req.getValue()); @@ -405,6 +406,7 @@ public class CallDao { return callRepository.findById(callId).orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); } + public CallResponse getCallById(Long callId) { CallEntity callEntity = callRepository.findById(callId) .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, @@ -420,13 +422,13 @@ public class CallDao { setIfUpdated(callEntity::getThreshold, callEntity::setThreshold, createCallRequest.getThreshold()); callRepository.save(callEntity); convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity, LookUpDataTypeEnum.EVALUATION_CRITERIA); - + convertToDocumentEntities(createCallRequest.getDocs(), callEntity, DocumentTypeEnum.DOCUMENT); - + convertToDocumentEntities(createCallRequest.getImages(), callEntity, DocumentTypeEnum.IMAGES); updateLookUpData(callEntity, createCallRequest.getCheckList(), LookUpDataTypeEnum.CHECKLIST); - + // List faqEntities = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId()); // List amiedTo = callTargetAudienceChecklistRepository // .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() @@ -486,7 +488,7 @@ public class CallDao { } private void updateFaq(CallEntity callEntity, List faqReqList, UserEntity userEntity) { - if(faqReqList==null) { + if (faqReqList == null) { return; } List existingFaqs = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId()); @@ -543,7 +545,7 @@ public class CallDao { } private void createOrUpdateCallTargetAudienceChecklist(LookUpDataReq lookUpDataReq, CallEntity callEntity, - LookUpDataTypeEnum type) { + LookUpDataTypeEnum type) { CallTargetAudienceChecklistEntity checklistEntity = null; LookUpDataEntity lookupDataEntity = convertLookUpDataRequestIntoLookUpDataEntity(lookUpDataReq, type); if (lookUpDataReq.getId() != null && lookUpDataReq.getId() > 0) { @@ -591,6 +593,7 @@ public class CallDao { callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); return callDetailsResponseBean; } + private CallResponse getCallResponseBean(CallEntity callEntity) { List documentEntities = documentRepository.findByCallIdAndTypeAndIsDeletedFalse(callEntity.getId(), DocumentTypeEnum.DOCUMENT.getValue()); @@ -613,6 +616,7 @@ public class CallDao { createCallResponseBean.setCheckList(checkList); return createCallResponseBean; } + public List getAllCalls() { return callRepository.findAll() .stream() @@ -628,4 +632,38 @@ public class CallDao { callResponseBean.setCurrentStep(GepafinConstant.VALIDATE_REQUEST); return callResponseBean; } + + public CallResponse updateCallStatus(Long callId, CallStatusEnum statusReq) { + CallEntity callEntity = callRepository.findById(callId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); + CallStatusEnum currentStatus = CallStatusEnum.valueOf(callEntity.getStatus()); + validateStatusChange(currentStatus, statusReq); + callEntity.setStatus(statusReq.getValue()); + callEntity = callRepository.save(callEntity); + return convertToCallResponseBean(callEntity); + } + + private void validateStatusChange(CallStatusEnum currentStatus, CallStatusEnum newStatus) { + if (currentStatus == newStatus) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.STATUS_SAME_ERROR)); + } + + switch (currentStatus) { + case DRAFT: + if (newStatus == CallStatusEnum.READY_TO_PUBLISH || newStatus == CallStatusEnum.PUBLISH) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_STATUS_CHANGE_FROM_DRAFT)); + } + break; + case PUBLISH: + case EXPIRE: + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.STATUS_CANNOT_BE_CHANGED)); + default: + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_STATUS_TRANSITION)); + } + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 1008f062..9be1c8ef 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -3,11 +3,14 @@ package net.gepafin.tendermanagement.service; import java.util.List; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; +import net.gepafin.tendermanagement.model.response.UserResponseBean; public interface CallService { @@ -23,4 +26,6 @@ public interface CallService { CallResponse validateCall(Long callId); + CallResponse updateCallStatus(Long callId, CallStatusEnum statusReq); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index 0dc37efd..d151b6c5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -3,11 +3,14 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.dao.CallDao; +import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; +import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.service.CallService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -65,4 +68,10 @@ public class CallServiceImpl implements CallService { public CallResponse validateCall(Long callId) { return callDao.validateCall(callDao.validateCall(callId)); } + @Override + @Transactional(rollbackFor = Exception.class) + public CallResponse updateCallStatus(Long callId, CallStatusEnum statusReq) { + return callDao.updateCallStatus(callId, statusReq); + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 1b4771a8..1c604fc7 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -2,15 +2,15 @@ package net.gepafin.tendermanagement.web.rest.api; import java.util.List; +import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.enums.UserStatusEnum; +import net.gepafin.tendermanagement.model.response.UserResponseBean; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -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.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.*; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -120,5 +120,23 @@ public interface CallApi { @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") public ResponseEntity> validateCall(HttpServletRequest request, @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId); - + @Operation(summary = "Api to update call status", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)})) + }) + @RequestMapping(value = "/{callId}/status", + produces = {"application/json"}, + method = RequestMethod.PUT) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + default ResponseEntity> updateCallStatus( + @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId, + @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) CallStatusEnum status) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 7c96aa7e..38c42a3e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -2,11 +2,16 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import java.util.List; +import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.enums.UserStatusEnum; +import net.gepafin.tendermanagement.model.response.UserResponseBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.http.HttpServletRequest; @@ -78,4 +83,9 @@ public class CallApiController implements CallApi { return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(call, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); } + @Override + public ResponseEntity> updateCallStatus(@PathVariable Long callId, @RequestParam CallStatusEnum status) { + CallResponse updateCall = callService.updateCallStatus(callId, status); + return ResponseEntity.ok(new Response<>(updateCall, Status.SUCCESS, Translator.toLocale(GepafinConstant.UPDATE_CALL_STATUS_SUCCESS_MSG))); + } } \ No newline at end of file diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 17154713..d95d85e3 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -43,7 +43,6 @@ call.created.successfully=Call created successfully. file.deleted.successfully=File deleted successfully. document.not.found=Document not found. document.id.not.found=Document ID not found. -call.created.successfully=Call created successfully. call.invalid.date=Invalid start or end date. call.update.successfully=Call updated successfully. call.fetch.success=Call details fetched successfully. @@ -51,6 +50,11 @@ call.not.found=Call not found. score.not.null=Score cannot be null or cannot be zero. field.not.null={0} cannot be null. field.not.empty={0} cannot be empty. +update_call_status_success_msg=The call status has been updated successfully. +status.same.error=Status is already set. +invalid.status.change.from.draft=Status cannot be changed to READY_TO_PUBLISH or PUBLISH from DRAFT. +status.cannot.be.changed=Status cannot be changed. +invalid.status.transition=Invalid status transition. # Login-related messages login.successfully=Login successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 43fd781d..993d8693 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -50,6 +50,11 @@ call.not.found=Chiamata non trovata. score.not.null=Il punteggio non pu� essere nullo o zero. field.not.null={0} non può essere nullo. field.not.empty=la {0} non può essere vuota. +update_call_status_success_msg=Lo stato della chiamata è stato aggiornato con successo. +status.same.error=Lo stato è già impostato. +invalid.status.change.from.draft=Lo stato non può essere cambiato in READY_TO_PUBLISH o PUBLISH da DRAFT. +status.cannot.be.changed=Lo stato non può essere cambiato. +invalid.status.transition=Transizione di stato non valida. # Login-related messages login.successfully=Accesso effettuato con successo.