From 452a661389da3f4efa2645709fcc156f5781cf49 Mon Sep 17 00:00:00 2001 From: piyuskag Date: Sat, 26 Oct 2024 12:11:30 +0530 Subject: [PATCH 01/13] Communication amend test. --- .../constants/GepafinConstant.java | 7 + .../dao/CommunicationAmendmentDao.java | 126 ++++++++++++++++++ .../ApplicationAmendmentRequestEntity.java | 37 +++++ .../CommunicationAmendmentEntity.java | 31 +++++ .../request/CommunicationRequestBean.java | 11 ++ .../response/CommunicationResponseBean.java | 11 ++ .../CommunicationAmendmentRepository.java | 14 ++ .../CommunicationAmendmentService.java | 17 +++ .../CommunicationAmendmentServiceImpl.java | 38 ++++++ .../api/ApplicationAmendmentRepository.java | 15 +++ .../rest/api/CommunicationAmendmentApi.java | 67 ++++++++++ .../CommunicationAmendmentController.java | 57 ++++++++ .../db/changelog/db.changelog-1.0.0.xml | 60 ++++++++- 13 files changed, 489 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/CommunicationAmendmentDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/CommunicationAmendmentEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/CommunicationRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/CommunicationAmendmentRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/CommunicationAmendmentService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationAmendmentServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationAmendmentApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationAmendmentController.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index bdcf563f..37768891 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -260,5 +260,12 @@ public class GepafinConstant { public static final String S3_PATH_CONFIG_DUPLICATE_TYPE_ALREADY_EXIST ="s3.path.config.already.exist."; public static final String S3_PATH_GENERATION_ERROR_MSG ="s3.path.config.already.exist."; public static final String INVALID_APPLICATION_STATUS = "invalid.application.status"; + + public static final String COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS = "added.comment.to.amendment.request.success"; + public static final String AMENDMENT_NOT_FOUND = "amendment.not.found"; + public static final String COMMENT_NOT_FOUND = "comment.not.found"; + public static final String COMMENT_UPDATED_SUCCESS_MSG = "comment.updated.successfully"; + public static final String COMMENT_DELETED_SUCCESS_MSG = "comment.deleted.successfully"; + public static final String COMMENT_NOT_ASSOCIATE_WITH_AMENDMENT_ID_ERROR_MSG = "comment.not.associate.with.amendment"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationAmendmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationAmendmentDao.java new file mode 100644 index 00000000..e5369f1d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationAmendmentDao.java @@ -0,0 +1,126 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +import net.gepafin.tendermanagement.entities.CommunicationAmendmentEntity; +import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; +import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; +import net.gepafin.tendermanagement.repositories.CommunicationAmendmentRepository; +import net.gepafin.tendermanagement.web.rest.api.ApplicationAmendmentRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.Instant; +import java.util.Optional; + +@Component +public class CommunicationAmendmentDao { + private static final Logger log = LoggerFactory.getLogger(CommunicationAmendmentDao.class); + + @Autowired + CommunicationAmendmentRepository communicationAmendmentRepository; + + @Autowired + ApplicationAmendmentRepository applicationAmendmentRepository; + + // @Autowired + // ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository; + + public CommunicationResponseBean addCommentToAmendmentRequest(CommunicationRequestBean communicationReq) { + + log.info("Adding communication request..."); + + // Fetch amendment request by ID to set the relationship + ApplicationAmendmentRequestEntity amendmentRequest = applicationAmendmentRepository + .findAmendmentById(communicationReq.getAmendmentId()); + // Create and populate CommunicationAmendmentEntity + CommunicationAmendmentEntity communicationAmendmentEntity = new CommunicationAmendmentEntity(); + communicationAmendmentEntity.setAmendmentRequest(amendmentRequest); + communicationAmendmentEntity.setCommunicationTitle(communicationReq.getTitle()); + communicationAmendmentEntity.setCommunicationComment(communicationReq.getComment()); + communicationAmendmentEntity.setIsDeleted(false); + + // Save the communication amendment entity + communicationAmendmentEntity = communicationAmendmentRepository.save(communicationAmendmentEntity); + log.info("Added comment: {}", communicationAmendmentEntity); + + // Convert and return the response bean + return convertToCommunicationResponseBean(communicationAmendmentEntity); + } + + public String deleteCommunicationAmendmentComment(Long amendmentId, Long commentId) { + // Optional amendmentData = communicationAmendmentRepository.findById(amendmentId); + // if(amendmentData.isEmpty()) { + // throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.COMMENT_NOT_ASSOCIATE_WITH_AMENDMENT_ID_ERROR_MSG)); + // } + Optional data = communicationAmendmentRepository.findById(commentId); + if (data.isEmpty()) { + throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.COMMENT_NOT_FOUND)); + } + communicationAmendmentRepository.deleteById(commentId); + return "Deleted Comment Successfully."; + } + public CommunicationResponseBean updateCommunicationAmendment(CommunicationRequestBean communicationRequestBean) { + + log.info("Updating communication comment..."); + CommunicationAmendmentEntity communicationAmendmentEntity = convertToCommunicationAmendmentEntity(communicationRequestBean); + communicationAmendmentEntity = communicationAmendmentRepository.save(communicationAmendmentEntity); + log.info("Updated Comment {}", communicationAmendmentEntity); + return convertToCommunicationResponseBean(communicationAmendmentEntity); + + } + public CommunicationResponseBean getAmendmentComments(Long amendmentId, Long commentId) { + // Optional amendmentData = communicationAmendmentRepository.findById(amendmentId); + // if(amendmentData.isEmpty()) { + // throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.AMENDMENT_NOT_FOUND)); + // } + CommunicationAmendmentEntity commentData = communicationAmendmentRepository.findCommentsById(commentId); + CommunicationResponseBean data = convertToCommunicationResponseBean1(commentData); + return data; + + } + private CommunicationResponseBean convertToCommunicationResponseBean(CommunicationAmendmentEntity entity) { + + CommunicationResponseBean response = new CommunicationResponseBean(); + response.setComment(entity.getCommunicationComment()); + response.setCommunicationAddedDate(Instant.now()); + return response; + } + private CommunicationResponseBean convertToCommunicationResponseBean1(CommunicationAmendmentEntity entity) { + + CommunicationResponseBean response = new CommunicationResponseBean(); + response.setComment(entity.getCommunicationComment()); + response.setCommunicationAddedDate(Instant.now()); + return response; + } + + private CommunicationAmendmentEntity convertToCommunicationAmendmentEntity(CommunicationRequestBean communicationReq) { + + CommunicationAmendmentEntity communicationAmendmentEntity = new CommunicationAmendmentEntity(); + ApplicationAmendmentRequestEntity entity = applicationAmendmentRepository.findAmendmentById(communicationReq.getAmendmentId()); + if (entity == null) { + throw new CustomValidationException(Status.NOT_FOUND, "Amendment Request not found for id: " + communicationReq.getAmendmentId()); + } + communicationAmendmentEntity.setAmendmentRequest(entity); + communicationAmendmentEntity.setCommunicationTitle(communicationReq.getComment()); + communicationAmendmentEntity.setCommunicationComment(communicationReq.getComment()); + return communicationAmendmentEntity; + } + public ApplicationAmendmentRequestEntity getAmendmentRequestById(Long id) { + + if(id==null){ + throw new CustomValidationException(Status.BAD_REQUEST, "Please provide amendmentId" + null); + } + ApplicationAmendmentRequestEntity applicationAmendmentData = applicationAmendmentRepository.findAmendmentById(id); + if(Boolean.FALSE.equals(applicationAmendmentData)){ + throw new CustomValidationException(Status.NOT_FOUND, "Amendment Request not found for id: " + applicationAmendmentData.getId()); + } + return applicationAmendmentData; + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java new file mode 100644 index 00000000..8e36d49d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java @@ -0,0 +1,37 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.Entity; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import lombok.Data; + +import java.util.List; + +@Entity +@Table(name = "application_amendment_request") +@Data +public class ApplicationAmendmentRequestEntity extends BaseEntity { + + @Column(name = "NOTE") + private String note; + + @Column(name = "RESPONSE_DAYS") + private Long responseDays; + + @Column(name = "IS_NOTIFICATION") + private Boolean isNotification; + + @Column(name = "IS_EMAIL") + private Boolean isEmail; + + @ElementCollection + @Column(name = "FIELD_ID") + private List fieldId; + + @OneToMany(mappedBy = "amendmentRequest", cascade = CascadeType.ALL) + private List communicationAmendmentEntities; +} + diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CommunicationAmendmentEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CommunicationAmendmentEntity.java new file mode 100644 index 00000000..0665df52 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/CommunicationAmendmentEntity.java @@ -0,0 +1,31 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.Data; + +import java.util.Optional; + +@Entity +@Table(name = "communication_amendment") +@Data +public class CommunicationAmendmentEntity extends BaseEntity { + + @Column(name = "COMMUNICATION_TITLE") + private String communicationTitle; + + @Column(name = "COMMUNICATION_COMMENT") + private String communicationComment; + + @Column(name = "IS_DELETED") + private Boolean isDeleted; + + @ManyToOne + @JoinColumn(name = "AMENDMENT_ID", referencedColumnName = "id", nullable = false) + private ApplicationAmendmentRequestEntity amendmentRequest; + +} + diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CommunicationRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/CommunicationRequestBean.java new file mode 100644 index 00000000..512b39be --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CommunicationRequestBean.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class CommunicationRequestBean { + private String title; + private String comment; + private Long amendmentId; +} + diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java new file mode 100644 index 00000000..ae69e24c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.time.Instant; + +@Data +public class CommunicationResponseBean { + private Instant communicationAddedDate; + private String comment; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CommunicationAmendmentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CommunicationAmendmentRepository.java new file mode 100644 index 00000000..591e633e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CommunicationAmendmentRepository.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.CommunicationAmendmentEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.Optional; + +public interface CommunicationAmendmentRepository extends JpaRepository { + + @Query("Select c from CommunicationAmendmentEntity c Where c.id = :id") + CommunicationAmendmentEntity findCommentsById(@Param("id") Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/CommunicationAmendmentService.java b/src/main/java/net/gepafin/tendermanagement/service/CommunicationAmendmentService.java new file mode 100644 index 00000000..a19f134f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/CommunicationAmendmentService.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.service; + +import net.gepafin.tendermanagement.entities.CommunicationAmendmentEntity; +import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; +import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; + +import java.util.Optional; + +public interface CommunicationAmendmentService { + CommunicationResponseBean addCommentToAmendmentRequest(CommunicationRequestBean communicationRequestBean); + + String deleteCommunicationAmendmentComment(Long amendmentId, Long commentId); + + CommunicationResponseBean updateCommunicationAmendment(CommunicationRequestBean communicationRequestBean); + + CommunicationResponseBean getAmendmentComments(Long id, Long commentId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationAmendmentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationAmendmentServiceImpl.java new file mode 100644 index 00000000..011999b0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationAmendmentServiceImpl.java @@ -0,0 +1,38 @@ +package net.gepafin.tendermanagement.service.impl; + +import net.gepafin.tendermanagement.dao.CommunicationAmendmentDao; +import net.gepafin.tendermanagement.entities.CommunicationAmendmentEntity; +import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; +import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; +import net.gepafin.tendermanagement.service.CommunicationAmendmentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class CommunicationAmendmentServiceImpl implements CommunicationAmendmentService { + + @Autowired + CommunicationAmendmentDao communicationAmendmentDao; + + @Override + public CommunicationResponseBean addCommentToAmendmentRequest(CommunicationRequestBean communicationRequestBean) { + return communicationAmendmentDao.addCommentToAmendmentRequest(communicationRequestBean); + } + @Override + public String deleteCommunicationAmendmentComment(Long amendmentId, Long commentId) { + + return communicationAmendmentDao.deleteCommunicationAmendmentComment(amendmentId, commentId); + } + @Override + public CommunicationResponseBean updateCommunicationAmendment(CommunicationRequestBean communicationRequestBean) { + + return communicationAmendmentDao.updateCommunicationAmendment(communicationRequestBean); + } + @Override + public CommunicationResponseBean getAmendmentComments(Long id, Long commentId) { + + return communicationAmendmentDao.getAmendmentComments(id, commentId); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRepository.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRepository.java new file mode 100644 index 00000000..d2a3984e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRepository.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import feign.Param; +import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.util.Optional; + +public interface ApplicationAmendmentRepository extends JpaRepository { + + @Query("SELECT app FROM ApplicationAmendmentRequestEntity app WHERE app.id = :id") + ApplicationAmendmentRequestEntity findAmendmentById(@Param("id") Long id); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationAmendmentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationAmendmentApi.java new file mode 100644 index 00000000..35ff7d51 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationAmendmentApi.java @@ -0,0 +1,67 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.CommunicationAmendmentEntity; +import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; +import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.data.repository.query.Param; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; + +import java.util.Optional; + +@Validated +public interface CommunicationAmendmentApi { + @Operation(summary = "Api to create communication amendment comment", 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) })) }) + @PostMapping(value = "", produces = { "application/json" }) + ResponseEntity> addCommentToAmendmentRequest(HttpServletRequest request, @Parameter CommunicationRequestBean communicationResponseBean); + + @Operation(summary = "Api to Get Amendment request comment", 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) })) }) + @GetMapping(value = "/{amendmentId}/{commentId}", produces = { "application/json" }) + ResponseEntity> getAmendmentComments(HttpServletRequest request, @Param(value = "amendmentId") Long id, + @Param(value = "commentId") Long commentId); + + @Operation(summary = "Api to update communication comments", 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) })) }) + @PutMapping(value = "", produces = { "application/json" }) + ResponseEntity> updateCommunicationAmendment(HttpServletRequest request, @Parameter CommunicationRequestBean communicationResponseBean); + + @Operation(summary = "Api to delete communication comments", 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) })) }) + @DeleteMapping(value = "/{amendmentId}/{commentId}", produces = { "application/json" }) + ResponseEntity> deleteApplicationAmendmentComment(HttpServletRequest request, @Param(value = "amendmentId")Long amendmentId, @Param(value = "commentId")Long commentId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationAmendmentController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationAmendmentController.java new file mode 100644 index 00000000..8e78df76 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationAmendmentController.java @@ -0,0 +1,57 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CommunicationAmendmentEntity; +import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; +import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.CommunicationAmendmentService; +import net.gepafin.tendermanagement.web.rest.api.CommunicationAmendmentApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Optional; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/communication-amendment}") +public class CommunicationAmendmentController implements CommunicationAmendmentApi { + + @Autowired + CommunicationAmendmentService communicationAmendmentService; + + @Override + public ResponseEntity> addCommentToAmendmentRequest(HttpServletRequest request, CommunicationRequestBean communicationRequestBean) { + + CommunicationResponseBean communicationResponseBean = communicationAmendmentService.addCommentToAmendmentRequest(communicationRequestBean); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS))); + } + @Override + public ResponseEntity> getAmendmentComments(HttpServletRequest request, Long id, Long commentId) { + + CommunicationResponseBean communicationResponseBean = communicationAmendmentService.getAmendmentComments(id, commentId); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS))); + } + @Override + public ResponseEntity> updateCommunicationAmendment(HttpServletRequest request, CommunicationRequestBean communicationRequestBean) { + + CommunicationResponseBean communicationResponseBean = communicationAmendmentService.updateCommunicationAmendment(communicationRequestBean); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS))); + } + @Override + public ResponseEntity> deleteApplicationAmendmentComment(HttpServletRequest request, Long applicationAmendId, Long commentId) { + + String communicationResponseBean = communicationAmendmentService.deleteCommunicationAmendmentComment(applicationAmendId, commentId); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS))); + } + +} diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 72224de3..133473c0 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1483,6 +1483,62 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From f152241e15a046ffe667523fd441cf159e425832 Mon Sep 17 00:00:00 2001 From: harish Date: Sat, 26 Oct 2024 13:53:21 +0530 Subject: [PATCH 02/13] Created CRUD for ApplicationEvaluation Entity --- .../constants/GepafinConstant.java | 8 + .../dao/ApplicationEvaluationDao.java | 554 ++++++++++++++++++ .../entities/ApplicationEvaluationEntity.java | 35 ++ .../ApplicationEvaluationStatusTypeEnum.java | 20 + .../request/ApplicationEvaluationRequest.java | 15 + .../model/request/ChecklistRequest.java | 9 + .../model/request/CriteriaRequest.java | 10 + .../model/request/FieldRequest.java | 9 + .../UpdateApplicationEvaluationRequest.java | 2 + .../ApplicationEvaluationResponse.java | 27 + .../model/response/ChecklistResponse.java | 11 + .../model/response/CriteriaResponse.java | 14 + .../model/response/FieldResponse.java | 11 + .../ApplicationEvaluationRepository.java | 14 + .../ApplicationFormFieldRepository.java | 11 + .../repositories/CallRepository.java | 4 + ...CallTargetAudienceChecklistRepository.java | 1 + .../EvaluationCriteriaRepository.java | 2 + .../service/ApplicationEvaluationService.java | 22 + .../ApplicationEvaluationServiceImpl.java | 60 ++ .../gepafin/tendermanagement/util/Utils.java | 20 + .../tendermanagement/util/Validator.java | 10 +- .../rest/api/ApplicationEvaluationApi.java | 73 +++ .../ApplicationEvaluationApiController.java | 62 ++ .../db/changelog/db.changelog-1.0.0.xml | 54 ++ src/main/resources/message_en.properties | 7 + src/main/resources/message_it.properties | 7 + 27 files changed, 1070 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/ApplicationEvaluationStatusTypeEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ChecklistRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/CriteriaRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/FieldRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/UpdateApplicationEvaluationRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ChecklistResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/CriteriaResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/FieldResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 38121a98..e1ff2e61 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -233,5 +233,13 @@ public class GepafinConstant { public static final String CANNOT_DELETE_COMPANY_WITH_APPLICATION_SUBMITT = "application.in.submit.status.cannot.delete.company"; public static final String GET_USERS_SUCCESS_MSG = "get.users.success.msg"; public static final String CANNOT_CREATE_BENEFICIARY_USER="cannot.create.beneficiary.user"; + public static final String EVALUATION_CREATED_SUCCESSFULLY = "evaluation.created.successfully"; + public static final String EVALUATION_UPDATED_SUCCESSFULLY = "evaluation.updated.successfully"; + public static final String EVALUATION_FETCHED_SUCCESSFULLY = "evaluation.fetched.successfully"; + public static final String EVALUATION_DELETED_SUCCESSFULLY = "evaluation.deleted.successfully"; + public static final String EVALUATIONS_FETCHED_SUCCESSFULLY = "evaluations.fetched.successfully"; + public static final String APPLICATION_EVALUATION_NOT_FOUND = "application.evaluation.not.found"; + public static final String APPLICATION_EVALUATION_STATUS_UPDATED_SUCCESSFULLY = "application.evaluation.status.updated.successfully"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java new file mode 100644 index 00000000..aa50f953 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -0,0 +1,554 @@ +package net.gepafin.tendermanagement.dao; + +import com.fasterxml.jackson.core.type.TypeReference; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; +import net.gepafin.tendermanagement.enums.DocumentTypeEnum; +import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.request.ChecklistRequest; +import net.gepafin.tendermanagement.model.request.CriteriaRequest; +import net.gepafin.tendermanagement.model.request.FieldRequest; +import net.gepafin.tendermanagement.model.response.*; +import net.gepafin.tendermanagement.repositories.*; +import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; + +@Component +public class ApplicationEvaluationDao { + + @Autowired + private ApplicationEvaluationRepository applicationEvaluationRepository; + @Autowired + private ApplicationService applicationService; + @Autowired + private CallRepository callRepository; + @Autowired + private ApplicationRepository applicationRepository; + @Autowired + private UserService userService; + @Autowired + private EvaluationCriteriaRepository evaluationCriteriaRepository; + @Autowired + private FormRepository formRepository; + @Autowired + private CallTargetAudienceChecklistRepository callTargetAudienceChecklistRepository; + @Autowired + private DocumentRepository documentRepository; + @Autowired + private ApplicationFormRepository applicationFormRepository; + @Autowired + private ApplicationFormFieldRepository applicationFormFieldRepository; + + private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req) { + ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); + ApplicationEntity application = applicationService.validateApplication(req.getApplicationId()); + entity.setApplication(application); + entity.setUserId(user.getId()); + entity.setCriteria(Utils.convertObjectToJson(req.getCriteria())); + entity.setChecklist(Utils.convertObjectToJson(req.getChecklist())); + entity.setFile(Utils.convertObjectToJson(req.getField())); + entity.setNote(req.getNote()); + entity.setIsDeleted(false); + entity.setStatus(ApplicationEvaluationStatusTypeEnum.DRAFT.getValue()); + return entity; + } + + private ApplicationEvaluationResponse convertToResponse(ApplicationEvaluationEntity entity) { + ApplicationEvaluationResponse response = new ApplicationEvaluationResponse(); + populateBasicDetails(entity, response); + + CallEntity call = callRepository.findCallEntityByApplicationId(entity.getApplication().getId()); + List evaluationCriterias = evaluationCriteriaRepository.findByCallId(call.getId()); + List checklistEntities = callTargetAudienceChecklistRepository.findByCallId(call.getId()); + List applicationFormEntities = applicationFormRepository.findByApplicationId(entity.getApplication().getId()); + + setCriteriaResponses(entity, response, evaluationCriterias); + setChecklistResponses(entity, response, checklistEntities); + setFieldResponses(entity, response, applicationFormEntities); + + setApplicationDetails(response, entity); + + return response; + } + + private void populateBasicDetails(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response) { + response.setId(entity.getId()); + response.setApplicationId(entity.getApplication().getId()); + response.setNote(entity.getNote()); + response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(entity.getStatus())); + response.setCreatedDate(entity.getCreatedDate()); + response.setUpdatedDate(entity.getUpdatedDate()); + } + + private void setCriteriaResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List evaluationCriterias) { + List criteriaResponsesFromEntity = entity.getCriteria() != null + ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() {}) + : new ArrayList<>(); + + List criteriaResponsesFromDB = getCriteriaResponse(entity.getApplication().getId()); + addMissingCriteriaResponses(criteriaResponsesFromEntity, criteriaResponsesFromDB); + + criteriaResponsesFromEntity.forEach(criteriaResponse -> { + EvaluationCriteriaEntity matchingEvaluationCriteria = evaluationCriterias.stream() + .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())) + .findFirst() + .orElse(null); + + if (matchingEvaluationCriteria != null) { + criteriaResponse.setLabel(matchingEvaluationCriteria.getLookupData().getValue()); + criteriaResponse.setMaxScore(matchingEvaluationCriteria.getScore()); + } + }); + + response.setCriteria(criteriaResponsesFromEntity); + } + + private void addMissingCriteriaResponses(List criteriaResponsesFromEntity, List criteriaResponsesFromDB) { + Set existingCriteriaIds = criteriaResponsesFromEntity.stream() + .map(CriteriaResponse::getId) + .collect(Collectors.toSet()); + + for (CriteriaResponse dbResponse : criteriaResponsesFromDB) { + if (!existingCriteriaIds.contains(dbResponse.getId())) { + criteriaResponsesFromEntity.add(dbResponse); + } + } + } + + private void setChecklistResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List checklistEntities) { + List checklistResponsesFromEntity = entity.getChecklist() != null + ? Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() {}) + : new ArrayList<>(); + + List checklistResponsesFromDB = getChecklistResponse(entity.getApplication().getId()); + addMissingChecklistResponses(checklistResponsesFromEntity, checklistResponsesFromDB); + + checklistResponsesFromEntity.forEach(checklistResponse -> { + CallTargetAudienceChecklistEntity matchingChecklist = checklistEntities.stream() + .filter(checklistEntity -> checklistEntity.getId().equals(checklistResponse.getId())) + .findFirst() + .orElse(null); + + if (matchingChecklist != null) { + checklistResponse.setLabel(matchingChecklist.getLookupData().getValue()); + } + }); + + response.setChecklist(checklistResponsesFromEntity); + } + + private void addMissingChecklistResponses(List checklistResponsesFromEntity, List checklistResponsesFromDB) { + Set existingChecklistIds = checklistResponsesFromEntity.stream() + .map(ChecklistResponse::getId) + .collect(Collectors.toSet()); + + for (ChecklistResponse dbResponse : checklistResponsesFromDB) { + if (!existingChecklistIds.contains(dbResponse.getId())) { + checklistResponsesFromEntity.add(dbResponse); + } + } + } + + private void setFieldResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List applicationFormEntities) { + List fieldResponsesFromEntity = entity.getFile() != null + ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() {}) + : new ArrayList<>(); + + List fieldResponsesFromDB = getFieldResponses(entity.getApplication().getId()); + addMissingFieldResponses(fieldResponsesFromEntity, fieldResponsesFromDB); + + fieldResponsesFromEntity.forEach(fieldResponse -> { + applicationFormEntities.forEach(applicationForm -> { + FormEntity formEntity = applicationForm.getForm(); + if (formEntity != null) { + List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); + contentResponseBeans.forEach(contentResponseBean -> { + if ("fileupload".equals(contentResponseBean.getName()) && contentResponseBean.getId().equals(fieldResponse.getId())) { + fieldResponse.setLabel(contentResponseBean.getLabel()); + } + }); + } + }); + }); + + response.setFiles(fieldResponsesFromEntity); + } + + private void addMissingFieldResponses(List fieldResponsesFromEntity, List fieldResponsesFromDB) { + Set existingFieldIds = fieldResponsesFromEntity.stream() + .map(FieldResponse::getId) + .collect(Collectors.toSet()); + + for (FieldResponse dbResponse : fieldResponsesFromDB) { + if (!existingFieldIds.contains(dbResponse.getId())) { + fieldResponsesFromEntity.add(dbResponse); + } + } + } + + private void setApplicationDetails(ApplicationEvaluationResponse response, ApplicationEvaluationEntity entity) { + ApplicationEntity application = applicationService.validateApplication(entity.getApplication() != null ? entity.getApplication().getId() : null); + UserEntity user = userService.validateUser(application.getUserId()); + String firstName = user.getFirstName() != null ? user.getFirstName() : ""; + String lastName = user.getLastName() != null ? user.getLastName() : ""; + + String beneficiary = String.join(" ", firstName, lastName).trim(); + response.setBeneficiary(beneficiary); + + response.setCallName(application.getCall().getName()); + response.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null); + response.setSubmissionDate(application.getSubmissionDate()); + response.setEvaluationDate(LocalDateTime.now()); + } + + + public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(UserEntity user, ApplicationEvaluationRequest req) { + Optional existingEntityOptional = applicationEvaluationRepository.findByApplicationId(req.getApplicationId()); + ApplicationEvaluationEntity entity; + + if (existingEntityOptional.isPresent()) { + entity = existingEntityOptional.get(); + entity.setCriteria(Utils.convertObjectToJson(processCriteria(entity, req))); + entity.setChecklist(Utils.convertObjectToJson(processChecklist(entity, req))); + entity.setFile(Utils.convertObjectToJson(processField(entity, req))); + entity.setIsDeleted(false); + setIfUpdated(entity::getNote, entity::setNote, req.getNote()); + } else { + entity = convertToEntity(user, req); + } + + ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(entity); + return convertToResponse(savedEntity); + } + private List processCriteria(ApplicationEvaluationEntity entity, ApplicationEvaluationRequest req) { + List existingCriteriaList = entity.getCriteria() != null ? + Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() {}) : new ArrayList<>(); + + Map existingCriteriaMap = existingCriteriaList.stream() + .collect(Collectors.toMap(CriteriaResponse::getId, criteria -> criteria)); + + List updatedCriteriaList = req.getCriteria().stream() + .map(incoming -> { + CriteriaRequest request = new CriteriaRequest(); + request.setId(incoming.getId()); + request.setScore(incoming.getScore()); + request.setValid(incoming.getValid()); + + CriteriaResponse existingCriteria = existingCriteriaMap.get(incoming.getId()); + if (existingCriteria != null) { + request.setScore(incoming.getScore() != null ? incoming.getScore() : existingCriteria.getScore()); + request.setValid(incoming.getValid() != null ? incoming.getValid() : existingCriteria.getValid()); + } + return request; + }) + .collect(Collectors.toList()); + + List missingCriteriaRequests = existingCriteriaList.stream() + .filter(existing -> !updatedCriteriaList.stream() + .map(CriteriaRequest::getId) + .toList() + .contains(existing.getId())) + .map(existing -> { + CriteriaRequest request = new CriteriaRequest(); + request.setId(existing.getId()); + request.setScore(existing.getScore()); + request.setValid(existing.getValid()); + return request; + }) + .toList(); + + updatedCriteriaList.addAll(missingCriteriaRequests); + return updatedCriteriaList; + } + + private List processChecklist(ApplicationEvaluationEntity entity, ApplicationEvaluationRequest req) { + List existingChecklistList = entity.getChecklist() != null ? + Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() {}) : new ArrayList<>(); + + Map existingChecklistMap = existingChecklistList.stream() + .collect(Collectors.toMap(ChecklistResponse::getId, checklist -> checklist)); + + List updatedChecklistList = req.getChecklist().stream() + .map(incoming -> { + ChecklistRequest request = new ChecklistRequest(); + request.setId(incoming.getId()); + request.setValid(incoming.getValid()); + + ChecklistResponse existingChecklist = existingChecklistMap.get(incoming.getId()); + if (existingChecklist != null) { + request.setValid(incoming.getValid() != null ? incoming.getValid() : existingChecklist.getValid()); + } + return request; + }) + .collect(Collectors.toList()); + + List missingChecklistRequests = existingChecklistList.stream() + .filter(existing -> !updatedChecklistList.stream() + .map(ChecklistRequest::getId) + .toList() + .contains(existing.getId())) + .map(existing -> { + ChecklistRequest request = new ChecklistRequest(); + request.setId(existing.getId()); + request.setValid(existing.getValid()); + return request; + }) + .toList(); + + updatedChecklistList.addAll(missingChecklistRequests); + return updatedChecklistList; + } + + private List processField(ApplicationEvaluationEntity entity, ApplicationEvaluationRequest req) { + List existingFieldList = entity.getFile() != null ? + Utils.convertJsonToList(entity.getFile(), new TypeReference>() {}) : new ArrayList<>(); + + Map existingFieldMap = existingFieldList.stream() + .collect(Collectors.toMap(FieldResponse::getId, field -> field)); + + List updatedFieldList = req.getField().stream() + .map(incoming -> { + FieldRequest request = new FieldRequest(); + request.setId(incoming.getId()); + request.setValid(incoming.getValid()); + + FieldResponse existingField = existingFieldMap.get(incoming.getId()); + if (existingField != null) { + request.setValid(incoming.getValid() != null ? incoming.getValid() : existingField.getValid()); + } + return request; + }) + .collect(Collectors.toList()); + + List missingFieldRequests = existingFieldList.stream() + .filter(existing -> !updatedFieldList.stream() + .map(FieldRequest::getId) + .toList() + .contains(existing.getId())) + .map(existing -> { + FieldRequest request = new FieldRequest(); + request.setId(existing.getId()); + request.setValid(existing.getValid()); + return request; + }) + .toList(); + + updatedFieldList.addAll(missingFieldRequests); + return updatedFieldList; + } + + private ApplicationEvaluationEntity validateApplicationEvaluation(Long id) { + Optional entityOptional = applicationEvaluationRepository.findById(id); + if (entityOptional.isEmpty()) { + throw new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_EVALUATION_NOT_FOUND, id)); + } + return entityOptional.get(); + } + + + public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(UserEntity user, Long applicationId) { + applicationService.validateApplication(applicationId); + Optional entityOptional = applicationEvaluationRepository.findByApplicationId(applicationId); + return entityOptional.map(this::convertToResponse).orElseGet(() -> getEvaluationResponseByApplicationid(user, applicationId)); + + } + public ApplicationEvaluationResponse getEvaluationResponseByApplicationid(UserEntity user, Long applicationId) { + ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); + ApplicationEvaluationResponse response = new ApplicationEvaluationResponse(); + + CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); + List evaluationCriterias = evaluationCriteriaRepository.findByCallId(call.getId()); + List checklistEntities = callTargetAudienceChecklistRepository.findByCallId(call.getId()); + List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationId); + + response.setApplicationId(applicationId); + response.setNote(null); + response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.DRAFT.getValue())); + + setCriteriaResponses(entity, applicationId, response, evaluationCriterias); + setChecklistResponses(entity, applicationId, response, checklistEntities); + setFileResponses(entity, applicationId, response, applicationFormEntities); + + setApplicationDetails(response, applicationId, user); + + return response; + } + + private void setCriteriaResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, List evaluationCriterias) { + List criteriaResponses = entity.getCriteria() != null + ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() {}) + : getCriteriaResponse(applicationId); + + criteriaResponses.forEach(criteriaResponse -> { + EvaluationCriteriaEntity matchingEvaluationCriteria = evaluationCriterias.stream() + .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())) + .findFirst() + .orElse(null); + + if (matchingEvaluationCriteria != null) { + criteriaResponse.setLabel(matchingEvaluationCriteria.getLookupData().getValue()); + criteriaResponse.setMaxScore(matchingEvaluationCriteria.getScore()); + } + }); + + response.setCriteria(criteriaResponses); + } + + private void setChecklistResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, List checklistEntities) { + List checklistResponses = entity.getChecklist() != null + ? Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() {}) + : getChecklistResponse(applicationId); + + checklistResponses.forEach(checklistResponse -> { + CallTargetAudienceChecklistEntity matchingChecklist = checklistEntities.stream() + .filter(checklistEntity -> checklistEntity.getId().equals(checklistResponse.getId())) + .findFirst() + .orElse(null); + + if (matchingChecklist != null) { + checklistResponse.setLabel(matchingChecklist.getLookupData().getValue()); + } + }); + + response.setChecklist(checklistResponses); + } + + private void setFileResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, List applicationFormEntities) { + List fieldResponses = entity.getFile() != null + ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() {}) + : getFieldResponses(applicationId); + + fieldResponses.forEach(fieldResponse -> { + applicationFormEntities.forEach(applicationForm -> { + FormEntity formEntity = applicationForm.getForm(); + if (formEntity != null) { + List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); + contentResponseBeans.forEach(contentResponseBean -> { + if ("fileupload".equals(contentResponseBean.getName()) && contentResponseBean.getId().equals(fieldResponse.getId())) { + fieldResponse.setLabel(contentResponseBean.getLabel()); + } + }); + } + }); + }); + + response.setFiles(fieldResponses); + } + + private void setApplicationDetails(ApplicationEvaluationResponse response, Long applicationId, UserEntity user) { + ApplicationEntity application = applicationService.validateApplication(applicationId); + userService.validateUser(application.getUserId()); + String firstName = user.getFirstName() != null ? user.getFirstName() : ""; + String lastName = user.getLastName() != null ? user.getLastName() : ""; + + String beneficiary = String.join(" ", firstName, lastName).trim(); + response.setBeneficiary(beneficiary); + + response.setCallName(application.getCall().getName()); + response.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null); + response.setSubmissionDate(application.getSubmissionDate()); + response.setEvaluationDate(LocalDateTime.now()); + } + + List getCriteriaResponse(Long applicationId){ CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); + List evaluationCriterias = evaluationCriteriaRepository.findByCallId(call.getId()); + List criteriaResponses = evaluationCriterias.stream().map(criteria -> { + CriteriaResponse response = new CriteriaResponse(); + response.setId(criteria.getId()); + response.setLabel(criteria.getLookupData().getValue()); + response.setScore(null); + response.setMaxScore(criteria.getScore()); + response.setValid(null); + + return response; + }).collect(Collectors.toList()); + + return criteriaResponses; + } + + List getChecklistResponse(Long applicationId){ CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); + List checklistEntities = callTargetAudienceChecklistRepository.findByCallId(call.getId()); + List checklistResponses = checklistEntities.stream().map(checklist -> { + ChecklistResponse response = new ChecklistResponse(); + response.setId(checklist.getId()); + response.setLabel(checklist.getLookupData().getValue()); + response.setValid(null); + + return response; + }).collect(Collectors.toList()); + + return checklistResponses; + } + + public List getFieldResponses(Long applicationId) { + List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationId); + List fieldResponses = new ArrayList<>(); + + for (ApplicationFormEntity applicationForm : applicationFormEntities) { + FormEntity formEntity = applicationForm.getForm(); + + if (formEntity != null) { + List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); + + for (ContentResponseBean contentResponseBean : contentResponseBeans) { + if ("fileupload".equals(contentResponseBean.getName())) { + String fieldId = contentResponseBean.getId(); + Long formId = applicationForm.getId(); + + Optional optionalFormField = applicationFormFieldRepository + .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(fieldId, formId, applicationId); + + if (optionalFormField.isPresent()) { + ApplicationFormFieldEntity formField = optionalFormField.get(); + + if (formField.getFieldValue() != null) { + FieldResponse fieldResponse = new FieldResponse(); + fieldResponse.setId(fieldId); + fieldResponse.setLabel(contentResponseBean.getLabel()); + fieldResponse.setValid(null); + fieldResponses.add(fieldResponse); + } + } + } + } + } + } + + return fieldResponses; + } + + public void deleteById(Long id) { + ApplicationEvaluationEntity applicationEvaluationEntity= validateApplicationEvaluation(id); + applicationEvaluationEntity.setIsDeleted(true); + applicationEvaluationEntity=saveApplicationEvaluationEntity(applicationEvaluationEntity); + } + public ApplicationEvaluationEntity saveApplicationEvaluationEntity(ApplicationEvaluationEntity applicationEvaluationEntityData){ + return applicationEvaluationRepository.save(applicationEvaluationEntityData); + } + + public ApplicationEvaluationResponse updateApplicationEvaluationStatus(Long applicationId, ApplicationEvaluationStatusTypeEnum status) { + ApplicationEvaluationEntity existingEntity = validateApplicationEvaluation(applicationId); + if (status != null && !status.getValue().equals(existingEntity.getStatus())) { + existingEntity.setStatus(status.getValue()); + } + ApplicationEvaluationEntity updatedEntity = applicationEvaluationRepository.save(existingEntity); + return convertToResponse(updatedEntity); + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java new file mode 100644 index 00000000..32fe4648 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java @@ -0,0 +1,35 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; +@Data +@Entity +@Table(name = "application_evaluation") +public class ApplicationEvaluationEntity extends BaseEntity{ + + @ManyToOne + @JoinColumn(name = "APPLICATION_ID", nullable = true) + private ApplicationEntity application; + @Column(name = "user_id") + private Long userId; + + @Column(name = "criteria") + private String criteria; + + @Column(name = "checklist") + private String checklist; + + @Column(name = "file") + private String file; + @Column(name = "note") + private String note; + @Column(name = "status") + private String status; + + @Column(name="IS_DELETED") + private Boolean isDeleted; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationEvaluationStatusTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationEvaluationStatusTypeEnum.java new file mode 100644 index 00000000..b4bcb120 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationEvaluationStatusTypeEnum.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum ApplicationEvaluationStatusTypeEnum { + DRAFT("DRAFT"), + APPROVED("APPROVED"), + REJECTED("REJECTED"); + + private String value; + + ApplicationEvaluationStatusTypeEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java new file mode 100644 index 00000000..c1cfb8e1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; + +import java.util.List; +@Data +public class ApplicationEvaluationRequest { + + private Long applicationId; + private List criteria; + private List checklist; + private List field; + private String note; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ChecklistRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ChecklistRequest.java new file mode 100644 index 00000000..2d760ec2 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ChecklistRequest.java @@ -0,0 +1,9 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class ChecklistRequest { + private Long id; + private Boolean valid; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CriteriaRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/CriteriaRequest.java new file mode 100644 index 00000000..ada0d83c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CriteriaRequest.java @@ -0,0 +1,10 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class CriteriaRequest { + private Long id; + private Long score; + private Boolean valid; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/FieldRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/FieldRequest.java new file mode 100644 index 00000000..b3b5b3e1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/FieldRequest.java @@ -0,0 +1,9 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class FieldRequest { + private String id; + private Boolean valid; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateApplicationEvaluationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateApplicationEvaluationRequest.java new file mode 100644 index 00000000..16654fff --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateApplicationEvaluationRequest.java @@ -0,0 +1,2 @@ +package net.gepafin.tendermanagement.model.request;public class UpdateApplicationEvaluationRequest { +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java new file mode 100644 index 00000000..5da13e36 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -0,0 +1,27 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class ApplicationEvaluationResponse { + + + private Long id; + private Long applicationId; + private String note; + private ApplicationEvaluationStatusTypeEnum status; + private List criteria; + private List checklist; + private List files; + private LocalDateTime createdDate; + private LocalDateTime updatedDate; + private String beneficiary; + private Long protocolNumber; + private String callName; + private LocalDateTime submissionDate; + private LocalDateTime evaluationDate; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ChecklistResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ChecklistResponse.java new file mode 100644 index 00000000..a07bfb52 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ChecklistResponse.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +public class ChecklistResponse { + private Long id; + private String label; + private Boolean valid; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaResponse.java new file mode 100644 index 00000000..5a2d709f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaResponse.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class CriteriaResponse { + private Long id; + private String label; + private Long score; + private Long maxScore; + private Boolean valid; +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FieldResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/FieldResponse.java new file mode 100644 index 00000000..247d07e9 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FieldResponse.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +public class FieldResponse { + private String id; + private String label; + private Boolean valid; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java new file mode 100644 index 00000000..65c4d386 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface ApplicationEvaluationRepository extends JpaRepository { + Optional findByApplicationId(Long applicationId); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java index 89c70488..95968b75 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java @@ -23,5 +23,16 @@ public interface ApplicationFormFieldRepository extends JpaRepository findByFieldValueInAndApplicationFormApplicationId( List fieldValue, Long applicationId); + /** + * Find ApplicationFormField entity by Field ID, Form ID, and Application ID. + * + * @param fieldId The Field ID to search. + * @param formId The Form ID to search. + * @param applicationId The Application ID to search. + * @return Optional of ApplicationFormFieldEntity + */ + Optional findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + String fieldId, Long formId, Long applicationId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index 4e651fe0..08a0a862 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -25,4 +25,8 @@ public interface CallRepository extends JpaRepository { "FROM CallEntity c LEFT JOIN ApplicationEntity a ON c.id = a.call.id " + "GROUP BY c.name") List findApplicationsPerCall(); + + + @Query("SELECT c FROM CallEntity c JOIN ApplicationEntity a ON c.id = a.call.id WHERE a.id = :applicationId") + CallEntity findCallEntityByApplicationId(Long applicationId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java index 62da59a7..d092ea4a 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java @@ -17,4 +17,5 @@ public interface CallTargetAudienceChecklistRepository extends JpaRepository findById(@Param("id") Long id); List findByCallIdAndLookupDataTypeAndIsDeletedFalse(Long id, String type); + List findByCallId(Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java index b5b9a231..8b25fc1f 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/EvaluationCriteriaRepository.java @@ -16,4 +16,6 @@ public interface EvaluationCriteriaRepository extends JpaRepository findById(@Param("id") Long id); List findByCallIdAndLookupDataTypeAndIsDeletedFalse(Long callId, String type); + List findByCallId(Long callId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java new file mode 100644 index 00000000..5c1b448c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.request.UpdateApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; +import net.gepafin.tendermanagement.model.response.ApplicationResponse; + +import java.util.List; + +public interface ApplicationEvaluationService { + ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationRequest applicationEvaluationRequest); + void deleteApplicationEvaluation(HttpServletRequest request,Long id); + + ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId); + + ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long applicationEvaluationId, ApplicationEvaluationStatusTypeEnum status); + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java new file mode 100644 index 00000000..8848eca2 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -0,0 +1,60 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.ApplicationEvaluationDao; + +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.request.UpdateApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; +import net.gepafin.tendermanagement.model.response.ApplicationResponse; +import net.gepafin.tendermanagement.service.ApplicationEvaluationService; +import net.gepafin.tendermanagement.util.Validator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationService { + + @Autowired + private ApplicationEvaluationDao applicationEvaluationDao; + @Autowired + private Validator validator; + + @Override + @Transactional(rollbackFor = Exception.class) + public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationRequest req) { + Long userId = validator.getUserIdFromToken(request); + UserEntity user=validator.validatePreInstructor(request,userId); + return applicationEvaluationDao.createOrUpdateApplicationEvaluation(user,req); + } + + @Override + @Transactional(readOnly = true) + public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId) { + Long userId = validator.getUserIdFromToken(request); + UserEntity user=validator.validatePreInstructor(request,userId); + return applicationEvaluationDao.getApplicationEvaluationByApplicationId(user,applicationId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteApplicationEvaluation(HttpServletRequest request,Long id) { + Long userId = validator.getUserIdFromToken(request); + applicationEvaluationDao.deleteById(id); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long applicationId, ApplicationEvaluationStatusTypeEnum status) { + Long userId = validator.getUserIdFromToken(request); + validator.validatePreInstructor(request,userId); + return applicationEvaluationDao.updateApplicationEvaluationStatus(applicationId, status); + + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 767872ce..c57348a6 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.util; +import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; @@ -308,4 +309,23 @@ public class Utils { return new StringTokenizer(header, ",").nextToken().trim(); } + public static List convertJsonToList(String json, TypeReference> typeRef) { + ObjectMapper objectMapper = new ObjectMapper(); + try { + return objectMapper.readValue(json, typeRef); + } catch (IOException e) { + e.printStackTrace(); + return Collections.emptyList(); + } + } + + public static String convertObjectToJson(Object obj) { + try { + return new ObjectMapper().writeValueAsString(obj); + } catch (JsonProcessingException e) { + log.error("Failed to convert object to JSON: {}", e.getMessage(), e); + throw new RuntimeException("Failed to convert object to JSON", e); + } + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index bb7d4053..960004e9 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -95,9 +95,15 @@ public class Validator { return userService.validateUser(userId); } - private Long getUserIdFromToken(HttpServletRequest request) { + public Long getUserIdFromToken(HttpServletRequest request) { Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); return Long.parseLong(userInfo.get("userId").toString()); } - + public UserEntity validatePreInstructor(HttpServletRequest request, Long userId) { + UserEntity user = validateUser(request); + if(Boolean.FALSE.equals(RoleStatusEnum.ROLE_PRE_INSTRUCTOR.getValue().equals(user.getRoleEntity().getRoleType()))||Boolean.FALSE.equals(user.getId().equals(userId))) { + throw new ForbiddenAccessException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); + } + return userService.validateUser(userId); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java new file mode 100644 index 00000000..c5970bfa --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -0,0 +1,73 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.request.UpdateApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; +import net.gepafin.tendermanagement.model.response.ApplicationResponse; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +public interface ApplicationEvaluationApi { + + @Operation(summary = "API to create ApplicationEvaluation", + 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 = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PostMapping(value = "/", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> createOrUpdateApplicationEvaluation(HttpServletRequest request, + @Parameter(description = "ApplicationEvaluation request object", required = true) @Valid @RequestBody ApplicationEvaluationRequest evaluationRequest); + + @Operation(summary = "API to get ApplicationEvaluation data for evaluation process", + 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) })) + }) + @GetMapping(value = "/application/{applicationId}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> getApplicationEvaluationByApplicationId(HttpServletRequest request, + @Parameter(required = true) @PathVariable("applicationId") Long applicationId); + + @Operation(summary = "API to delete ApplicationEvaluation", + 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) })) + }) + @DeleteMapping(value = "/{id}") + ResponseEntity> deleteApplicationEvaluation(HttpServletRequest request, + @Parameter(description = "The evaluation ID", required = true) @PathVariable("id") Long id); + + @Operation(summary = "Api to update application evaluation 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) })) }) + @PutMapping(value = "/{id}/status", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> updateApplicationEvaluationStatus(HttpServletRequest request, + @Parameter(description = "The evaluation ID", required = true) @PathVariable("id") Long id, + @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) ApplicationEvaluationStatusTypeEnum status); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java new file mode 100644 index 00000000..bbbf1c0f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java @@ -0,0 +1,62 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.request.UpdateApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; +import net.gepafin.tendermanagement.model.response.ApplicationResponse; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.ApplicationEvaluationService; +import net.gepafin.tendermanagement.web.rest.api.ApplicationEvaluationApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/applicationEvaluation}") +public class ApplicationEvaluationApiController implements ApplicationEvaluationApi { + + @Autowired + private ApplicationEvaluationService applicationEvaluationService; + + @Override + public ResponseEntity> createOrUpdateApplicationEvaluation(HttpServletRequest request, + ApplicationEvaluationRequest evaluationRequest) { + ApplicationEvaluationResponse response = applicationEvaluationService.createOrUpdateApplicationEvaluation(request,evaluationRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CREATED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> getApplicationEvaluationByApplicationId(HttpServletRequest request, + Long applicationId) { + ApplicationEvaluationResponse response = applicationEvaluationService.getApplicationEvaluationByApplicationId(request,applicationId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_FETCHED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> deleteApplicationEvaluation(HttpServletRequest request, + Long id) { + applicationEvaluationService.deleteApplicationEvaluation(request,id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_DELETED_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> updateApplicationEvaluationStatus(HttpServletRequest request, Long applicationId, + ApplicationEvaluationStatusTypeEnum status) { + ApplicationEvaluationResponse applicationEvaluationResponse = applicationEvaluationService.updateApplicationEvaluationStatus(request, applicationId, status); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(applicationEvaluationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_EVALUATION_STATUS_UPDATED_SUCCESSFULLY))); + } +} diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index ca567baa..007b77d8 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1108,4 +1108,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 683e335c..c7cc5eca 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -253,6 +253,13 @@ get_login_attempt_se_msg=Login attempts fetched successfully. application.in.submit.status.cannot.delete.company=The company cannot be deleted because there are active applications in the SUBMITTED status. get.users.success.msg = Successfully fetched users. cannot.create.beneficiary.user = Creation of a Beneficiary user is not allowed. Please assign the appropriate role. +application.evaluation.not.found=Application Evaluation not found with ID: {0} +evaluation.created.successfully = Application evaluation created successfully. +evaluation.updated.successfully = Application evaluation updated successfully. +evaluation.fetched.successfully = Application evaluation fetched successfully. +evaluation.deleted.successfully = Application evaluation deleted successfully. +evaluations.fetched.successfully = All application evaluations fetched successfully. +application.evaluation.status.updated.successfully=Application evaluation status updated successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 4731e451..a189c291 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -251,3 +251,10 @@ application.in.submit.status.cannot.delete.company=Non get.users.success.msg = Utenti recuperati con successo cannot.create.beneficiary.user = La creazione di un utente beneficiario non è consentita. Si prega di assegnare il ruolo appropriato. +application.evaluation.not.found=Valutazione dell'applicazione non trovata con ID: {0} +evaluation.created.successfully = Valutazione dell'applicazione creata con successo. +evaluation.updated.successfully = Valutazione dell'applicazione aggiornata con successo. +evaluation.fetched.successfully = Valutazione dell'applicazione recuperata con successo. +evaluation.deleted.successfully = Valutazione dell'applicazione eliminata con successo. +evaluations.fetched.successfully = Tutte le valutazioni delle applicazioni recuperate con successo. +application.evaluation.status.updated.successfully=Stato della valutazione dell'applicazione aggiornato con successo. From 9b1c86d179a3bb148766e02ce57d6fc72dadb2fa Mon Sep 17 00:00:00 2001 From: harish Date: Sat, 26 Oct 2024 17:48:31 +0530 Subject: [PATCH 03/13] Updated code --- .../constants/GepafinConstant.java | 1 + .../dao/ApplicationEvaluationDao.java | 40 +++++++++++-------- .../entities/ApplicationEvaluationEntity.java | 11 +++-- .../request/ApplicationEvaluationRequest.java | 1 - .../ApplicationEvaluationResponse.java | 1 + .../service/ApplicationEvaluationService.java | 2 +- .../ApplicationEvaluationServiceImpl.java | 40 ++++++++++++++----- .../tendermanagement/util/Validator.java | 8 ---- .../rest/api/ApplicationEvaluationApi.java | 12 +++--- .../ApplicationEvaluationApiController.java | 4 +- .../db/changelog/db.changelog-1.0.0.xml | 23 ++++++----- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 13 files changed, 87 insertions(+), 58 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 512a4029..91a87667 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -240,6 +240,7 @@ public class GepafinConstant { public static final String EVALUATIONS_FETCHED_SUCCESSFULLY = "evaluations.fetched.successfully"; public static final String APPLICATION_EVALUATION_NOT_FOUND = "application.evaluation.not.found"; public static final String APPLICATION_EVALUATION_STATUS_UPDATED_SUCCESSFULLY = "application.evaluation.status.updated.successfully"; + public static final String ASSIGNED_APPLICATION_NOT_FOUND_WITH_ID_MSG = "assigned.application.not.found.with.id"; public static final String APPLICATION_ASSIGNED= "application.assigned.success.msg"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index aa50f953..c5befa78 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -53,11 +53,14 @@ public class ApplicationEvaluationDao { private ApplicationFormRepository applicationFormRepository; @Autowired private ApplicationFormFieldRepository applicationFormFieldRepository; + @Autowired AssignedApplicationsRepository assignedApplicationsRepository; - private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req) { + private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req,Long applicationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); - ApplicationEntity application = applicationService.validateApplication(req.getApplicationId()); - entity.setApplication(application); + ApplicationEntity application = applicationService.validateApplication(applicationId); + AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); + entity.setApplicationId(application.getId()); + entity.setAssignedApplicationsEntity(assignedApplications); entity.setUserId(user.getId()); entity.setCriteria(Utils.convertObjectToJson(req.getCriteria())); entity.setChecklist(Utils.convertObjectToJson(req.getChecklist())); @@ -72,10 +75,10 @@ public class ApplicationEvaluationDao { ApplicationEvaluationResponse response = new ApplicationEvaluationResponse(); populateBasicDetails(entity, response); - CallEntity call = callRepository.findCallEntityByApplicationId(entity.getApplication().getId()); + CallEntity call = callRepository.findCallEntityByApplicationId(entity.getApplicationId()); List evaluationCriterias = evaluationCriteriaRepository.findByCallId(call.getId()); List checklistEntities = callTargetAudienceChecklistRepository.findByCallId(call.getId()); - List applicationFormEntities = applicationFormRepository.findByApplicationId(entity.getApplication().getId()); + List applicationFormEntities = applicationFormRepository.findByApplicationId(entity.getApplicationId()); setCriteriaResponses(entity, response, evaluationCriterias); setChecklistResponses(entity, response, checklistEntities); @@ -88,7 +91,9 @@ public class ApplicationEvaluationDao { private void populateBasicDetails(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response) { response.setId(entity.getId()); - response.setApplicationId(entity.getApplication().getId()); + response.setApplicationId(entity.getApplicationId()); + AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(entity.getApplicationId()).orElse(null); + response.setAssignedApplicationId(assignedApplications.getId()); response.setNote(entity.getNote()); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(entity.getStatus())); response.setCreatedDate(entity.getCreatedDate()); @@ -100,7 +105,7 @@ public class ApplicationEvaluationDao { ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() {}) : new ArrayList<>(); - List criteriaResponsesFromDB = getCriteriaResponse(entity.getApplication().getId()); + List criteriaResponsesFromDB = getCriteriaResponse(entity.getApplicationId()); addMissingCriteriaResponses(criteriaResponsesFromEntity, criteriaResponsesFromDB); criteriaResponsesFromEntity.forEach(criteriaResponse -> { @@ -135,7 +140,7 @@ public class ApplicationEvaluationDao { ? Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() {}) : new ArrayList<>(); - List checklistResponsesFromDB = getChecklistResponse(entity.getApplication().getId()); + List checklistResponsesFromDB = getChecklistResponse(entity.getApplicationId()); addMissingChecklistResponses(checklistResponsesFromEntity, checklistResponsesFromDB); checklistResponsesFromEntity.forEach(checklistResponse -> { @@ -169,7 +174,7 @@ public class ApplicationEvaluationDao { ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() {}) : new ArrayList<>(); - List fieldResponsesFromDB = getFieldResponses(entity.getApplication().getId()); + List fieldResponsesFromDB = getFieldResponses(entity.getApplicationId()); addMissingFieldResponses(fieldResponsesFromEntity, fieldResponsesFromDB); fieldResponsesFromEntity.forEach(fieldResponse -> { @@ -202,7 +207,7 @@ public class ApplicationEvaluationDao { } private void setApplicationDetails(ApplicationEvaluationResponse response, ApplicationEvaluationEntity entity) { - ApplicationEntity application = applicationService.validateApplication(entity.getApplication() != null ? entity.getApplication().getId() : null); + ApplicationEntity application = applicationService.validateApplication(entity.getApplicationId() != null ? entity.getApplicationId(): null); UserEntity user = userService.validateUser(application.getUserId()); String firstName = user.getFirstName() != null ? user.getFirstName() : ""; String lastName = user.getLastName() != null ? user.getLastName() : ""; @@ -213,12 +218,13 @@ public class ApplicationEvaluationDao { response.setCallName(application.getCall().getName()); response.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null); response.setSubmissionDate(application.getSubmissionDate()); - response.setEvaluationDate(LocalDateTime.now()); + response.setEvaluationDate(application.getSubmissionDate().plusDays(30)); + } - public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(UserEntity user, ApplicationEvaluationRequest req) { - Optional existingEntityOptional = applicationEvaluationRepository.findByApplicationId(req.getApplicationId()); + public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(UserEntity user, ApplicationEvaluationRequest req,Long applicationId) { + Optional existingEntityOptional = applicationEvaluationRepository.findByApplicationId(applicationId); ApplicationEvaluationEntity entity; if (existingEntityOptional.isPresent()) { @@ -229,7 +235,7 @@ public class ApplicationEvaluationDao { entity.setIsDeleted(false); setIfUpdated(entity::getNote, entity::setNote, req.getNote()); } else { - entity = convertToEntity(user, req); + entity = convertToEntity(user, req,applicationId); } ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(entity); @@ -376,8 +382,9 @@ public class ApplicationEvaluationDao { List evaluationCriterias = evaluationCriteriaRepository.findByCallId(call.getId()); List checklistEntities = callTargetAudienceChecklistRepository.findByCallId(call.getId()); List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationId); - + AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); response.setApplicationId(applicationId); + response.setAssignedApplicationId(assignedApplications.getId()); response.setNote(null); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.DRAFT.getValue())); @@ -463,7 +470,8 @@ public class ApplicationEvaluationDao { response.setCallName(application.getCall().getName()); response.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null); response.setSubmissionDate(application.getSubmissionDate()); - response.setEvaluationDate(LocalDateTime.now()); + response.setEvaluationDate(application.getSubmissionDate().plusDays(30)); + } List getCriteriaResponse(Long applicationId){ CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java index 32fe4648..2ddad5ae 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java @@ -9,10 +9,8 @@ import java.util.List; @Entity @Table(name = "application_evaluation") public class ApplicationEvaluationEntity extends BaseEntity{ - - @ManyToOne - @JoinColumn(name = "APPLICATION_ID", nullable = true) - private ApplicationEntity application; + @Column(name = "application_Id") + private Long applicationId; @Column(name = "user_id") private Long userId; @@ -24,12 +22,17 @@ public class ApplicationEvaluationEntity extends BaseEntity{ @Column(name = "file") private String file; + @Column(name = "note") private String note; + @Column(name = "status") private String status; @Column(name="IS_DELETED") private Boolean isDeleted; + @ManyToOne + @JoinColumn(name = "assigned_applications_id", nullable = true) + private AssignedApplicationsEntity assignedApplicationsEntity; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java index c1cfb8e1..12fc7150 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java @@ -7,7 +7,6 @@ import java.util.List; @Data public class ApplicationEvaluationRequest { - private Long applicationId; private List criteria; private List checklist; private List field; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java index 5da13e36..ce2afc0e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -12,6 +12,7 @@ public class ApplicationEvaluationResponse { private Long id; private Long applicationId; + private Long assignedApplicationId; private String note; private ApplicationEvaluationStatusTypeEnum status; private List criteria; diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index 5c1b448c..7ad37f53 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -11,7 +11,7 @@ import net.gepafin.tendermanagement.model.response.ApplicationResponse; import java.util.List; public interface ApplicationEvaluationService { - ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationRequest applicationEvaluationRequest); + ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationRequest applicationEvaluationRequest,Long assignedApplicationsId); void deleteApplicationEvaluation(HttpServletRequest request,Long id); ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java index 8848eca2..4de5fe41 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -1,8 +1,11 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.ApplicationEvaluationDao; +import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; @@ -10,13 +13,18 @@ import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.UpdateApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; import net.gepafin.tendermanagement.model.response.ApplicationResponse; +import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; import net.gepafin.tendermanagement.service.ApplicationEvaluationService; import net.gepafin.tendermanagement.util.Validator; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Optional; @Service public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationService { @@ -25,36 +33,46 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe private ApplicationEvaluationDao applicationEvaluationDao; @Autowired private Validator validator; + @Autowired + private AssignedApplicationsRepository assignedApplicationsRepository; @Override @Transactional(rollbackFor = Exception.class) - public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationRequest req) { - Long userId = validator.getUserIdFromToken(request); - UserEntity user=validator.validatePreInstructor(request,userId); - return applicationEvaluationDao.createOrUpdateApplicationEvaluation(user,req); + public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationRequest req,Long assignedApplicationsId) { + AssignedApplicationsEntity assignedApplication = assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationsId).orElseThrow(()-> + new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG))); + UserEntity user=validator.validatePreInstructor(request,assignedApplication.getUserId()); + return applicationEvaluationDao.createOrUpdateApplicationEvaluation(user,req,assignedApplication.getApplication().getId()); } @Override @Transactional(readOnly = true) public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId) { - Long userId = validator.getUserIdFromToken(request); - UserEntity user=validator.validatePreInstructor(request,userId); - return applicationEvaluationDao.getApplicationEvaluationByApplicationId(user,applicationId); + AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); + if(assignedApplications==null){ + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_WITH_ID_MSG)); + } + UserEntity user = validator.validatePreInstructor(request, assignedApplications.getUserId()); + return applicationEvaluationDao.getApplicationEvaluationByApplicationId(user, assignedApplications.getUserId()); + } @Override @Transactional(rollbackFor = Exception.class) public void deleteApplicationEvaluation(HttpServletRequest request,Long id) { - Long userId = validator.getUserIdFromToken(request); + validator.getUserIdFromToken(request); applicationEvaluationDao.deleteById(id); } @Override @Transactional(rollbackFor = Exception.class) public ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long applicationId, ApplicationEvaluationStatusTypeEnum status) { - Long userId = validator.getUserIdFromToken(request); - validator.validatePreInstructor(request,userId); - return applicationEvaluationDao.updateApplicationEvaluationStatus(applicationId, status); + AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); + if(assignedApplications==null){ + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_WITH_ID_MSG)); + } + validator.validatePreInstructor(request, assignedApplications.getUserId()); + return applicationEvaluationDao.updateApplicationEvaluationStatus(applicationId, status); } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index 3aa32a3a..f8375649 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -139,14 +139,6 @@ public class Validator { Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); return Long.parseLong(userInfo.get("userId").toString()); } - public UserEntity validatePreInstructor(HttpServletRequest request, Long userId) { - UserEntity user = validateUser(request); - if(Boolean.FALSE.equals(RoleStatusEnum.ROLE_PRE_INSTRUCTOR.getValue().equals(user.getRoleEntity().getRoleType()))||Boolean.FALSE.equals(user.getId().equals(userId))) { - throw new ForbiddenAccessException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); - } - return userService.validateUser(userId); - } - public CallEntity validateUserWithCall(UserEntity user, Long callId) { CallEntity callEntity = callService.validateCall(callId); if(Boolean.FALSE.equals(user.getHub().getId().equals(callEntity.getHub().getId()))) { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java index c5970bfa..5fc10fe4 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -24,7 +24,7 @@ import java.util.List; public interface ApplicationEvaluationApi { - @Operation(summary = "API to create ApplicationEvaluation", + @Operation(summary = "API to create or update ApplicationEvaluation", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -32,9 +32,11 @@ public interface ApplicationEvaluationApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PostMapping(value = "/", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - ResponseEntity> createOrUpdateApplicationEvaluation(HttpServletRequest request, - @Parameter(description = "ApplicationEvaluation request object", required = true) @Valid @RequestBody ApplicationEvaluationRequest evaluationRequest); + @PutMapping(value = "/{assignedApplicationsId}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> createOrUpdateApplicationEvaluation( + HttpServletRequest request, + @Parameter(required = true) @PathVariable("assignedApplicationsId") Long assignedApplicationsId, + @Parameter( required = true) @Valid @RequestBody ApplicationEvaluationRequest evaluationRequest); @Operation(summary = "API to get ApplicationEvaluation data for evaluation process", responses = { @@ -67,7 +69,7 @@ public interface ApplicationEvaluationApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PutMapping(value = "/{id}/status", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> updateApplicationEvaluationStatus(HttpServletRequest request, - @Parameter(description = "The evaluation ID", required = true) @PathVariable("id") Long id, + @Parameter( required = true) @PathVariable("id") Long id, @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) ApplicationEvaluationStatusTypeEnum status); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java index bbbf1c0f..3cac0a2c 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java @@ -30,8 +30,8 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation @Override public ResponseEntity> createOrUpdateApplicationEvaluation(HttpServletRequest request, - ApplicationEvaluationRequest evaluationRequest) { - ApplicationEvaluationResponse response = applicationEvaluationService.createOrUpdateApplicationEvaluation(request,evaluationRequest); + Long assignedApplicationsId,ApplicationEvaluationRequest evaluationRequest) { + ApplicationEvaluationResponse response = applicationEvaluationService.createOrUpdateApplicationEvaluation(request,evaluationRequest,assignedApplicationsId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CREATED_SUCCESSFULLY))); } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 3879868b..2e601677 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1488,12 +1488,16 @@ - - - + - + + + + + + + @@ -1506,7 +1510,7 @@ - + @@ -1528,13 +1532,12 @@ onDelete="CASCADE" /> - - + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 7d48f55f..5d446db2 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -261,6 +261,7 @@ evaluation.deleted.successfully = Application evaluation deleted successfully. evaluations.fetched.successfully = All application evaluations fetched successfully. application.evaluation.status.updated.successfully=Application evaluation status updated successfully. evaluationCriteria.invalid=This evaluation criterion does not belong to the current call. +assigned.application.not.found.with.id=Assigned application with this application ID not found # Hub Messages diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 8189d06c..fc74a527 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -259,6 +259,7 @@ evaluation.fetched.successfully = Valutazione dell'applicazione recuperata con s evaluation.deleted.successfully = Valutazione dell'applicazione eliminata con successo. evaluations.fetched.successfully = Tutte le valutazioni delle applicazioni recuperate con successo. application.evaluation.status.updated.successfully=Stato della valutazione dell'applicazione aggiornato con successo. +assigned.application.not.found.with.id=Applicazione assegnata con questo ID dell'applicazione non trovata application.assigned.success.msg =Domanda assegnata con successo application.already.assigned.msg =La domanda � gi� assegnata From a80fc36e87a5cf5c7ef1f876ae404d500ee13ef6 Mon Sep 17 00:00:00 2001 From: harish Date: Sun, 27 Oct 2024 11:42:38 +0530 Subject: [PATCH 04/13] Updated response --- .../dao/ApplicationEvaluationDao.java | 360 ++++++++++++++++-- .../ApplicationEvaluationStatusTypeEnum.java | 6 +- .../ApplicationEvaluationResponse.java | 1 + .../model/response/CriteriaMappedField.java | 10 + .../model/response/CriteriaResponse.java | 3 +- .../model/response/FieldResponse.java | 4 + .../ApplicationEvaluationRepository.java | 12 +- .../AssignedApplicationsRepository.java | 8 + .../repositories/DocumentRepository.java | 4 +- .../service/ApplicationEvaluationService.java | 3 +- .../ApplicationEvaluationServiceImpl.java | 23 +- .../rest/api/ApplicationEvaluationApi.java | 13 +- .../ApplicationEvaluationApiController.java | 8 +- .../db/changelog/db.changelog-1.0.0.xml | 2 +- 14 files changed, 396 insertions(+), 61 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/CriteriaMappedField.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index c5befa78..cf64291a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -5,7 +5,6 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; -import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; @@ -22,7 +21,6 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -53,7 +51,11 @@ public class ApplicationEvaluationDao { private ApplicationFormRepository applicationFormRepository; @Autowired private ApplicationFormFieldRepository applicationFormFieldRepository; - @Autowired AssignedApplicationsRepository assignedApplicationsRepository; + @Autowired + private AssignedApplicationsRepository assignedApplicationsRepository; + @Autowired + private CriteriaFormFieldRepository criteriaFormFieldRepository; + private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req,Long applicationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); @@ -67,7 +69,7 @@ public class ApplicationEvaluationDao { entity.setFile(Utils.convertObjectToJson(req.getField())); entity.setNote(req.getNote()); entity.setIsDeleted(false); - entity.setStatus(ApplicationEvaluationStatusTypeEnum.DRAFT.getValue()); + entity.setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue()); return entity; } @@ -106,8 +108,7 @@ public class ApplicationEvaluationDao { : new ArrayList<>(); List criteriaResponsesFromDB = getCriteriaResponse(entity.getApplicationId()); - addMissingCriteriaResponses(criteriaResponsesFromEntity, criteriaResponsesFromDB); - + addMissingCriteriaResponses(criteriaResponsesFromEntity, criteriaResponsesFromDB,entity.getApplicationId()); criteriaResponsesFromEntity.forEach(criteriaResponse -> { EvaluationCriteriaEntity matchingEvaluationCriteria = evaluationCriterias.stream() .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())) @@ -117,23 +118,75 @@ public class ApplicationEvaluationDao { if (matchingEvaluationCriteria != null) { criteriaResponse.setLabel(matchingEvaluationCriteria.getLookupData().getValue()); criteriaResponse.setMaxScore(matchingEvaluationCriteria.getScore()); + + List mappedFields = getMappedFieldsForCriteria(matchingEvaluationCriteria.getId(), entity.getApplicationId()); + criteriaResponse.setCriteriaMappedFields(mappedFields); } }); response.setCriteria(criteriaResponsesFromEntity); } - - private void addMissingCriteriaResponses(List criteriaResponsesFromEntity, List criteriaResponsesFromDB) { + private void addMissingCriteriaResponses(List criteriaResponsesFromEntity, List criteriaResponsesFromDB,Long applicationId) { Set existingCriteriaIds = criteriaResponsesFromEntity.stream() .map(CriteriaResponse::getId) .collect(Collectors.toSet()); for (CriteriaResponse dbResponse : criteriaResponsesFromDB) { if (!existingCriteriaIds.contains(dbResponse.getId())) { + List mappedFields = getMappedFieldsForCriteria(dbResponse.getId(), applicationId); + dbResponse.setCriteriaMappedFields(mappedFields); criteriaResponsesFromEntity.add(dbResponse); } } } + private List getMappedFieldsForCriteria(Long evaluationCriteriaId, Long applicationId) { + List criteriaFormFields = criteriaFormFieldRepository + .findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaId); + List mappedFields = new ArrayList<>(); + + Set uniqueFieldIds = new HashSet<>(); + + List applicationForms = applicationFormRepository.findByApplicationId(applicationId); + for (ApplicationFormEntity applicationForm : applicationForms) { + for (CriteriaFormFieldEntity formField : criteriaFormFields) { + String formFieldId = formField.getFormFieldId(); + + if (!uniqueFieldIds.contains(formFieldId)) { + CriteriaMappedField mappedField = new CriteriaMappedField(); + mappedField.setId(formFieldId); + + FormEntity formEntity = formRepository.findById(formField.getFormId()).orElse(null); + if (formEntity != null) { + List contentBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); + contentBeans.stream() + .filter(contentBean -> contentBean.getId().equals(formFieldId)) + .findFirst() + .ifPresent(contentBean -> { + String label = contentBean.getLabel(); + if (contentBean.getSettings() != null) { + for (SettingResponseBean setting : contentBean.getSettings()) { + if ("label".equals(setting.getName())) { + label = setting.getValue() != null ? setting.getValue().toString() : label; + break; + } + } + } + mappedField.setFieldLabel(label); + }); + } + + Optional formFieldEntityOptional = applicationFormFieldRepository + .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(formFieldId, applicationForm.getId(), applicationId); + + formFieldEntityOptional.ifPresent(field -> mappedField.setFieldValue(field.getFieldValue())); + + mappedFields.add(mappedField); + uniqueFieldIds.add(formFieldId); + } + } + } + return mappedFields; + } private void setChecklistResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List checklistEntities) { List checklistResponsesFromEntity = entity.getChecklist() != null @@ -173,24 +226,69 @@ public class ApplicationEvaluationDao { List fieldResponsesFromEntity = entity.getFile() != null ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() {}) : new ArrayList<>(); - List fieldResponsesFromDB = getFieldResponses(entity.getApplicationId()); addMissingFieldResponses(fieldResponsesFromEntity, fieldResponsesFromDB); + Set processedFieldIds = new HashSet<>(); + fieldResponsesFromEntity.forEach(fieldResponse -> { + if (processedFieldIds.contains(fieldResponse.getId())) { + return; + } + applicationFormEntities.forEach(applicationForm -> { FormEntity formEntity = applicationForm.getForm(); if (formEntity != null) { List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); contentResponseBeans.forEach(contentResponseBean -> { if ("fileupload".equals(contentResponseBean.getName()) && contentResponseBean.getId().equals(fieldResponse.getId())) { - fieldResponse.setLabel(contentResponseBean.getLabel()); + String label = null; + if (contentResponseBean.getSettings() != null) { + for (SettingResponseBean setting : contentResponseBean.getSettings()) { + if ("label".equals(setting.getName())) { + label = setting.getValue() != null ? setting.getValue().toString() : label; + break; + } + } + } + fieldResponse.setLabel(label); + + Optional optionalFormField = applicationFormFieldRepository + .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + fieldResponse.getId(), applicationForm.getId(), entity.getApplicationId() + ); + + if (optionalFormField.isPresent()) { + ApplicationFormFieldEntity formField = optionalFormField.get(); + if (formField.getFieldValue() != null) { + String[] documentIds = formField.getFieldValue().split(","); + List documentResponseBeans = new ArrayList<>(); + + for (String docId : documentIds) { + Long documentId = Long.valueOf(docId.trim()); + documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { + DocumentResponseBean responseBean = new DocumentResponseBean(); + responseBean.setId(documentEntity.getId()); + responseBean.setName(documentEntity.getFileName()); + responseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); + responseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); + responseBean.setSourceId(documentEntity.getSourceId()); + responseBean.setFilePath(documentEntity.getFilePath()); + responseBean.setCreatedDate(documentEntity.getCreatedDate()); + responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + documentResponseBeans.add(responseBean); + }); + } + + fieldResponse.setFileDetail(documentResponseBeans); + } + } + processedFieldIds.add(fieldResponse.getId()); } }); } }); }); - response.setFiles(fieldResponsesFromEntity); } @@ -209,22 +307,25 @@ public class ApplicationEvaluationDao { private void setApplicationDetails(ApplicationEvaluationResponse response, ApplicationEvaluationEntity entity) { ApplicationEntity application = applicationService.validateApplication(entity.getApplicationId() != null ? entity.getApplicationId(): null); UserEntity user = userService.validateUser(application.getUserId()); + + CallEntity call = callRepository.findCallEntityByApplicationId(entity.getApplicationId()); + String firstName = user.getFirstName() != null ? user.getFirstName() : ""; String lastName = user.getLastName() != null ? user.getLastName() : ""; String beneficiary = String.join(" ", firstName, lastName).trim(); response.setBeneficiary(beneficiary); - + response.setMinScore(call.getThreshold()); response.setCallName(application.getCall().getName()); response.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null); - response.setSubmissionDate(application.getSubmissionDate()); - response.setEvaluationDate(application.getSubmissionDate().plusDays(30)); + response.setSubmissionDate(application.getSubmissionDate()!= null ? application.getSubmissionDate(): null); + response.setEvaluationDate(application.getSubmissionDate()!= null ? application.getSubmissionDate().plusDays(30):null); } public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(UserEntity user, ApplicationEvaluationRequest req,Long applicationId) { - Optional existingEntityOptional = applicationEvaluationRepository.findByApplicationId(applicationId); + Optional existingEntityOptional = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationId); ApplicationEvaluationEntity entity; if (existingEntityOptional.isPresent()) { @@ -368,26 +469,51 @@ public class ApplicationEvaluationDao { } - public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(UserEntity user, Long applicationId) { - applicationService.validateApplication(applicationId); - Optional entityOptional = applicationEvaluationRepository.findByApplicationId(applicationId); - return entityOptional.map(this::convertToResponse).orElseGet(() -> getEvaluationResponseByApplicationid(user, applicationId)); + public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(UserEntity user, Long applicationId, Long assignedApplicationId) { + applicationService.validateApplication(applicationId); + + Optional entityOptional; + + if (applicationId != null && assignedApplicationId != null) { + entityOptional = applicationEvaluationRepository.findByApplicationIdAndAssignedApplicationsEntity_IdAndIsDeletedFalse(applicationId, assignedApplicationId); + } else if (applicationId != null) { + entityOptional = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationId); + } else if (assignedApplicationId != null) { + entityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationId); + } else { + entityOptional = applicationEvaluationRepository.findFirstByIsDeletedFalseOrderByCreatedDateDesc(); + } + return entityOptional.map(this::convertToResponse) + .orElseGet(() -> { + return getEvaluationResponseByApplicationid(user, applicationId, assignedApplicationId); + }); } - public ApplicationEvaluationResponse getEvaluationResponseByApplicationid(UserEntity user, Long applicationId) { + + public ApplicationEvaluationResponse getEvaluationResponseByApplicationid(UserEntity user, Long applicationId,Long assignedApplicationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); ApplicationEvaluationResponse response = new ApplicationEvaluationResponse(); - - CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); + CallEntity call=null; + AssignedApplicationsEntity assignedApplications=null; + if (applicationId != null) { + call = callRepository.findCallEntityByApplicationId(applicationId); + assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); + } else if (assignedApplicationId != null) { + call = callRepository.findCallEntityByApplicationId(assignedApplicationId); + assignedApplications = assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationId).orElseThrow(()-> + new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG))); + } + else { + call = callRepository.findCallEntityByApplicationId(applicationId); + assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null);} List evaluationCriterias = evaluationCriteriaRepository.findByCallId(call.getId()); List checklistEntities = callTargetAudienceChecklistRepository.findByCallId(call.getId()); List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationId); - AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); response.setApplicationId(applicationId); response.setAssignedApplicationId(assignedApplications.getId()); response.setNote(null); - response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.DRAFT.getValue())); - + response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.OPEN.getValue())); + response.setMinScore(call.getThreshold()); setCriteriaResponses(entity, applicationId, response, evaluationCriterias); setChecklistResponses(entity, applicationId, response, checklistEntities); setFileResponses(entity, applicationId, response, applicationFormEntities); @@ -408,9 +534,51 @@ public class ApplicationEvaluationDao { .findFirst() .orElse(null); + List applicationForms = applicationFormRepository.findByApplicationId(applicationId); + Map mappedFieldMap = new HashMap<>(); + if (matchingEvaluationCriteria != null) { criteriaResponse.setLabel(matchingEvaluationCriteria.getLookupData().getValue()); criteriaResponse.setMaxScore(matchingEvaluationCriteria.getScore()); + + List criteriaFormFields = criteriaFormFieldRepository + .findByEvaluationCriteriaIdAndIsDeletedFalse(matchingEvaluationCriteria.getId()); + + for (ApplicationFormEntity applicationForm : applicationForms) { + for (CriteriaFormFieldEntity criteriaFormField : criteriaFormFields) { + String formFieldId = criteriaFormField.getFormFieldId(); + if (!mappedFieldMap.containsKey(formFieldId)) { + CriteriaMappedField mappedField = new CriteriaMappedField(); + mappedField.setId(formFieldId); + FormEntity formEntity = formRepository.findById(criteriaFormField.getFormId()).orElse(null); + + if (formEntity != null) { + List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); + contentResponseBeans.stream() + .filter(bean -> bean.getId().equals(formFieldId)) + .findFirst() + .ifPresent(contentResponseBean -> { + String label = contentResponseBean.getLabel(); + if (contentResponseBean.getSettings() != null) { + for (SettingResponseBean setting : contentResponseBean.getSettings()) { + if ("label".equals(setting.getName())) { + label = setting.getValue() != null ? setting.getValue().toString() : label; + break; + } + } + } + mappedField.setFieldLabel(label); + }); + } + Optional formFieldEntityOptional = applicationFormFieldRepository + .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(formFieldId, applicationForm.getId(), applicationId); + + formFieldEntityOptional.ifPresent(formField -> mappedField.setFieldValue(formField.getFieldValue())); + mappedFieldMap.put(formFieldId, mappedField); + } + } + } + criteriaResponse.setCriteriaMappedFields(new ArrayList<>(mappedFieldMap.values())); } }); @@ -435,20 +603,62 @@ public class ApplicationEvaluationDao { response.setChecklist(checklistResponses); } - private void setFileResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, List applicationFormEntities) { List fieldResponses = entity.getFile() != null ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() {}) : getFieldResponses(applicationId); + Set processedFieldIds = new HashSet<>(); fieldResponses.forEach(fieldResponse -> { + if (processedFieldIds.contains(fieldResponse.getId())) { + return; + } + applicationFormEntities.forEach(applicationForm -> { FormEntity formEntity = applicationForm.getForm(); if (formEntity != null) { List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); contentResponseBeans.forEach(contentResponseBean -> { if ("fileupload".equals(contentResponseBean.getName()) && contentResponseBean.getId().equals(fieldResponse.getId())) { - fieldResponse.setLabel(contentResponseBean.getLabel()); + String label = null; + if (contentResponseBean.getSettings() != null) { + for (SettingResponseBean setting : contentResponseBean.getSettings()) { + if ("label".equals(setting.getName())) { + label = setting.getValue() != null ? setting.getValue().toString() : label; + break; + } + } + } + fieldResponse.setLabel(label); + + Optional optionalFormField = applicationFormFieldRepository + .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(fieldResponse.getId(), applicationForm.getId(), applicationId); + + if (optionalFormField.isPresent() && optionalFormField.get().getFieldValue() != null) { + String[] documentIds = optionalFormField.get().getFieldValue().split(","); + List documentResponseBeans = new ArrayList<>(); + + for (String docId : documentIds) { + Long documentId = Long.valueOf(docId.trim()); + documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { + DocumentResponseBean responseBean = new DocumentResponseBean(); + responseBean.setId(documentEntity.getId()); + responseBean.setName(documentEntity.getFileName()); + responseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); + responseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); + responseBean.setSourceId(documentEntity.getSourceId()); + responseBean.setFilePath(documentEntity.getFilePath()); + responseBean.setCreatedDate(documentEntity.getCreatedDate()); + responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + documentResponseBeans.add(responseBean); + }); + } + + fieldResponse.setFileDetail(documentResponseBeans); + } + + // Mark this field ID as processed to prevent duplicates + processedFieldIds.add(fieldResponse.getId()); } }); } @@ -458,6 +668,7 @@ public class ApplicationEvaluationDao { response.setFiles(fieldResponses); } + private void setApplicationDetails(ApplicationEvaluationResponse response, Long applicationId, UserEntity user) { ApplicationEntity application = applicationService.validateApplication(applicationId); userService.validateUser(application.getUserId()); @@ -469,13 +680,15 @@ public class ApplicationEvaluationDao { response.setCallName(application.getCall().getName()); response.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null); - response.setSubmissionDate(application.getSubmissionDate()); - response.setEvaluationDate(application.getSubmissionDate().plusDays(30)); + response.setSubmissionDate(application.getSubmissionDate()!= null ? application.getSubmissionDate(): null); + response.setEvaluationDate(application.getSubmissionDate()!= null ? application.getSubmissionDate().plusDays(30):null); } - List getCriteriaResponse(Long applicationId){ CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); + List getCriteriaResponse(Long applicationId) { + CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); List evaluationCriterias = evaluationCriteriaRepository.findByCallId(call.getId()); + List criteriaResponses = evaluationCriterias.stream().map(criteria -> { CriteriaResponse response = new CriteriaResponse(); response.setId(criteria.getId()); @@ -484,6 +697,54 @@ public class ApplicationEvaluationDao { response.setMaxScore(criteria.getScore()); response.setValid(null); + List criteriaFormFields = criteriaFormFieldRepository + .findByEvaluationCriteriaIdAndIsDeletedFalse(criteria.getId()); + + List mappedFields = new ArrayList<>(); + Set processedFormFieldIds = new HashSet<>(); + + for (CriteriaFormFieldEntity criteriaFormField : criteriaFormFields) { + if (processedFormFieldIds.contains(criteriaFormField.getFormFieldId())) { + continue; + } + + CriteriaMappedField mappedField = new CriteriaMappedField(); + mappedField.setId(criteriaFormField.getFormFieldId()); + + FormEntity formEntity = formRepository.findById(criteriaFormField.getFormId()).orElse(null); + if (formEntity != null) { + List contentResponseBeans = Utils.convertJsonStringToList( + formEntity.getContent(), ContentResponseBean.class); + contentResponseBeans.stream() + .filter(bean -> bean.getId().equals(criteriaFormField.getFormFieldId())) + .findFirst() + .ifPresent(contentResponseBean -> { + String label = contentResponseBean.getLabel(); + if (contentResponseBean.getSettings() != null) { + for (SettingResponseBean setting : contentResponseBean.getSettings()) { + if ("label".equals(setting.getName())) { + label = setting.getValue() != null ? setting.getValue().toString() : label; + break; + } + } + } + mappedField.setFieldLabel(label); + }); + } + + applicationFormRepository.findByApplicationId(applicationId).stream() + .flatMap(applicationForm -> applicationFormFieldRepository + .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + criteriaFormField.getFormFieldId(), applicationForm.getId(), applicationId) + .stream()) + .findFirst() + .ifPresent(formField -> mappedField.setFieldValue(formField.getFieldValue())); + + mappedFields.add(mappedField); + processedFormFieldIds.add(criteriaFormField.getFormFieldId()); + } + + response.setCriteriaMappedFields(mappedFields); return response; }).collect(Collectors.toList()); @@ -503,7 +764,6 @@ public class ApplicationEvaluationDao { return checklistResponses; } - public List getFieldResponses(Long applicationId) { List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationId); List fieldResponses = new ArrayList<>(); @@ -517,10 +777,10 @@ public class ApplicationEvaluationDao { for (ContentResponseBean contentResponseBean : contentResponseBeans) { if ("fileupload".equals(contentResponseBean.getName())) { String fieldId = contentResponseBean.getId(); - Long formId = applicationForm.getId(); + Long applicationFormId = applicationForm.getId(); Optional optionalFormField = applicationFormFieldRepository - .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(fieldId, formId, applicationId); + .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(fieldId, applicationFormId, applicationId); if (optionalFormField.isPresent()) { ApplicationFormFieldEntity formField = optionalFormField.get(); @@ -528,8 +788,39 @@ public class ApplicationEvaluationDao { if (formField.getFieldValue() != null) { FieldResponse fieldResponse = new FieldResponse(); fieldResponse.setId(fieldId); - fieldResponse.setLabel(contentResponseBean.getLabel()); + String label = null; + if (contentResponseBean.getSettings() != null) { + for (SettingResponseBean setting : contentResponseBean.getSettings()) { + if ("label".equals(setting.getName())) { + label = setting.getValue() != null ? setting.getValue().toString() : label; + break; + } + } + } + fieldResponse.setLabel(label); fieldResponse.setValid(null); + String[] documentIds = formField.getFieldValue().split(","); + List documentResponseBeans = new ArrayList<>(); + + for (String docId : documentIds) { + Long documentId = Long.valueOf(docId.trim()); + documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { + DocumentResponseBean responseBean = new DocumentResponseBean(); + responseBean.setId(documentEntity.getId()); + responseBean.setName(documentEntity.getFileName()); + responseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); + responseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); + responseBean.setSourceId(documentEntity.getSourceId()); + responseBean.setFilePath(documentEntity.getFilePath()); + responseBean.setCreatedDate(documentEntity.getCreatedDate()); + responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + documentResponseBeans.add(responseBean); + }); + } + + fieldResponse.setFileDetail(documentResponseBeans); + + // Now add fieldResponse to the list fieldResponses.add(fieldResponse); } } @@ -537,7 +828,6 @@ public class ApplicationEvaluationDao { } } } - return fieldResponses; } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationEvaluationStatusTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationEvaluationStatusTypeEnum.java index b4bcb120..18cfc30d 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationEvaluationStatusTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationEvaluationStatusTypeEnum.java @@ -3,9 +3,9 @@ package net.gepafin.tendermanagement.enums; import com.fasterxml.jackson.annotation.JsonValue; public enum ApplicationEvaluationStatusTypeEnum { - DRAFT("DRAFT"), - APPROVED("APPROVED"), - REJECTED("REJECTED"); + OPEN ("OPEN"), + SOCCORSO("SOCCORSO"), + CLOSE("CLOSE"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java index ce2afc0e..5e4269eb 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -15,6 +15,7 @@ public class ApplicationEvaluationResponse { private Long assignedApplicationId; private String note; private ApplicationEvaluationStatusTypeEnum status; + private Long minScore; private List criteria; private List checklist; private List files; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaMappedField.java b/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaMappedField.java new file mode 100644 index 00000000..8c62e178 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaMappedField.java @@ -0,0 +1,10 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class CriteriaMappedField { + private String id; + private String fieldLabel; + private String fieldValue; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaResponse.java index 5a2d709f..ebbb2f2c 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaResponse.java @@ -2,7 +2,7 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; -import java.math.BigDecimal; +import java.util.List; @Data public class CriteriaResponse { @@ -10,5 +10,6 @@ public class CriteriaResponse { private String label; private Long score; private Long maxScore; + private List criteriaMappedFields; private Boolean valid; } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/FieldResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/FieldResponse.java index 247d07e9..07469d6c 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/FieldResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/FieldResponse.java @@ -3,9 +3,13 @@ package net.gepafin.tendermanagement.model.response; import lombok.AllArgsConstructor; import lombok.Data; +import java.util.List; + @Data public class FieldResponse { private String id; private String label; private Boolean valid; + private List fileDetail ; + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java index 65c4d386..81b9a3ea 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java @@ -2,13 +2,21 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; -import java.util.List; import java.util.Optional; @Repository public interface ApplicationEvaluationRepository extends JpaRepository { - Optional findByApplicationId(Long applicationId); + + Optional findByApplicationIdAndIsDeletedFalse(Long applicationId); + + Optional findByAssignedApplicationsEntity_IdAndIsDeletedFalse(Long assignedApplicationId); + + Optional findByApplicationIdAndAssignedApplicationsEntity_IdAndIsDeletedFalse(Long applicationId, Long assignedApplicationId); + + Optional findFirstByIsDeletedFalseOrderByCreatedDateDesc(); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java index 076b93a9..6b95b8f8 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java @@ -2,6 +2,8 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.Optional; @@ -9,5 +11,11 @@ import java.util.Optional; public interface AssignedApplicationsRepository extends JpaRepository, JpaSpecificationExecutor{ Optional findByApplicationIdAndIsDeletedFalse(Long applicationId); Optional findByIdAndIsDeletedFalse(Long id); + @Query("SELECT aa FROM AssignedApplicationsEntity aa WHERE aa.isDeleted = false " + + "AND (:applicationId IS NULL OR aa.application.id = :applicationId) " + + "AND (:id IS NULL OR aa.id = :id)") + Optional findByApplicationIdOrId(@Param("applicationId") Long applicationId, + @Param("id") Long id); + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index b7fc2923..d3eb3058 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -13,14 +13,14 @@ import org.springframework.stereotype.Repository; public interface DocumentRepository extends JpaRepository { @Query("SELECT d FROM DocumentEntity d WHERE d.id = :id AND d.isDeleted = false") - Optional findById(@Param("id") Long id); + Optional findByIdAndNotDeleted(@Param("id") Long id); // List findBySourceIdAndTypeAndIsDeletedFalse(Long sourceId, String type); // Optional findByIdAndSourceIdAndIsDeletedFalse(Long id, Long sourceId); List findBySource(String source); - + List findBySourceIdAndSourceAndTypeAndIsDeletedFalse(Long sourceId, String source, String type); Optional findByIdAndSourceIdAndSourceAndIsDeletedFalse(Long id, Long sourceId, String source); diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index 7ad37f53..8ad33689 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -14,8 +14,7 @@ public interface ApplicationEvaluationService { ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationRequest applicationEvaluationRequest,Long assignedApplicationsId); void deleteApplicationEvaluation(HttpServletRequest request,Long id); - ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId); - + ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId,Long assignedApplicationId); ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long applicationEvaluationId, ApplicationEvaluationStatusTypeEnum status); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java index 4de5fe41..262f4a83 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -47,14 +47,23 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe @Override @Transactional(readOnly = true) - public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId) { - AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); - if(assignedApplications==null){ - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_WITH_ID_MSG)); - } - UserEntity user = validator.validatePreInstructor(request, assignedApplications.getUserId()); - return applicationEvaluationDao.getApplicationEvaluationByApplicationId(user, assignedApplications.getUserId()); + public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId( + HttpServletRequest request, Long applicationId, Long assignedApplicationId) { + Optional assignedApplicationsOptional = + assignedApplicationsRepository.findByApplicationIdOrId(applicationId, assignedApplicationId); + + AssignedApplicationsEntity assignedApplications = assignedApplicationsOptional + .orElseThrow(() -> new CustomValidationException( + Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_WITH_ID_MSG) + )); + UserEntity user = validator.validatePreInstructor(request, assignedApplications.getUserId()); + return applicationEvaluationDao.getApplicationEvaluationByApplicationId( + user, + assignedApplications.getApplication().getId(), + assignedApplications.getId() + ); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java index 5fc10fe4..800f443f 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -44,9 +44,12 @@ public interface ApplicationEvaluationApi { @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })) }) - @GetMapping(value = "/application/{applicationId}", produces = MediaType.APPLICATION_JSON_VALUE) - ResponseEntity> getApplicationEvaluationByApplicationId(HttpServletRequest request, - @Parameter(required = true) @PathVariable("applicationId") Long applicationId); + @GetMapping(value = "/application", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> getApplicationEvaluationByApplicationId( + HttpServletRequest request, + @Parameter(description = "Application ID", required = false) @RequestParam(value = "applicationId", required = false) Long applicationId, + @Parameter(description = "Assigned Application ID", required = false) @RequestParam(value = "assignedApplicationId", required = false) Long assignedApplicationId); + @Operation(summary = "API to delete ApplicationEvaluation", responses = { @@ -67,9 +70,9 @@ public interface ApplicationEvaluationApi { @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) })) }) - @PutMapping(value = "/{id}/status", produces = MediaType.APPLICATION_JSON_VALUE) + @PutMapping(value = "/{applicationId}/status", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> updateApplicationEvaluationStatus(HttpServletRequest request, - @Parameter( required = true) @PathVariable("id") Long id, + @Parameter( required = true) @PathVariable("applicationId") Long applicationId, @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) ApplicationEvaluationStatusTypeEnum status); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java index 3cac0a2c..b523a3ec 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java @@ -37,9 +37,11 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation } @Override - public ResponseEntity> getApplicationEvaluationByApplicationId(HttpServletRequest request, - Long applicationId) { - ApplicationEvaluationResponse response = applicationEvaluationService.getApplicationEvaluationByApplicationId(request,applicationId); + public ResponseEntity> getApplicationEvaluationByApplicationId( + HttpServletRequest request, Long applicationId, Long assignedApplicationId) { + + ApplicationEvaluationResponse response = null; + response = applicationEvaluationService.getApplicationEvaluationByApplicationId(request, applicationId,assignedApplicationId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_FETCHED_SUCCESSFULLY))); } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 2e601677..000ba9a9 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1518,7 +1518,7 @@ - + From 24af0b0b06e2db99f0111cd19027ef5d46bf72ea Mon Sep 17 00:00:00 2001 From: harish Date: Sun, 27 Oct 2024 12:03:05 +0530 Subject: [PATCH 05/13] Updated status --- .../tendermanagement/dao/AssignedApplicationsDao.java | 2 +- .../tendermanagement/enums/ApplicationStatusTypeEnum.java | 3 +++ .../tendermanagement/enums/AssignedApplicationEnum.java | 6 +++--- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index f04b5e98..b3e27da5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -79,7 +79,7 @@ public class AssignedApplicationsDao { assignApplication.setApplication(application); assignApplication.setAssignedBy(assignedByUser.getId()); assignApplication.setUserId(userId); - assignApplication.setStatus(AssignedApplicationEnum.ASSIGNED.getValue()); + assignApplication.setStatus(AssignedApplicationEnum.OPEN.getValue()); if(assignedApplicationsRequest.getStatus() != null) { assignApplication.setStatus(assignedApplicationsRequest.getStatus().getValue()); } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java index fe44af47..db6fe287 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java @@ -9,6 +9,9 @@ public enum ApplicationStatusTypeEnum { AWAITING("AWAITING"), READY("READY"), DISCARD("DISCARD"), + SOCCORSO("SOCCORSO"), + APPROVED("APPROVED"), + REJECTED("REJECTED"), EVALUATION("EVALUATION"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java index e0cba98f..59f8ae1d 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java @@ -3,9 +3,9 @@ package net.gepafin.tendermanagement.enums; import com.fasterxml.jackson.annotation.JsonValue; public enum AssignedApplicationEnum { - ASSIGNED("ASSIGNED"), - APPROVED("APPROVED"), - REJECTED("REJECTED"); + OPEN ("OPEN"), + SOCCORSO("SOCCORSO"), + CLOSE("CLOSE"); private final String value; From d9baed5aff9b9c9dacbb034021ed067dae564492 Mon Sep 17 00:00:00 2001 From: harish Date: Sun, 27 Oct 2024 12:36:29 +0530 Subject: [PATCH 06/13] The pre-instructor user must be able to request integration for a specific application --- .../constants/GepafinConstant.java | 8 + .../dao/ApplicationAmendmentRequestDao.java | 314 ++++++++++++++++++ .../dao/AssignedApplicationsDao.java | 6 - .../ApplicationAmendmentRequestEntity.java | 31 ++ .../request/ApplicationAmendmentRequest.java | 12 + .../ApplicationAmendmentRequestBean.java | 9 + .../response/AmendmentFormFieldResponse.java | 10 + .../ApplicationAmendmentRequestResponse.java | 22 ++ ...ApplicationAmendmentRequestRepository.java | 10 + .../ApplicationFormFieldRepository.java | 2 + .../ApplicationAmendmentRequestService.java | 18 + ...pplicationAmendmentRequestServiceImpl.java | 61 ++++ .../api/ApplicationAmendmentRequestApi.java | 102 ++++++ ...ApplicationAmendmentRequestController.java | 74 +++++ .../db/changelog/db.changelog-1.0.0.xml | 42 ++- src/main/resources/message_en.properties | 6 + src/main/resources/message_it.properties | 6 + 17 files changed, 726 insertions(+), 7 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/AmendmentFormFieldResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index c5b18460..4157f714 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -251,5 +251,13 @@ public class GepafinConstant { public static final String APPLICATION_NOT_IN_DRAFT_STATUS="application.not.in.draft.status"; public static final String GET_ERROR_S3 = "get.error.s3"; public static final String INVALID_APPLICATION_STATUS = "invalid.application.status"; + + public static final String APPLICATION_DATA_FOR_AMENDMENT_SUCCESS_MSG = "application.data.amendment.success"; + public static final String DELETE_APPLICATION_AMENDMENT_SUCCESS_MSG = "delete.application.amendment.success"; + public static final String CREATE_APPLICATION_DATA_FOR_AMENDMENT_MSG = "create.application.data.amendment.msg"; + public static final String APPLICATION_AMENDMENT_NOT_FOUND_MSG = "application.amendment.not.found"; + public static final String GET_APPLICATION_AMENDMENT_SUCCESS_MSG = "application.amendment.get.success"; + public static final String APPLICATION_AMENDMENT_UPDATE_SUCCESSFULLY_MSG = "application.amendment.update.successfully"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java new file mode 100644 index 00000000..8800490e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -0,0 +1,314 @@ +package net.gepafin.tendermanagement.dao; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; +import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; +import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; +import net.gepafin.tendermanagement.model.response.AmendmentFormFieldResponse; +import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; +import net.gepafin.tendermanagement.repositories.*; +import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +import static net.gepafin.tendermanagement.util.Utils.log; +import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; + +@Component +public class ApplicationAmendmentRequestDao { + @Autowired + private ApplicationService applicationService; + + @Autowired + private FormRepository formRepository; + + @Autowired + private UserService userService; + + @Autowired + private ApplicationFormRepository applicationFormRepository; + + @Autowired + private ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository; + + @Autowired + private ApplicationFormFieldRepository applicationFormFieldRepository; + + @Autowired + private DocumentRepository documentRepository; + + public List getApplicationDataForAmendment(HttpServletRequest request,Long applicationId){ + log.info("Fetching the application data for the Amendment process {}", applicationId); + ApplicationEntity application = applicationService.validateApplication(applicationId); + String callName = application.getCall().getName(); + Long protocolNumber = (application.getProtocol() != null && application.getProtocol().getProtocolNumber() != null) + ? application.getProtocol().getProtocolNumber() + : null; + + UserEntity userEntity = userService.validateUser(application.getUserId()); + String firstName = userEntity.getBeneficiary() != null ? userEntity.getBeneficiary().getFirstName() : ""; + String lastName = userEntity.getBeneficiary() != null ? userEntity.getBeneficiary().getLastName() : ""; + + String beneficiaryName = (!firstName.isBlank() ? firstName : "") + + (!lastName.isBlank() ? " " + lastName : ""); + + beneficiaryName = beneficiaryName.isBlank() ? "" : beneficiaryName; + + List forms = applicationFormRepository.findByApplicationId(applicationId); + List responses = new ArrayList<>(); + + for (ApplicationFormEntity form : forms) { + String content = form.getForm().getContent(); + List> result = filterByName(content, "fileupload"); + List formFields = getIdAndLabelFromResult(result); + + ApplicationAmendmentRequestResponse response = convertEntityToResponse( + protocolNumber, callName, formFields, beneficiaryName); + + responses.add(response); + } + + return responses; + } + + public List getIdAndLabelFromResult(List> result) { + List formFieldResponses = new ArrayList<>(); + + for (Map item : result) { + AmendmentFormFieldResponse formFieldResponse = new AmendmentFormFieldResponse(); + formFieldResponse.setFieldId((String) item.get("id")); + + // Extract "label" value from the "settings" array + List> settings = (List>) item.get("settings"); + String label = settings.stream() + .filter(setting -> "label".equals(setting.get("name"))) + .map(setting -> (String) setting.get("value")) + .findFirst() + .orElse(""); // Default to empty string if not found + + if (label == null || label.trim().isEmpty()) { + continue; + } + + formFieldResponse.setLabel(label); // Set the label as fieldValue + formFieldResponses.add(formFieldResponse); + } + + return formFieldResponses; + } + + + + private ApplicationAmendmentRequestResponse convertEntityToResponse( + Long protocolNumber, String callName, + List formFields,String beneficiaryName) { + + ApplicationAmendmentRequestResponse response = new ApplicationAmendmentRequestResponse(); + response.setProtocolNumber(protocolNumber); + response.setCallName(callName); + response.setBeneficiaryName(beneficiaryName); + response.setFormFields(formFields); + response.setResponseDays(null); + response.setSendEmail(false); + response.setSendNotification(false); + response.setNote(null); + response.setStartDate(null); + return response; + } + + public static List> filterByName(String content, String target) { + ObjectMapper objectMapper = new ObjectMapper(); + List> filteredList = new ArrayList<>(); + + try { + List> dataList = objectMapper.readValue( + content, new TypeReference>>() {}); + + for (Map data : dataList) { + if (target.equals(data.get("name"))) { + filteredList.add(data); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + return filteredList; + } + + public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(Long applicationId, ApplicationAmendmentRequest applicationAmendmentRequest){ + log.info("Submiting application data for amendment Process with details: {}", applicationId); + + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = createApplicationAmendmentRequestEntity(applicationAmendmentRequest); + ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = convertEntityToResponse(applicationAmendmentRequestEntity); + log.info("Application submitted successfully for amendment", applicationAmendmentRequestResponse); + return applicationAmendmentRequestResponse; + } + + public ApplicationAmendmentRequestEntity createApplicationAmendmentRequestEntity(ApplicationAmendmentRequest applicationAmendmentRequest){ + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = new ApplicationAmendmentRequestEntity(); + applicationAmendmentRequestEntity.setNote(applicationAmendmentRequest.getNote()); + applicationAmendmentRequestEntity.setResponseDays(applicationAmendmentRequest.getResponseDays()); + + if (applicationAmendmentRequest.getFormFields() != null) { + String fieldIdsString = applicationAmendmentRequest.getFormFields().stream() + .filter(AmendmentFormFieldResponse::isSelected) + .map(AmendmentFormFieldResponse::getFieldId) + .collect(Collectors.joining(",")); + applicationAmendmentRequestEntity.setFormFields(fieldIdsString); + } + + applicationAmendmentRequestEntity.setIsEmail(false); + applicationAmendmentRequestEntity.setIsNotification(false); + ApplicationAmendmentRequestEntity applicationAmendment = saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity); + return applicationAmendment; + } + + public ApplicationAmendmentRequestEntity saveApplicationAmendmentRequestEntity(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity){ + ApplicationAmendmentRequestEntity applicationAmendmentRequest= applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); + return applicationAmendmentRequest; + } + + public ApplicationAmendmentRequestResponse convertEntityToResponse(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity){ + ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = new ApplicationAmendmentRequestResponse(); + applicationAmendmentRequestResponse.setId(applicationAmendmentRequestEntity.getId()); + Long applicationId = 1L; + ApplicationEntity application = applicationService.validateApplication(applicationId); + applicationAmendmentRequestResponse.setNote(applicationAmendmentRequestEntity.getNote()); + applicationAmendmentRequestResponse.setResponseDays(applicationAmendmentRequestEntity.getResponseDays()); + applicationAmendmentRequestResponse.setStartDate(applicationAmendmentRequestEntity.getCreatedDate()); + applicationAmendmentRequestResponse.setSendEmail(applicationAmendmentRequestEntity.getIsEmail()); + applicationAmendmentRequestResponse.setSendNotification(applicationAmendmentRequestEntity.getIsNotification()); + String callName = application.getCall().getName(); + Long protocolNumber = (application.getProtocol() != null && application.getProtocol().getProtocolNumber() != null) + ? application.getProtocol().getProtocolNumber() + : null; + UserEntity userEntity = userService.validateUser(application.getUserId()); + String firstName = userEntity.getBeneficiary() != null ? userEntity.getBeneficiary().getFirstName() : ""; + String lastName = userEntity.getBeneficiary() != null ? userEntity.getBeneficiary().getLastName() : ""; + + String beneficiaryName = (!firstName.isBlank() ? firstName : "") + + (!lastName.isBlank() ? " " + lastName : ""); + + beneficiaryName = beneficiaryName.isBlank() ? "" : beneficiaryName; + applicationAmendmentRequestResponse.setCallName(callName); + applicationAmendmentRequestResponse.setProtocolNumber(protocolNumber); + applicationAmendmentRequestResponse.setBeneficiaryName(beneficiaryName); + + String formFieldsString = applicationAmendmentRequestEntity.getFormFields(); + List storedFieldIds = (formFieldsString != null) ? Arrays.asList(formFieldsString.split(",")) : Collections.emptyList(); + List applicationForms = applicationFormRepository.findByApplicationId(application.getId()); + List formFields = new ArrayList<>(); + for (ApplicationFormEntity formEntity : applicationForms) { + String content = formEntity.getForm().getContent(); + List> result = filterByName(content, "fileupload"); + + List matchingFields = getIdAndLabelFromResult(result).stream() + .filter(field -> storedFieldIds.contains(field.getFieldId())) + .collect(Collectors.toList()); + formFields.addAll(matchingFields); + } + applicationAmendmentRequestResponse.setFormFields(formFields); + + List formField = formFields.stream() + .map(field -> { + AmendmentFormFieldResponse responseField = new AmendmentFormFieldResponse(); + responseField.setFieldId(field.getFieldId()); + responseField.setLabel(field.getLabel()); + responseField.setSelected(true); + return responseField; + }) + .collect(Collectors.toList()); + + applicationAmendmentRequestResponse.setFormFields(formFields); + + return applicationAmendmentRequestResponse; + } + + public ApplicationAmendmentRequestEntity validateApplicationAmendmentRequest(Long id){ + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id).orElseThrow(()-> + new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); + return applicationAmendmentRequestEntity; + } + + public void deleteById(Long id) { + log.info("Deleting assigned application with ID: {}", id); + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity= validateApplicationAmendmentRequest(id); + applicationAmendmentRequestEntity.setIsDeleted(true); + applicationAmendmentRequestEntity= saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity); + log.info(" Application amendment deleted with ID: {}", id); + } + + public ApplicationAmendmentRequestResponse getApplicationAmendmentRequestById(Long id) { + log.info("Fetching application amendment with ID: {}", id); + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validateApplicationAmendmentRequest(id); + ApplicationAmendmentRequestResponse response = convertEntityToResponse(applicationAmendmentRequestEntity); + log.info("Application Amendment fetched successfully by ID: {}", response); + return response; + } + + public List getAllApplicationAmendmentRequest() { + List applicationAmendmentRequestEntities = + applicationAmendmentRequestRepository.findAll(); + + return applicationAmendmentRequestEntities.stream() + .map(this::convertEntityToResponse) + .collect(Collectors.toList()); + } + + + public ApplicationAmendmentRequestResponse updateApplicationAmendment( + Long id, ApplicationAmendmentRequestBean updateRequest) { + + log.info("Updating application amendement with ID: {}", id); + ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); + + setIfUpdated(existingApplicationAmendment::getNote, existingApplicationAmendment::setNote, updateRequest.getNote()); + if (updateRequest.getUpdatedFormFields() != null) { + updateApplicationFormFields(existingApplicationAmendment, updateRequest.getUpdatedFormFields()); + } + existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + + ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment); + ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment); + log.info("Application Amendment updated successfully: {}", response); + return response; + } + + private boolean documentExists(String documentId) { + Long documentIdLong = Long.parseLong(documentId); // Convert to Long + return documentRepository.existsById(documentIdLong); + + } + private void updateApplicationFormFields(ApplicationAmendmentRequestEntity applicationAmendment, ApplicationFormFieldRequestBean updatedFormField) { + List documentIds = Arrays.asList(updatedFormField.getFieldValue().toString().split(",")); + for (String documentId : documentIds) { + if (!documentExists(documentId)) { + log.warn("Document with ID {} does not exist. Skipping update.", documentId); + continue; + } + ApplicationFormFieldEntity formEntity = applicationFormFieldRepository.findByFieldId(updatedFormField.getFieldId()); + + if (formEntity != null) { + formEntity.setFieldValue(updatedFormField.getFieldValue().toString()); + applicationFormFieldRepository.save(formEntity); + log.info("Updated field value for field ID {} with document IDs {}", updatedFormField.getFieldId(), updatedFormField.getFieldValue()); + } else { + log.warn("No ApplicationFormEntity found with field ID {}. Skipping update.", updatedFormField.getFieldId()); + } + } + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index cfdb31ab..7ec1dbc4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -47,12 +47,6 @@ public class AssignedApplicationsDao { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED)); } ApplicationEntity application = applicationService.validateApplication(applicationId); - if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.SUBMIT.equals(application.getStatus()))) { - throw new CustomValidationException( - Status.BAD_REQUEST, - Translator.toLocale(GepafinConstant.INVALID_APPLICATION_STATUS) - ); - } UserEntity user = userService.validateUser(userId); AssignedApplicationsEntity assignment = createAssignmentEntity(application, user.getId(), assignedByUser, assignedApplicationsRequest); AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment, assignedApplicationsRequest); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java new file mode 100644 index 00000000..b13792e2 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java @@ -0,0 +1,31 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.Data; + +@Entity +@Table(name="application_amendment_request") +@Data +public class ApplicationAmendmentRequestEntity extends BaseEntity { + + @Column(name = "NOTE") + private String note; + + @Column(name ="RESPONSE_DAYS") + private Long responseDays; + + @Column(name = "IS_NOTIFICATION") + private Boolean isNotification = false; + + @Column(name = "IS_EMAIL") + private Boolean isEmail=false; + + @Column(name = "FORM_FIELDS") + private String formFields; + + @Column(name="IS_DELETED") + private Boolean isDeleted=false; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java new file mode 100644 index 00000000..0ecf1f00 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.model.response.AmendmentFormFieldResponse; +import java.util.List; + +@Data +public class ApplicationAmendmentRequest { + private String note; + private List formFields; + private Long responseDays; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java new file mode 100644 index 00000000..b845fe0e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java @@ -0,0 +1,9 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class ApplicationAmendmentRequestBean { + private String note; + private ApplicationFormFieldRequestBean updatedFormFields; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentFormFieldResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentFormFieldResponse.java new file mode 100644 index 00000000..d3fdda8f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentFormFieldResponse.java @@ -0,0 +1,10 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class AmendmentFormFieldResponse { + private String fieldId; + private String label; + private boolean isSelected = false; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java new file mode 100644 index 00000000..7758de10 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +public class ApplicationAmendmentRequestResponse { + private Long id; + private String note; + private Long responseDays; + private LocalDateTime startDate; + private boolean isSendNotification; + private boolean isSendEmail; + private Long protocolNumber; + private String callName; + private String beneficiaryName; + private List formFields; + private List updatedFormFields; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java new file mode 100644 index 00000000..f1633356 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -0,0 +1,10 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface ApplicationAmendmentRequestRepository extends JpaRepository { + Optional findByIdAndIsDeletedFalse(Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java index 89c70488..44c3cc3e 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java @@ -24,4 +24,6 @@ public interface ApplicationFormFieldRepository extends JpaRepository findByFieldValueInAndApplicationFormApplicationId( List fieldValue, Long applicationId); + public ApplicationFormFieldEntity findByFieldId(String FieldId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java new file mode 100644 index 00000000..d32c2a29 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; +import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; + +import java.util.List; + +public interface ApplicationAmendmentRequestService { + public List getApplicationDataForAmendment(HttpServletRequest request,Long applicationId); + public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(HttpServletRequest request, Long applicationEvaluationId , ApplicationAmendmentRequest applicationAmendmentRequest); + void deleteApplicationAmendmentRequest(HttpServletRequest request, Long id); + ApplicationAmendmentRequestResponse getApplicationAmendmentRequestById(HttpServletRequest request,Long id); + List getAllApplicationAmendmentRequest(HttpServletRequest request); + ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java new file mode 100644 index 00000000..fd190f3d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -0,0 +1,61 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.ApplicationAmendmentRequestDao; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; +import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; +import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; +import net.gepafin.tendermanagement.util.Validator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendmentRequestService { + + @Autowired + private Validator validator; + + @Autowired + private ApplicationAmendmentRequestDao applicationAmendmentRequestDao; + + @Override + public List getApplicationDataForAmendment(HttpServletRequest request, Long applicationId) { + UserEntity user= validator.validateUser(request); + return applicationAmendmentRequestDao.getApplicationDataForAmendment(request,applicationId); + } + + @Override + public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(HttpServletRequest request, Long applicationEvaluationId , ApplicationAmendmentRequest applicationAmendmentRequest) { + UserEntity user= validator.validateUser(request); + return applicationAmendmentRequestDao.createApplicationAmendmentRequest(applicationEvaluationId,applicationAmendmentRequest); + } + + + + @Override + public void deleteApplicationAmendmentRequest(HttpServletRequest request, Long id) { + applicationAmendmentRequestDao.deleteById(id); + } + + @Override + public ApplicationAmendmentRequestResponse getApplicationAmendmentRequestById(HttpServletRequest request,Long id) { + return applicationAmendmentRequestDao.getApplicationAmendmentRequestById(id); + } + + @Override + public List getAllApplicationAmendmentRequest(HttpServletRequest request) { + return applicationAmendmentRequestDao.getAllApplicationAmendmentRequest(); + } + + @Override + public ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean) { + UserEntity updatedByUser= validator.validateUser(request); + return applicationAmendmentRequestDao.updateApplicationAmendment(id,applicationAmendmentRequestBean); + } + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java new file mode 100644 index 00000000..5cef3b39 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java @@ -0,0 +1,102 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; +import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Validated +public interface ApplicationAmendmentRequestApi { + @Operation(summary = "Api to get application data for the Amendment process", + 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) })) }) + @GetMapping(value = "/{applicationId}", produces = "application/json") + ResponseEntity>> getApplicationDataForAmendment(HttpServletRequest request, @Parameter(description = "The application id", required = true) @PathVariable(value = "applicationId", required = true) Long applicationId); + + @Operation(summary = "Api to submit the application data for the Amendment", + 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) })) }) + @PostMapping(value = "", produces = "application/json") + ResponseEntity> createApplicationAmendmentRequest(HttpServletRequest request, + @Parameter(description = "Application Evaluation Id", required = true) @RequestParam Long applicationEvaluationId, + @Valid @RequestBody ApplicationAmendmentRequest applicationAmendmentRequest); + + @Operation(summary = "Api to delete application amendment request", + 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) })) }) + @DeleteMapping(value = "/{id}") + ResponseEntity> deleteApplicationAmendmentRequest(HttpServletRequest request, + @Parameter(description = "The application Amendment id", required = true) @PathVariable("id") Long id); + + @Operation(summary = "Api to get an application amendment by id", + 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) })) }) + @GetMapping(value = "", produces = "application/json") + ResponseEntity> getApplicationAmendmentRequestById(HttpServletRequest request,@Parameter(description = "The application amendment id", required = true) @RequestParam(value = "id", required = true) Long id); + + @Operation(summary = "Api to get all applications amendment request", + 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) })) }) + @GetMapping(value = "/getAll", produces = "application/json") + ResponseEntity>> getAllApplicationAmendmentRequest(HttpServletRequest request); + + @Operation(summary = "Api to update application amendment", + 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) })) + }) + @PutMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity> updateApplicationAmendment(HttpServletRequest request, + @Parameter(description = "The Application Amendment id", required = true) @PathVariable("id") Long id, + @Parameter(description = "Assigned Application request object", required = true) @Valid @RequestBody ApplicationAmendmentRequestBean applicationAmendmentRequestBean); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java new file mode 100644 index 00000000..a9bb8d8e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java @@ -0,0 +1,74 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.log4j.Log4j2; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; +import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; +import net.gepafin.tendermanagement.web.rest.api.ApplicationAmendmentRequestApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import java.util.List; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/amendments}") +@Log4j2 +public class ApplicationAmendmentRequestController implements ApplicationAmendmentRequestApi { + + @Autowired + ApplicationAmendmentRequestService applicationAmendmentRequestService; + + @Override + public ResponseEntity>> getApplicationDataForAmendment(HttpServletRequest request, Long applicationId) { + List applicationAmendmentBean = applicationAmendmentRequestService.getApplicationDataForAmendment(request,applicationId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(applicationAmendmentBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_DATA_FOR_AMENDMENT_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> createApplicationAmendmentRequest(HttpServletRequest request, Long applicationEvaluationId, ApplicationAmendmentRequest applicationAmendmentRequest) { + ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = applicationAmendmentRequestService.createApplicationAmendmentRequest(request,applicationEvaluationId,applicationAmendmentRequest); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(applicationAmendmentRequestResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.CREATE_APPLICATION_DATA_FOR_AMENDMENT_MSG))); + } + + @Override + public ResponseEntity> deleteApplicationAmendmentRequest(HttpServletRequest request, Long id) { + log.info("Delete Application Amendment Request- Application Amendment ID: {}", id); + applicationAmendmentRequestService.deleteApplicationAmendmentRequest(request,id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_APPLICATION_AMENDMENT_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> getApplicationAmendmentRequestById(HttpServletRequest request,Long id) { + log.info("Get Application Amendment Request By Id"); + ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = applicationAmendmentRequestService.getApplicationAmendmentRequestById(request,id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(applicationAmendmentRequestResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG))); + } + + @Override + public ResponseEntity>> getAllApplicationAmendmentRequest(HttpServletRequest request) { + log.info("Get All Applications Amendment Request"); + List applicationAmendmentRequestResponses = applicationAmendmentRequestService.getAllApplicationAmendmentRequest(request); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(applicationAmendmentRequestResponses, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean) { + log.info("Update Application Amendment"); + ApplicationAmendmentRequestResponse updateApplicationAmendment = applicationAmendmentRequestService.updateApplicationAmendment(request, id, applicationAmendmentRequestBean); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(updateApplicationAmendment, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_UPDATE_SUCCESSFULLY_MSG))); + } +} diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 5df3a2b7..83dd126c 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1327,5 +1327,45 @@ referencedTableName="hub" referencedColumnNames="id"/> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index b92a48f9..4cc3f5f5 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -276,3 +276,9 @@ assigned.application.get.success=Assigned Application details fetched successful assigned.application.update.successfully=Assigned Application updated successfully. get.error.s3=Failed to fetch the file from S3. invalid.application.status = Invalid Application status. + +application.data.amendment.success = Successfully retrieved the application data for the amendment process. +delete.application.amendment.success = Application Amendment successfully deleted. +application.amendment.not.found = Application Amendment Request not found with the given ID. +application.amendment.get.success = Application Amendment details fetched successfully with given ID. +application.amendment.update.successfully = Application Amendment Updated Successfully. \ No newline at end of file diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 214a198e..3fec3019 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -271,3 +271,9 @@ hub_not_found=Hub non trovato application.not.in.draft.status=La domanda non � in stato DRAFT. get.error.s3=Impossibile recuperare il file da S3. + +application.data.amendment.success = Recupero riuscito dei dati dell'applicazione per il processo di modifica +delete.application.amendment.success =Emendamento all'applicazione eliminato con successo. +application.amendment.not.found = Richiesta di modifica dell'applicazione non trovata con l'ID indicato. +application.amendment.get.success = Dettagli della modifica dell'applicazione recuperati correttamente con l'ID fornito. +application.amendment.update.successfully = Emendamento all'applicazione aggiornato con successo. \ No newline at end of file From 90cdc9ba501b357f88a5cfe711875beee3f2f6a3 Mon Sep 17 00:00:00 2001 From: piyuskag Date: Sun, 27 Oct 2024 16:07:56 +0530 Subject: [PATCH 07/13] Updated Code --- .../constants/GepafinConstant.java | 4 + .../dao/CommunicationAmendmentDao.java | 271 +++++++++++++----- .../ApplicationAmendmentRequestEntity.java | 37 --- ...ntEntity.java => CommunicationEntity.java} | 14 +- .../entities/SystemEmailTemplatesEntity.java | 6 +- .../request/CommunicationRequestBean.java | 1 - .../ApplicationAmendmentResponse.java | 15 + .../response/CommunicationResponseBean.java | 26 +- .../CommunicationAmendmentRepository.java | 14 - .../repositories/CommunicationRepository.java | 20 ++ .../scheduler/NotificationScheduler.java | 72 +++++ .../CommunicationAmendmentService.java | 10 +- .../CommunicationAmendmentServiceImpl.java | 16 +- .../tendermanagement/util/DateTimeUtil.java | 8 + .../api/ApplicationAmendmentRepository.java | 15 - .../rest/api/CommunicationAmendmentApi.java | 35 +-- .../CommunicationAmendmentController.java | 29 +- .../db/changelog/db.changelog-1.0.0.xml | 148 +++------- ...template_for_notification_mail_1_2_3_4.sql | 135 +++++++++ 19 files changed, 574 insertions(+), 302 deletions(-) delete mode 100644 src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java rename src/main/java/net/gepafin/tendermanagement/entities/{CommunicationAmendmentEntity.java => CommunicationEntity.java} (67%) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentResponse.java delete mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/CommunicationAmendmentRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/CommunicationRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java delete mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRepository.java create mode 100644 src/main/resources/db/dump/insert_system_email_template_for_notification_mail_1_2_3_4.sql diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 37768891..45494d2b 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -267,5 +267,9 @@ public class GepafinConstant { public static final String COMMENT_UPDATED_SUCCESS_MSG = "comment.updated.successfully"; public static final String COMMENT_DELETED_SUCCESS_MSG = "comment.deleted.successfully"; public static final String COMMENT_NOT_ASSOCIATE_WITH_AMENDMENT_ID_ERROR_MSG = "comment.not.associate.with.amendment"; + public static final String AMENDMENT_FOUND_SUCCESS = "amendment.found.success"; + public static final String INVALID_AMENDMENT_FOR_COMMENT = "invalid.amendment.for.comment"; + + public static final String DD_MM_YYYY_HH_MM = "DD_MM_YYYY_HH_MM"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationAmendmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationAmendmentDao.java index e5369f1d..790dd85f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationAmendmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationAmendmentDao.java @@ -2,12 +2,22 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; -import net.gepafin.tendermanagement.entities.CommunicationAmendmentEntity; +import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.CommunicationEntity; +import net.gepafin.tendermanagement.entities.CompanyEntity; +import net.gepafin.tendermanagement.entities.ProtocolEntity; +import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse; import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; -import net.gepafin.tendermanagement.repositories.CommunicationAmendmentRepository; -import net.gepafin.tendermanagement.web.rest.api.ApplicationAmendmentRepository; +import net.gepafin.tendermanagement.model.response.SystemEmailTemplateResponse; +import net.gepafin.tendermanagement.repositories.CommunicationRepository; +import net.gepafin.tendermanagement.service.SystemEmailTemplatesService; +import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.util.MailUtil; +import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.slf4j.Logger; @@ -15,112 +25,223 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.time.Instant; -import java.util.Optional; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; @Component public class CommunicationAmendmentDao { private static final Logger log = LoggerFactory.getLogger(CommunicationAmendmentDao.class); @Autowired - CommunicationAmendmentRepository communicationAmendmentRepository; + CommunicationRepository communicationRepository; @Autowired ApplicationAmendmentRepository applicationAmendmentRepository; - // @Autowired - // ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository; + @Autowired + private MailUtil mailUtil; - public CommunicationResponseBean addCommentToAmendmentRequest(CommunicationRequestBean communicationReq) { + @Autowired + private SystemEmailTemplatesService systemEmailTemplatesService; + + public CommunicationResponseBean addCommentToAmendmentRequest(CommunicationRequestBean communicationReq, Long amendmentId) { log.info("Adding communication request..."); - - // Fetch amendment request by ID to set the relationship - ApplicationAmendmentRequestEntity amendmentRequest = applicationAmendmentRepository - .findAmendmentById(communicationReq.getAmendmentId()); - // Create and populate CommunicationAmendmentEntity - CommunicationAmendmentEntity communicationAmendmentEntity = new CommunicationAmendmentEntity(); - communicationAmendmentEntity.setAmendmentRequest(amendmentRequest); - communicationAmendmentEntity.setCommunicationTitle(communicationReq.getTitle()); - communicationAmendmentEntity.setCommunicationComment(communicationReq.getComment()); - communicationAmendmentEntity.setIsDeleted(false); - - // Save the communication amendment entity - communicationAmendmentEntity = communicationAmendmentRepository.save(communicationAmendmentEntity); - log.info("Added comment: {}", communicationAmendmentEntity); - - // Convert and return the response bean - return convertToCommunicationResponseBean(communicationAmendmentEntity); + CommunicationEntity communicationEntity = convertToCommunicationCommentEntity(communicationReq, amendmentId); + communicationEntity = communicationRepository.save(communicationEntity); + log.info("Added comment: {}", communicationEntity); + return convertToCommunicationResponseBean(communicationEntity); } public String deleteCommunicationAmendmentComment(Long amendmentId, Long commentId) { - // Optional amendmentData = communicationAmendmentRepository.findById(amendmentId); - // if(amendmentData.isEmpty()) { - // throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.COMMENT_NOT_ASSOCIATE_WITH_AMENDMENT_ID_ERROR_MSG)); - // } - Optional data = communicationAmendmentRepository.findById(commentId); - if (data.isEmpty()) { - throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.COMMENT_NOT_FOUND)); + + CommunicationEntity data = communicationRepository.findById(commentId) + .orElseThrow(() -> new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.COMMENT_NOT_FOUND))); + if (!data.getAmendmentRequest().getId().equals(amendmentId)) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.INVALID_AMENDMENT_FOR_COMMENT)); } - communicationAmendmentRepository.deleteById(commentId); + communicationRepository.deleteById(commentId); return "Deleted Comment Successfully."; } - public CommunicationResponseBean updateCommunicationAmendment(CommunicationRequestBean communicationRequestBean) { + + public ApplicationAmendmentResponse getAmendmentComments(Long amendmentId) { + + ApplicationAmendmentRequestEntity amendmentData = applicationAmendmentRepository.findAmendmentById(amendmentId); + + if (amendmentData == null) { + throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.AMENDMENT_NOT_FOUND)); + } + List commentsList = communicationRepository.findCommentDetailsByAmendmentId(amendmentId); + if (commentsList == null) { + throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.COMMENT_NOT_FOUND)); + } + return new ApplicationAmendmentResponse(amendmentData, commentsList); + } + + public CommunicationResponseBean updateCommunicationAmendment(CommunicationRequestBean communicationRequestBean, Long amendmentId, Long commentId) { log.info("Updating communication comment..."); - CommunicationAmendmentEntity communicationAmendmentEntity = convertToCommunicationAmendmentEntity(communicationRequestBean); - communicationAmendmentEntity = communicationAmendmentRepository.save(communicationAmendmentEntity); - log.info("Updated Comment {}", communicationAmendmentEntity); - return convertToCommunicationResponseBean(communicationAmendmentEntity); + CommunicationEntity existingComment = communicationRepository.findById(commentId) + .orElseThrow(() -> new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.COMMENT_NOT_FOUND))); + if (!existingComment.getAmendmentRequest().getId().equals(amendmentId)) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.COMMENT_NOT_ASSOCIATE_WITH_AMENDMENT_ID_ERROR_MSG)); + } + existingComment.setCommunicationTitle(communicationRequestBean.getTitle()); + existingComment.setCommunicationComment(communicationRequestBean.getComment()); + existingComment.setCommentedDate(LocalDateTime.now()); + existingComment = communicationRepository.save(existingComment); + log.info("Updated Comment: {}", existingComment); + return convertToCommunicationResponseBean(existingComment); } - public CommunicationResponseBean getAmendmentComments(Long amendmentId, Long commentId) { - // Optional amendmentData = communicationAmendmentRepository.findById(amendmentId); - // if(amendmentData.isEmpty()) { - // throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.AMENDMENT_NOT_FOUND)); - // } - CommunicationAmendmentEntity commentData = communicationAmendmentRepository.findCommentsById(commentId); - CommunicationResponseBean data = convertToCommunicationResponseBean1(commentData); - return data; - } - private CommunicationResponseBean convertToCommunicationResponseBean(CommunicationAmendmentEntity entity) { + private CommunicationResponseBean convertToCommunicationResponseBean(CommunicationEntity entity) { CommunicationResponseBean response = new CommunicationResponseBean(); response.setComment(entity.getCommunicationComment()); - response.setCommunicationAddedDate(Instant.now()); - return response; - } - private CommunicationResponseBean convertToCommunicationResponseBean1(CommunicationAmendmentEntity entity) { - - CommunicationResponseBean response = new CommunicationResponseBean(); - response.setComment(entity.getCommunicationComment()); - response.setCommunicationAddedDate(Instant.now()); + response.setCommentedDate(entity.setCommentedDate();); + response.setAmendmentId(entity.getAmendmentRequest().getId()); + response.setCreatedDate(entity.getCreatedDate()); + response.setUpdatedDate(entity.getUpdatedDate()); return response; } - private CommunicationAmendmentEntity convertToCommunicationAmendmentEntity(CommunicationRequestBean communicationReq) { + private CommunicationEntity convertToCommunicationCommentEntity(CommunicationRequestBean communicationReq, Long amendmentId) { - CommunicationAmendmentEntity communicationAmendmentEntity = new CommunicationAmendmentEntity(); - ApplicationAmendmentRequestEntity entity = applicationAmendmentRepository.findAmendmentById(communicationReq.getAmendmentId()); - if (entity == null) { - throw new CustomValidationException(Status.NOT_FOUND, "Amendment Request not found for id: " + communicationReq.getAmendmentId()); - } - communicationAmendmentEntity.setAmendmentRequest(entity); - communicationAmendmentEntity.setCommunicationTitle(communicationReq.getComment()); - communicationAmendmentEntity.setCommunicationComment(communicationReq.getComment()); - return communicationAmendmentEntity; + ApplicationAmendmentRequestEntity amendmentRequest = applicationAmendmentRepository.findAmendmentById(amendmentId); + CommunicationEntity communicationEntity = new CommunicationEntity(); + communicationEntity.setAmendmentRequest(amendmentRequest); + communicationEntity.setCommunicationTitle(communicationReq.getTitle()); + communicationEntity.setCommunicationComment(communicationReq.getComment()); + communicationEntity.setIsDeleted(false); + communicationEntity.setCommentedDate(LocalDateTime.now()); + return communicationEntity; } - public ApplicationAmendmentRequestEntity getAmendmentRequestById(Long id) { - if(id==null){ - throw new CustomValidationException(Status.BAD_REQUEST, "Please provide amendmentId" + null); + private void sendMailToNotifyBeneficiaryRegardingNewAmendment(UserEntity userEntity, ApplicationEntity applicationEntity) { + CallEntity call = applicationEntity.getCall(); + CompanyEntity company = applicationEntity.getCompany(); + ProtocolEntity protocol = applicationEntity.getProtocol(); + SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService + .retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, + call, null); + + // Create the map for subject placeholders + Map subjectPlaceholders = new HashMap<>(); + subjectPlaceholders.put("{{call_name}}", call.getName()); + subjectPlaceholders.put("{{company_name}}", company.getCompanyName()); + + // Create the map for body placeholders + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{call_name}}", call.getName()); + bodyPlaceholders.put("{{protocol_number}}", protocol.getProtocolNumber().toString()); + bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(protocol.getCreatedDate())); + bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(protocol.getTime(), GepafinConstant.HH_MM_SS)); + bodyPlaceholders.put("{{form_dataInput}}", "YOUR_FORM_DATA_HERE"); + + // Replace placeholders in the subject and body + String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); + String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + + String email = userEntity.getEmail(); + if (userEntity.getBeneficiary() != null) { + email = userEntity.getBeneficiary().getEmail(); } - ApplicationAmendmentRequestEntity applicationAmendmentData = applicationAmendmentRepository.findAmendmentById(id); - if(Boolean.FALSE.equals(applicationAmendmentData)){ - throw new CustomValidationException(Status.NOT_FOUND, "Amendment Request not found for id: " + applicationAmendmentData.getId()); + mailUtil.sendByMailGun(subject, body, List.of(email), null); + mailUtil.sendByMailGun(subject, body, List.of(applicationEntity.getCompany().getEmail()), null); + } + + public void sendApplicationFailureNotificationEmail(String userEmail, ApplicationEntity applicationEntity) { + CallEntity call = applicationEntity.getCall(); + CompanyEntity company = applicationEntity.getCompany(); + ProtocolEntity protocol = applicationEntity.getProtocol(); + SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService + .retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, + call, null); + + // Create the map for subject placeholders + Map subjectPlaceholders = new HashMap<>(); + subjectPlaceholders.put("{{call_name}}", call.getName()); + subjectPlaceholders.put("{{company_name}}", company.getCompanyName()); + + // Create the map for body placeholders + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{call_name}}", call.getName()); + bodyPlaceholders.put("{{date_time_emailSend}}", DateTimeUtil.formatLocalDateTime(protocol.getCreatedDate(), GepafinConstant.DD_MM_YYYY_HH_MM)); + + // Replace placeholders in the subject and body + String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); + String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + + mailUtil.sendByMailGun(subject, body, List.of(userEmail), null); + mailUtil.sendByMailGun(subject, body, List.of(applicationEntity.getCompany().getEmail()), null); + } + + private void sendAdmissibilityNotificationEmail(UserEntity userEntity, ApplicationEntity applicationEntity) { + CallEntity call = applicationEntity.getCall(); + CompanyEntity company = applicationEntity.getCompany(); + ProtocolEntity protocol = applicationEntity.getProtocol(); + SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService + .retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, + call, null); + + // Create the map for subject placeholders + Map subjectPlaceholders = new HashMap<>(); + subjectPlaceholders.put("{{call_name}}", call.getName()); + subjectPlaceholders.put("{{company_name}}", company.getCompanyName()); + + // Create the map for body placeholders + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{call_name}}", call.getName()); + bodyPlaceholders.put("{{protocol_number}}", protocol.getProtocolNumber().toString()); + bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(protocol.getCreatedDate())); + bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(protocol.getTime(), GepafinConstant.HH_MM_SS)); + + // Replace placeholders in the subject and body + String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); + String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + + String email = userEntity.getEmail(); + if (userEntity.getBeneficiary() != null) { + email = userEntity.getBeneficiary().getEmail(); } - return applicationAmendmentData; + mailUtil.sendByMailGun(subject, body, List.of(email), null); + mailUtil.sendByMailGun(subject, body, List.of(applicationEntity.getCompany().getEmail()), null); + } + + private void sendInadmissibilityTemplateEmail(UserEntity userEntity, ApplicationEntity applicationEntity) { + CallEntity call = applicationEntity.getCall(); + CompanyEntity company = applicationEntity.getCompany(); + ProtocolEntity protocol = applicationEntity.getProtocol(); + SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService + .retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, + call, null); + + // Create the map for subject placeholders + Map subjectPlaceholders = new HashMap<>(); + subjectPlaceholders.put("{{call_name}}", call.getName()); + subjectPlaceholders.put("{{company_name}}", company.getCompanyName()); + + // Create the map for body placeholders + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{call_name}}", call.getName()); + bodyPlaceholders.put("{{protocol_number}}", protocol.getProtocolNumber().toString()); + bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(protocol.getCreatedDate())); + bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(protocol.getTime(), GepafinConstant.HH_MM_SS)); + bodyPlaceholders.put("{{form_text}}", "YOUR_FORM_TEXT_HERE"); // Replace with actual data input if available + + // Replace placeholders in the subject and body + String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); + String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + + String email = userEntity.getEmail(); + if (userEntity.getBeneficiary() != null) { + email = userEntity.getBeneficiary().getEmail(); + } + mailUtil.sendByMailGun(subject, body, List.of(email), null); + mailUtil.sendByMailGun(subject, body, List.of(applicationEntity.getCompany().getEmail()), null); } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java deleted file mode 100644 index 8e36d49d..00000000 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.gepafin.tendermanagement.entities; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; -import jakarta.persistence.ElementCollection; -import jakarta.persistence.Entity; -import jakarta.persistence.OneToMany; -import jakarta.persistence.Table; -import lombok.Data; - -import java.util.List; - -@Entity -@Table(name = "application_amendment_request") -@Data -public class ApplicationAmendmentRequestEntity extends BaseEntity { - - @Column(name = "NOTE") - private String note; - - @Column(name = "RESPONSE_DAYS") - private Long responseDays; - - @Column(name = "IS_NOTIFICATION") - private Boolean isNotification; - - @Column(name = "IS_EMAIL") - private Boolean isEmail; - - @ElementCollection - @Column(name = "FIELD_ID") - private List fieldId; - - @OneToMany(mappedBy = "amendmentRequest", cascade = CascadeType.ALL) - private List communicationAmendmentEntities; -} - diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CommunicationAmendmentEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CommunicationEntity.java similarity index 67% rename from src/main/java/net/gepafin/tendermanagement/entities/CommunicationAmendmentEntity.java rename to src/main/java/net/gepafin/tendermanagement/entities/CommunicationEntity.java index 0665df52..48262afa 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CommunicationAmendmentEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CommunicationEntity.java @@ -1,18 +1,20 @@ package net.gepafin.tendermanagement.entities; +import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Data; -import java.util.Optional; +import java.time.LocalDateTime; @Entity @Table(name = "communication_amendment") @Data -public class CommunicationAmendmentEntity extends BaseEntity { +public class CommunicationEntity extends BaseEntity { @Column(name = "COMMUNICATION_TITLE") private String communicationTitle; @@ -23,9 +25,7 @@ public class CommunicationAmendmentEntity extends BaseEntity { @Column(name = "IS_DELETED") private Boolean isDeleted; - @ManyToOne - @JoinColumn(name = "AMENDMENT_ID", referencedColumnName = "id", nullable = false) - private ApplicationAmendmentRequestEntity amendmentRequest; - -} + @Column(name = "COMMENTED_DATE") + private LocalDateTime commentedDate; +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java index 9ae12cbf..29e33277 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java @@ -39,7 +39,11 @@ public class SystemEmailTemplatesEntity extends BaseEntity { public enum SystemEmailTemplatesEntityTypeEnum { APPLICATION_SUBMISSION_TO_USER_AND_COMPANY("APPLICATION_SUBMISSION_TO_USER_AND_COMPANY"), - APPLICATION_SUBMISSION_TO_GEPAFIN("APPLICATION_SUBMISSION_TO_GEPAFIN"); + APPLICATION_SUBMISSION_TO_GEPAFIN("APPLICATION_SUBMISSION_TO_GEPAFIN"), + DOCUMENTATION_INTEGRATION_REQUEST("DOCUMENTATION_INTEGRATION_REQUEST"), + INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE("INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE"), + ADMISSIBILITY_NOTIFICATION("ADMISSIBILITY_NOTIFICATION"), + INADMISSIBILITY_TEMPLATE("INADMISSIBILITY_NOTIFICATION_2"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CommunicationRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/CommunicationRequestBean.java index 512b39be..d44e7eaa 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CommunicationRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CommunicationRequestBean.java @@ -6,6 +6,5 @@ import lombok.Data; public class CommunicationRequestBean { private String title; private String comment; - private Long amendmentId; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentResponse.java new file mode 100644 index 00000000..dcdf780b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentResponse.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.util.List; + +@Data +public class ApplicationAmendmentResponse { + private ApplicationAmendmentRequestEntity amendment; + private List commentsList; + public ApplicationAmendmentResponse(ApplicationAmendmentRequestEntity amendment, List comments) { + this.amendment = amendment; + this.commentsList = comments; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java index ae69e24c..d1405dd8 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CommunicationResponseBean.java @@ -2,10 +2,32 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; -import java.time.Instant; +import java.time.LocalDateTime; @Data public class CommunicationResponseBean { - private Instant communicationAddedDate; + private LocalDateTime commentedDate; + private String comment; + + private String title; + + private LocalDateTime createdDate; + + private LocalDateTime updatedDate; + + private Long amendmentId; + public CommunicationResponseBean(LocalDateTime commentedDate, String comment, String title, LocalDateTime createdDate, LocalDateTime updatedDate, Long amendmentId) { + + this.commentedDate = commentedDate; + this.comment = comment; + this.title = title; + this.createdDate = createdDate; + this.updatedDate = updatedDate; + this.amendmentId = amendmentId; + } + + public CommunicationResponseBean() { + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CommunicationAmendmentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CommunicationAmendmentRepository.java deleted file mode 100644 index 591e633e..00000000 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CommunicationAmendmentRepository.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.gepafin.tendermanagement.repositories; - -import net.gepafin.tendermanagement.entities.CommunicationAmendmentEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.Optional; - -public interface CommunicationAmendmentRepository extends JpaRepository { - - @Query("Select c from CommunicationAmendmentEntity c Where c.id = :id") - CommunicationAmendmentEntity findCommentsById(@Param("id") Long id); -} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CommunicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CommunicationRepository.java new file mode 100644 index 00000000..e1edb157 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CommunicationRepository.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.CommunicationEntity; +import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface CommunicationRepository extends JpaRepository { + + @Query("Select c from CommunicationEntity c Where c.id = :id") + CommunicationEntity findCommentsById(@Param("id") Long id); + + @Query("SELECT new net.gepafin.tendermanagement.model.response.CommunicationResponseBean( " + "c.addedDate, c.communicationComment, c.communicationTitle, c.createdDate, c" + + ".updatedDate, c.amendmentRequest.id) " + "FROM CommunicationEntity c " + "WHERE c.amendmentRequest.id = :amendmentId AND c.isDeleted = false") + List findCommentDetailsByAmendmentId(@Param("amendmentId") Long amendmentId); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java new file mode 100644 index 00000000..f0243da7 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java @@ -0,0 +1,72 @@ +//package net.gepafin.tendermanagement.scheduler; +// +//import net.gepafin.tendermanagement.dao.CommunicationAmendmentDao; +//import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +//import net.gepafin.tendermanagement.entities.ApplicationEntity; +//import net.gepafin.tendermanagement.entities.UserEntity; +//import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRepository; +//import net.gepafin.tendermanagement.repositories.ApplicationRepository; +//import net.gepafin.tendermanagement.repositories.UserRepository; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.scheduling.annotation.Scheduled; +//import org.springframework.stereotype.Component; +// +//import java.time.LocalDateTime; +//import java.util.List; +// +//@Component +//public class NotificationScheduler { +// +// @Autowired +// UserRepository userRepository; +// +// @Autowired +// ApplicationRepository applicationRepository; +// +// @Autowired +// ApplicationAmendmentRepository applicationAmendmentRepository; +// +// @Autowired +// CommunicationAmendmentDao communicationAmendmentDao; +// +// @Scheduled(cron = "0 0/10 * * * ?", zone = "Asia/Kolkata") +// void sendNotificationForRejectedApplicationToBeneficiary() { +// +// List applicationsList = applicationRepository.findByIsDeletedFalse(); +// List amendmentRequestList = applicationAmendmentRepository.findByIsDeletedFalse(); +// +// LocalDateTime today = LocalDateTime.now(); +// +// for (ApplicationEntity application : applicationsList) { +// ApplicationAmendmentRequestEntity amendmentRequest = getAmendmentRequestForApplication(application, amendmentRequestList); +// +// if (amendmentRequest != null) { +// LocalDateTime requestDate = amendmentRequest.getStartedDate(); +// +// // Check if requestDate + 7 days is less than or equal to today +// if (requestDate.plusDays(7).isAfter(today)) { +// // Update the application status to REJECTED +// application.setStatus("REJECTED"); +// applicationRepository.save(application); // Save updated application +// +// // Update the amendment request status to CLOSED +// amendmentRequest.setStatus("CLOSED"); +// applicationAmendmentRepository.save(amendmentRequest); // Save updated amendment request +// +// // Get the user associated with the application +// UserEntity user = userRepository.findById(application.getUserId()).orElse(null); // Adjust according to your UserRepository's method +// +// // Send email notification if user is found +// if (user != null && user.getEmail() != null) { +// communicationAmendmentDao.sendApplicationFailureNotificationEmail(user.getEmail(), application); +// } +// } +// } +// } +// } +// +// private ApplicationAmendmentRequestEntity getAmendmentRequestForApplication(ApplicationEntity application, List amendmentRequestList) { +// +// return amendmentRequestList.stream().filter(request -> request.getId().equals(application.getId())).findFirst().orElse(null); +// } +//} diff --git a/src/main/java/net/gepafin/tendermanagement/service/CommunicationAmendmentService.java b/src/main/java/net/gepafin/tendermanagement/service/CommunicationAmendmentService.java index a19f134f..23938f21 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CommunicationAmendmentService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CommunicationAmendmentService.java @@ -1,17 +1,15 @@ package net.gepafin.tendermanagement.service; -import net.gepafin.tendermanagement.entities.CommunicationAmendmentEntity; import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse; import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; -import java.util.Optional; - public interface CommunicationAmendmentService { - CommunicationResponseBean addCommentToAmendmentRequest(CommunicationRequestBean communicationRequestBean); + CommunicationResponseBean addCommentToAmendmentRequest(CommunicationRequestBean communicationRequestBean, Long amendmentId); String deleteCommunicationAmendmentComment(Long amendmentId, Long commentId); - CommunicationResponseBean updateCommunicationAmendment(CommunicationRequestBean communicationRequestBean); + CommunicationResponseBean updateCommunicationAmendment(CommunicationRequestBean communicationRequestBean, Long amendmentId, Long commentId); - CommunicationResponseBean getAmendmentComments(Long id, Long commentId); + ApplicationAmendmentResponse getAmendmentComments(Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationAmendmentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationAmendmentServiceImpl.java index 011999b0..3b0f8eb2 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationAmendmentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationAmendmentServiceImpl.java @@ -1,15 +1,13 @@ package net.gepafin.tendermanagement.service.impl; import net.gepafin.tendermanagement.dao.CommunicationAmendmentDao; -import net.gepafin.tendermanagement.entities.CommunicationAmendmentEntity; import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse; import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; import net.gepafin.tendermanagement.service.CommunicationAmendmentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Optional; - @Service public class CommunicationAmendmentServiceImpl implements CommunicationAmendmentService { @@ -17,8 +15,8 @@ public class CommunicationAmendmentServiceImpl implements CommunicationAmendment CommunicationAmendmentDao communicationAmendmentDao; @Override - public CommunicationResponseBean addCommentToAmendmentRequest(CommunicationRequestBean communicationRequestBean) { - return communicationAmendmentDao.addCommentToAmendmentRequest(communicationRequestBean); + public CommunicationResponseBean addCommentToAmendmentRequest(CommunicationRequestBean communicationRequestBean, Long amendmentId) { + return communicationAmendmentDao.addCommentToAmendmentRequest(communicationRequestBean,amendmentId); } @Override public String deleteCommunicationAmendmentComment(Long amendmentId, Long commentId) { @@ -26,13 +24,13 @@ public class CommunicationAmendmentServiceImpl implements CommunicationAmendment return communicationAmendmentDao.deleteCommunicationAmendmentComment(amendmentId, commentId); } @Override - public CommunicationResponseBean updateCommunicationAmendment(CommunicationRequestBean communicationRequestBean) { + public CommunicationResponseBean updateCommunicationAmendment(CommunicationRequestBean communicationRequestBean, Long amendmentId, Long commentId) { - return communicationAmendmentDao.updateCommunicationAmendment(communicationRequestBean); + return communicationAmendmentDao.updateCommunicationAmendment(communicationRequestBean, amendmentId, commentId); } @Override - public CommunicationResponseBean getAmendmentComments(Long id, Long commentId) { + public ApplicationAmendmentResponse getAmendmentComments(Long id) { - return communicationAmendmentDao.getAmendmentComments(id, commentId); + return communicationAmendmentDao.getAmendmentComments(id); } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java index 1fdf6c1a..ec7fe7d9 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java +++ b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java @@ -108,4 +108,12 @@ public class DateTimeUtil { return null; } } + public static String formatCreatedDate(LocalDateTime createdDate) { + + if (createdDate == null) { + return ""; + } + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); + return createdDate.format(formatter); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRepository.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRepository.java deleted file mode 100644 index d2a3984e..00000000 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package net.gepafin.tendermanagement.web.rest.api; - -import feign.Param; -import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; - -import java.util.Optional; - -public interface ApplicationAmendmentRepository extends JpaRepository { - - @Query("SELECT app FROM ApplicationAmendmentRequestEntity app WHERE app.id = :id") - ApplicationAmendmentRequestEntity findAmendmentById(@Param("id") Long id); - -} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationAmendmentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationAmendmentApi.java index 35ff7d51..90627089 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationAmendmentApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationAmendmentApi.java @@ -6,8 +6,8 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.entities.CommunicationAmendmentEntity; import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse; import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -17,10 +17,10 @@ import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; 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 java.util.Optional; +import org.springframework.web.bind.annotation.RequestBody; @Validated public interface CommunicationAmendmentApi { @@ -31,19 +31,19 @@ public interface CommunicationAmendmentApi { @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) })) }) - @PostMapping(value = "", produces = { "application/json" }) - ResponseEntity> addCommentToAmendmentRequest(HttpServletRequest request, @Parameter CommunicationRequestBean communicationResponseBean); + @PostMapping(value = "/{amendmentId}", produces = { "application/json" }) + ResponseEntity> addCommentToAmendmentRequest(HttpServletRequest request, @RequestBody @Parameter CommunicationRequestBean communicationResponseBean, + @Param(value = "amendmentId") Long amendmentId); - @Operation(summary = "Api to Get Amendment request comment", 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) })) }) - @GetMapping(value = "/{amendmentId}/{commentId}", produces = { "application/json" }) - ResponseEntity> getAmendmentComments(HttpServletRequest request, @Param(value = "amendmentId") Long id, - @Param(value = "commentId") Long commentId); + @Operation(summary = "API to Get Amendment Request Comment", 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))) }) + @GetMapping(value = "/{amendmentId}", produces = "application/json") + public ResponseEntity> getAmendmentComments(@PathVariable Long amendmentId); @Operation(summary = "Api to update communication comments", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -52,8 +52,9 @@ public interface CommunicationAmendmentApi { @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) })) }) - @PutMapping(value = "", produces = { "application/json" }) - ResponseEntity> updateCommunicationAmendment(HttpServletRequest request, @Parameter CommunicationRequestBean communicationResponseBean); + @PutMapping(value = "/{amendmentId}/{commentId}", produces = { "application/json" }) + ResponseEntity> updateCommunicationAmendment(HttpServletRequest request, @RequestBody @Parameter CommunicationRequestBean communicationResponseBean, + @PathVariable Long amendmentId, @PathVariable Long commentId); @Operation(summary = "Api to delete communication comments", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationAmendmentController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationAmendmentController.java index 8e78df76..6510b753 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationAmendmentController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationAmendmentController.java @@ -3,8 +3,8 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.entities.CommunicationAmendmentEntity; import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse; import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.CommunicationAmendmentService; @@ -16,8 +16,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.Optional; - @RestController @RequestMapping("${openapi.gepafin.base-path:/v1/communication-amendment}") public class CommunicationAmendmentController implements CommunicationAmendmentApi { @@ -26,32 +24,33 @@ public class CommunicationAmendmentController implements CommunicationAmendmentA CommunicationAmendmentService communicationAmendmentService; @Override - public ResponseEntity> addCommentToAmendmentRequest(HttpServletRequest request, CommunicationRequestBean communicationRequestBean) { + public ResponseEntity> addCommentToAmendmentRequest(HttpServletRequest request, CommunicationRequestBean communicationRequestBean, + Long amendmentId) { - CommunicationResponseBean communicationResponseBean = communicationAmendmentService.addCommentToAmendmentRequest(communicationRequestBean); + CommunicationResponseBean communicationResponseBean = communicationAmendmentService.addCommentToAmendmentRequest(communicationRequestBean, amendmentId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS))); } @Override - public ResponseEntity> getAmendmentComments(HttpServletRequest request, Long id, Long commentId) { + public ResponseEntity> getAmendmentComments(Long amendmentId) { - CommunicationResponseBean communicationResponseBean = communicationAmendmentService.getAmendmentComments(id, commentId); - return ResponseEntity.status(HttpStatus.CREATED) - .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS))); + ApplicationAmendmentResponse response = communicationAmendmentService.getAmendmentComments(amendmentId); + return ResponseEntity.ok(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.AMENDMENT_FOUND_SUCCESS))); } @Override - public ResponseEntity> updateCommunicationAmendment(HttpServletRequest request, CommunicationRequestBean communicationRequestBean) { + public ResponseEntity> updateCommunicationAmendment(HttpServletRequest request, CommunicationRequestBean communicationRequestBean, + Long amendmentId, Long commentId) { - CommunicationResponseBean communicationResponseBean = communicationAmendmentService.updateCommunicationAmendment(communicationRequestBean); - return ResponseEntity.status(HttpStatus.CREATED) - .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS))); + CommunicationResponseBean communicationResponseBean = communicationAmendmentService.updateCommunicationAmendment(communicationRequestBean, amendmentId, commentId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMENT_UPDATED_SUCCESS_MSG))); } @Override public ResponseEntity> deleteApplicationAmendmentComment(HttpServletRequest request, Long applicationAmendId, Long commentId) { String communicationResponseBean = communicationAmendmentService.deleteCommunicationAmendmentComment(applicationAmendId, commentId); - return ResponseEntity.status(HttpStatus.CREATED) - .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS))); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMENT_DELETED_SUCCESS_MSG))); } } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 133473c0..4959217d 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1336,20 +1336,20 @@ - - - - - - + + + + + + - + @@ -1357,24 +1357,24 @@ - - - - + + + + - + @@ -1382,17 +1382,17 @@ - - - + + + @@ -1402,12 +1402,12 @@ - + @@ -1483,62 +1483,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_1_2_3_4.sql b/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_1_2_3_4.sql new file mode 100644 index 00000000..2ae022d9 --- /dev/null +++ b/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_1_2_3_4.sql @@ -0,0 +1,135 @@ +INSERT INTO gepafin_schema.system_email_template +( + id, template_name, "type", html_content, subject, "json", "system", + is_deleted, created_date, updated_date +) +VALUES +( + 3, + 'Instructional Aid/Request for Documentation Integration Template', + 'DOCUMENTATION_INTEGRATION_REQUEST', + ' + +
+

RICHIESTA INTEGRAZIONE DOCUMENTALE

+

Buongiorno,

+

In riferimento alla domanda di concessione di Finanziamento agevolato a valere sul Fondo prestiti + {{call_name}} di cui al Protocollo n. {{protocol_number}} del + {{protocol_date}} e {{protocol_time}}, alla luce dell’attività istruttoria svolta, + segnaliamo quanto segue:

+
    +
  • {{form_dataInput}}
  • +
+

Vi invitiamo a fornire quanto sopra richiesto integrando la documentazione sia caricandola all’interno dello sportello + online https://bandi.gepafin.it/ che inviandola a mezzo PEC all’indirizzo + bandi.gepafin@legalmail.it entro e non oltre 10 giorni dal ricevimento della presente comunicazione, + precisando che, in caso di mancata ricezione nei termini indicati, saremo costretti a non prendere in considerazione la Vostra richiesta di finanziamento.

+

Vi informiamo che per la ricezione della PEC farà fede la ricevuta di avvenuta consegna che attesterà il buon esito + dell’invio. La documentazione trasmessa e le informazioni fornite saranno processate dall''istruttore assegnatario della pratica.

+

Distinti Saluti,

+

Gepafin S.p.a.

+
+ + ', + 'BANDO {{call_name}} - Domanda di concessione di finanziamento agevolato {{company_name}}', + NULL, + true, + false, + '2024-10-26 20:00:00', + '2024-10-26 20:00:00' +); +INSERT INTO gepafin_schema.system_email_template +( + id, template_name, "type", html_content, subject, "json", "system", + is_deleted, created_date, updated_date +) +VALUES +( + 4, + 'Notification of Inadmissibility Due to Failure to Respond Template', + 'INADMISSIBILITY_NOTIFICATION', + ' + +
+

Comunicazione di non ammissibilità per mancata risposta a richiesta integrazione documentale

+

Buongiorno,

+

Con posta elettronica certificata del {{date_time_emailSend}}, vi abbiamo comunicato che i documenti richiesti + dal Gestore sarebbero dovuti pervenire entro 10 giorni dal ricevimento di detta comunicazione. + Trascorso il termine senza la ricezione dei documenti richiesti, il Gestore non ha potuto prendere in considerazione la richiesta di finanziamento.

+

È possibile presentare ricorso tramite modello disponibile nello sportello online + https://bandi.gepafin.it/ entro 10 giorni dalla ricezione di questa comunicazione.

+

Distinti Saluti,

+

Gepafin S.p.a.

+
+ + ', + 'BANDO {{call_name}} - Domanda di finanziamento agevolato non ammessa {{company_name}}', + NULL, + true, + false, + '2024-10-26 20:00:00', + '2024-10-26 20:00:00' +); +INSERT INTO gepafin_schema.system_email_template +( + id, template_name, "type", html_content, subject, "json", "system", + is_deleted, created_date, updated_date +) +VALUES +( + 5, + 'Notification of Admissibility Template', + 'ADMISSIBILITY_NOTIFICATION', + ' + +
+

Buongiorno,

+

In riferimento alla domanda di concessione di Finanziamento agevolato “{{call_name}}†di cui al + Protocollo n. {{protocol_number}} del {{protocol_date}} alle {{protocol_time}}, l’istruttoria di ammissibilità + è stata completata con esito positivo.

+

Seguirà una comunicazione relativa alla valutazione tecnica ed economico-finanziaria ai fini della valutazione finale.

+

Distinti Saluti,

+

Gepafin S.p.a.

+
+ + ', + 'BANDO {{call_name}} – Esito positivo istruttoria di ammissibilità {{company_name}}', + NULL, + true, + false, + '2024-10-26 20:00:00', + '2024-10-26 20:00:00' +); +INSERT INTO gepafin_schema.system_email_template +( + id, template_name, "type", html_content, subject, "json", "system", + is_deleted, created_date, updated_date +) +VALUES +( + 6, + 'Notification of Inadmissibility Template', + 'INADMISSIBILITY_NOTIFICATION', + ' + +
+

Buongiorno,

+

In riferimento alla domanda di concessione di Finanziamento agevolato “{{call_name}}†di cui al + Protocollo n. {{protocol_number}} del {{protocol_date}} alle {{protocol_time}}, + l''istruttoria di ammissibilità è stata completata con esito negativo.

+

Motivazioni: {{form_text}}

+

È possibile presentare ricorso tramite modello disponibile nello sportello online + https://bandi.gepafin.it/ entro 10 giorni dalla ricezione di questa comunicazione.

+

Distinti Saluti,

+

Gepafin S.p.a.

+
+ + ', + 'BANDO {{call_name}} – Esito negativo istruttoria di ammissibilità {{company_name}}', + NULL, + true, + false, + '2024-10-26 20:00:00', + '2024-10-26 20:00:00' +); + From 03971f2685e77593b94f4d95e288b86eab9da92d Mon Sep 17 00:00:00 2001 From: harish Date: Sun, 27 Oct 2024 19:00:38 +0530 Subject: [PATCH 08/13] Done ticket GEPAFINBE-62 --- .../constants/GepafinConstant.java | 2 +- .../dao/ApplicationEvaluationDao.java | 224 +++++++++++------- .../ApplicationEvaluationResponse.java | 2 + .../ApplicationEvaluationRepository.java | 5 +- .../AssignedApplicationsRepository.java | 16 +- .../service/ApplicationEvaluationService.java | 4 +- .../ApplicationEvaluationServiceImpl.java | 68 ++++-- .../rest/api/ApplicationEvaluationApi.java | 21 +- .../ApplicationEvaluationApiController.java | 15 +- src/main/resources/message_en.properties | 2 +- src/main/resources/message_it.properties | 1 + 11 files changed, 230 insertions(+), 130 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 91a87667..5d4cee2a 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -241,7 +241,7 @@ public class GepafinConstant { public static final String APPLICATION_EVALUATION_NOT_FOUND = "application.evaluation.not.found"; public static final String APPLICATION_EVALUATION_STATUS_UPDATED_SUCCESSFULLY = "application.evaluation.status.updated.successfully"; public static final String ASSIGNED_APPLICATION_NOT_FOUND_WITH_ID_MSG = "assigned.application.not.found.with.id"; - + public static final String EITHER_APPLICATION_OR_ASSIGNED_APPLICATION_ID_REQUIRED_MSG = "either.application.or.assigned.application.id.required"; public static final String APPLICATION_ASSIGNED= "application.assigned.success.msg"; public static final String APPLICATION_ALREADY_ASSIGNED = "application.already.assigned.msg"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index cf64291a..99068a63 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -4,9 +4,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; -import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; -import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; -import net.gepafin.tendermanagement.enums.DocumentTypeEnum; +import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.ChecklistRequest; import net.gepafin.tendermanagement.model.request.CriteriaRequest; @@ -52,12 +50,12 @@ public class ApplicationEvaluationDao { @Autowired private ApplicationFormFieldRepository applicationFormFieldRepository; @Autowired - private AssignedApplicationsRepository assignedApplicationsRepository; + private AssignedApplicationsRepository assignedApplicationsRepository; @Autowired - private CriteriaFormFieldRepository criteriaFormFieldRepository; + private CriteriaFormFieldRepository criteriaFormFieldRepository; - private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req,Long applicationId) { + private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long applicationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); ApplicationEntity application = applicationService.validateApplication(applicationId); AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); @@ -94,21 +92,32 @@ public class ApplicationEvaluationDao { private void populateBasicDetails(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response) { response.setId(entity.getId()); response.setApplicationId(entity.getApplicationId()); - AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(entity.getApplicationId()).orElse(null); - response.setAssignedApplicationId(assignedApplications.getId()); + + List assignedApplicationsList = + assignedApplicationsRepository.findAllByApplicationId(entity.getApplicationId()); + + if (assignedApplicationsList.isEmpty()) { + response.setAssignedApplicationId(null); + } else { + AssignedApplicationsEntity assignedApplications = assignedApplicationsList.get(0); + response.setAssignedApplicationId(assignedApplications.getId()); + } + response.setNote(entity.getNote()); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(entity.getStatus())); response.setCreatedDate(entity.getCreatedDate()); response.setUpdatedDate(entity.getUpdatedDate()); } + private void setCriteriaResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List evaluationCriterias) { List criteriaResponsesFromEntity = entity.getCriteria() != null - ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() {}) + ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { + }) : new ArrayList<>(); List criteriaResponsesFromDB = getCriteriaResponse(entity.getApplicationId()); - addMissingCriteriaResponses(criteriaResponsesFromEntity, criteriaResponsesFromDB,entity.getApplicationId()); + addMissingCriteriaResponses(criteriaResponsesFromEntity, criteriaResponsesFromDB, entity.getApplicationId()); criteriaResponsesFromEntity.forEach(criteriaResponse -> { EvaluationCriteriaEntity matchingEvaluationCriteria = evaluationCriterias.stream() .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())) @@ -126,7 +135,8 @@ public class ApplicationEvaluationDao { response.setCriteria(criteriaResponsesFromEntity); } - private void addMissingCriteriaResponses(List criteriaResponsesFromEntity, List criteriaResponsesFromDB,Long applicationId) { + + private void addMissingCriteriaResponses(List criteriaResponsesFromEntity, List criteriaResponsesFromDB, Long applicationId) { Set existingCriteriaIds = criteriaResponsesFromEntity.stream() .map(CriteriaResponse::getId) .collect(Collectors.toSet()); @@ -139,6 +149,7 @@ public class ApplicationEvaluationDao { } } } + private List getMappedFieldsForCriteria(Long evaluationCriteriaId, Long applicationId) { List criteriaFormFields = criteriaFormFieldRepository .findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaId); @@ -190,7 +201,8 @@ public class ApplicationEvaluationDao { private void setChecklistResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List checklistEntities) { List checklistResponsesFromEntity = entity.getChecklist() != null - ? Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() {}) + ? Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() { + }) : new ArrayList<>(); List checklistResponsesFromDB = getChecklistResponse(entity.getApplicationId()); @@ -224,7 +236,8 @@ public class ApplicationEvaluationDao { private void setFieldResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List applicationFormEntities) { List fieldResponsesFromEntity = entity.getFile() != null - ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() {}) + ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() { + }) : new ArrayList<>(); List fieldResponsesFromDB = getFieldResponses(entity.getApplicationId()); addMissingFieldResponses(fieldResponsesFromEntity, fieldResponsesFromDB); @@ -305,46 +318,67 @@ public class ApplicationEvaluationDao { } private void setApplicationDetails(ApplicationEvaluationResponse response, ApplicationEvaluationEntity entity) { - ApplicationEntity application = applicationService.validateApplication(entity.getApplicationId() != null ? entity.getApplicationId(): null); + ApplicationEntity application = applicationService.validateApplication(entity.getApplicationId() != null ? entity.getApplicationId() : null); UserEntity user = userService.validateUser(application.getUserId()); CallEntity call = callRepository.findCallEntityByApplicationId(entity.getApplicationId()); String firstName = user.getFirstName() != null ? user.getFirstName() : ""; String lastName = user.getLastName() != null ? user.getLastName() : ""; - String beneficiary = String.join(" ", firstName, lastName).trim(); + response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); response.setBeneficiary(beneficiary); - response.setMinScore(call.getThreshold()); - response.setCallName(application.getCall().getName()); + response.setMinScore(call.getThreshold()!=null?call.getThreshold():null); + response.setCallName(application.getCall().getName()!=null?application.getCall().getName():null); response.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null); - response.setSubmissionDate(application.getSubmissionDate()!= null ? application.getSubmissionDate(): null); - response.setEvaluationDate(application.getSubmissionDate()!= null ? application.getSubmissionDate().plusDays(30):null); + response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null); + response.setEvaluationDate(application.getSubmissionDate() != null ? application.getSubmissionDate().plusDays(30) : null); } - public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(UserEntity user, ApplicationEvaluationRequest req,Long applicationId) { - Optional existingEntityOptional = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationId); + public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(UserEntity user, ApplicationEvaluationRequest req, Long applicationId) { + Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(applicationId); ApplicationEvaluationEntity entity; if (existingEntityOptional.isPresent()) { entity = existingEntityOptional.get(); - entity.setCriteria(Utils.convertObjectToJson(processCriteria(entity, req))); - entity.setChecklist(Utils.convertObjectToJson(processChecklist(entity, req))); - entity.setFile(Utils.convertObjectToJson(processField(entity, req))); + entity.setCriteria(Utils.convertObjectToJson(filterNonNullCriteria(processCriteria(entity, req)))); + entity.setChecklist(Utils.convertObjectToJson(filterNonNullChecklist(processChecklist(entity, req)))); + entity.setFile(Utils.convertObjectToJson(filterNonNullFields(processField(entity, req)))); entity.setIsDeleted(false); setIfUpdated(entity::getNote, entity::setNote, req.getNote()); } else { - entity = convertToEntity(user, req,applicationId); + entity = convertToEntity(user, req, applicationId); } ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(entity); return convertToResponse(savedEntity); } + + private List filterNonNullChecklist(List checklistRequests) { + return checklistRequests.stream() + .filter(request -> request.getValid() != null) + .collect(Collectors.toList()); + } + + private List filterNonNullCriteria(List criteriaRequests) { + return criteriaRequests.stream() + .filter(request -> request.getScore() != null && request.getValid() != null) + .collect(Collectors.toList()); + } + + private List filterNonNullFields(List fieldRequests) { + return fieldRequests.stream() + .filter(request -> request.getValid() != null) + .collect(Collectors.toList()); + } + private List processCriteria(ApplicationEvaluationEntity entity, ApplicationEvaluationRequest req) { - List existingCriteriaList = entity.getCriteria() != null ? - Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() {}) : new ArrayList<>(); + List existingCriteriaList = entity.getCriteria() != null + ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { + }) + : new ArrayList<>(); Map existingCriteriaMap = existingCriteriaList.stream() .collect(Collectors.toMap(CriteriaResponse::getId, criteria -> criteria)); @@ -358,8 +392,8 @@ public class ApplicationEvaluationDao { CriteriaResponse existingCriteria = existingCriteriaMap.get(incoming.getId()); if (existingCriteria != null) { - request.setScore(incoming.getScore() != null ? incoming.getScore() : existingCriteria.getScore()); - request.setValid(incoming.getValid() != null ? incoming.getValid() : existingCriteria.getValid()); + request.setScore(incoming.getScore() != null ? incoming.getScore() : null); + request.setValid(incoming.getValid() != null ? incoming.getValid() : null); } return request; }) @@ -384,8 +418,10 @@ public class ApplicationEvaluationDao { } private List processChecklist(ApplicationEvaluationEntity entity, ApplicationEvaluationRequest req) { - List existingChecklistList = entity.getChecklist() != null ? - Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() {}) : new ArrayList<>(); + List existingChecklistList = entity.getChecklist() != null + ? Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() { + }) + : new ArrayList<>(); Map existingChecklistMap = existingChecklistList.stream() .collect(Collectors.toMap(ChecklistResponse::getId, checklist -> checklist)); @@ -397,8 +433,8 @@ public class ApplicationEvaluationDao { request.setValid(incoming.getValid()); ChecklistResponse existingChecklist = existingChecklistMap.get(incoming.getId()); - if (existingChecklist != null) { - request.setValid(incoming.getValid() != null ? incoming.getValid() : existingChecklist.getValid()); + if (existingChecklist != null && incoming.getValid() == null) { + request.setValid(null); } return request; }) @@ -412,7 +448,7 @@ public class ApplicationEvaluationDao { .map(existing -> { ChecklistRequest request = new ChecklistRequest(); request.setId(existing.getId()); - request.setValid(existing.getValid()); + request.setValid(existing.getValid() != null ? existing.getValid() : null); return request; }) .toList(); @@ -422,8 +458,10 @@ public class ApplicationEvaluationDao { } private List processField(ApplicationEvaluationEntity entity, ApplicationEvaluationRequest req) { - List existingFieldList = entity.getFile() != null ? - Utils.convertJsonToList(entity.getFile(), new TypeReference>() {}) : new ArrayList<>(); + List existingFieldList = entity.getFile() != null + ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() { + }) + : new ArrayList<>(); Map existingFieldMap = existingFieldList.stream() .collect(Collectors.toMap(FieldResponse::getId, field -> field)); @@ -436,7 +474,7 @@ public class ApplicationEvaluationDao { FieldResponse existingField = existingFieldMap.get(incoming.getId()); if (existingField != null) { - request.setValid(incoming.getValid() != null ? incoming.getValid() : existingField.getValid()); + request.setValid(incoming.getValid() != null ? incoming.getValid() : null); } return request; }) @@ -460,7 +498,7 @@ public class ApplicationEvaluationDao { } private ApplicationEvaluationEntity validateApplicationEvaluation(Long id) { - Optional entityOptional = applicationEvaluationRepository.findById(id); + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(id); if (entityOptional.isEmpty()) { throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_EVALUATION_NOT_FOUND, id)); @@ -469,51 +507,52 @@ public class ApplicationEvaluationDao { } - public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(UserEntity user, Long applicationId, Long assignedApplicationId) { - - applicationService.validateApplication(applicationId); - - Optional entityOptional; - - if (applicationId != null && assignedApplicationId != null) { - entityOptional = applicationEvaluationRepository.findByApplicationIdAndAssignedApplicationsEntity_IdAndIsDeletedFalse(applicationId, assignedApplicationId); - } else if (applicationId != null) { - entityOptional = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationId); - } else if (assignedApplicationId != null) { - entityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationId); - } else { - entityOptional = applicationEvaluationRepository.findFirstByIsDeletedFalseOrderByCreatedDateDesc(); + public List getApplicationEvaluationByApplicationId(UserEntity user, Long applicationId, Long assignedApplicationId) { + if (applicationId != null && assignedApplicationId == null) { + applicationService.validateApplication(applicationId); + List evaluationEntities = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationId); + return evaluationEntities.stream() + .map(this::convertToResponse) + .collect(Collectors.toList()); } - return entityOptional.map(this::convertToResponse) - .orElseGet(() -> { - return getEvaluationResponseByApplicationid(user, applicationId, assignedApplicationId); - }); + + Optional entityOptional = + (applicationId != null && assignedApplicationId != null) + ? applicationEvaluationRepository.findByApplicationIdAndAssignedApplicationsEntity_IdAndIsDeletedFalse(applicationId, assignedApplicationId) + : applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationId); + + return entityOptional + .map(entity -> Collections.singletonList(convertToResponse(entity))) + .orElseGet(() -> Collections.singletonList(getEvaluationResponseByApplicationid(user, applicationId, assignedApplicationId))); } - public ApplicationEvaluationResponse getEvaluationResponseByApplicationid(UserEntity user, Long applicationId,Long assignedApplicationId) { + + public ApplicationEvaluationResponse getEvaluationResponseByApplicationid(UserEntity user, Long applicationId, Long assignedApplicationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); ApplicationEvaluationResponse response = new ApplicationEvaluationResponse(); - CallEntity call=null; - AssignedApplicationsEntity assignedApplications=null; + ApplicationEntity application = applicationService.validateApplication(applicationId); + CallEntity call = null; + AssignedApplicationsEntity assignedApplications = null; if (applicationId != null) { call = callRepository.findCallEntityByApplicationId(applicationId); assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); } else if (assignedApplicationId != null) { call = callRepository.findCallEntityByApplicationId(assignedApplicationId); - assignedApplications = assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationId).orElseThrow(()-> - new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG))); - } - else { + assignedApplications = assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationId).orElseThrow(() -> + new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG))); + } else { call = callRepository.findCallEntityByApplicationId(applicationId); - assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null);} + assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); + } List evaluationCriterias = evaluationCriteriaRepository.findByCallId(call.getId()); List checklistEntities = callTargetAudienceChecklistRepository.findByCallId(call.getId()); List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationId); response.setApplicationId(applicationId); response.setAssignedApplicationId(assignedApplications.getId()); response.setNote(null); + response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.OPEN.getValue())); - response.setMinScore(call.getThreshold()); + response.setMinScore(call.getThreshold()!=null?call.getThreshold():null); setCriteriaResponses(entity, applicationId, response, evaluationCriterias); setChecklistResponses(entity, applicationId, response, checklistEntities); setFileResponses(entity, applicationId, response, applicationFormEntities); @@ -525,7 +564,8 @@ public class ApplicationEvaluationDao { private void setCriteriaResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, List evaluationCriterias) { List criteriaResponses = entity.getCriteria() != null - ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() {}) + ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { + }) : getCriteriaResponse(applicationId); criteriaResponses.forEach(criteriaResponse -> { @@ -587,7 +627,8 @@ public class ApplicationEvaluationDao { private void setChecklistResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, List checklistEntities) { List checklistResponses = entity.getChecklist() != null - ? Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() {}) + ? Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() { + }) : getChecklistResponse(applicationId); checklistResponses.forEach(checklistResponse -> { @@ -603,9 +644,11 @@ public class ApplicationEvaluationDao { response.setChecklist(checklistResponses); } + private void setFileResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, List applicationFormEntities) { List fieldResponses = entity.getFile() != null - ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() {}) + ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() { + }) : getFieldResponses(applicationId); Set processedFieldIds = new HashSet<>(); @@ -678,10 +721,10 @@ public class ApplicationEvaluationDao { String beneficiary = String.join(" ", firstName, lastName).trim(); response.setBeneficiary(beneficiary); - response.setCallName(application.getCall().getName()); + response.setCallName(application.getCall().getName()!=null?application.getCall().getName():null); response.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null); - response.setSubmissionDate(application.getSubmissionDate()!= null ? application.getSubmissionDate(): null); - response.setEvaluationDate(application.getSubmissionDate()!= null ? application.getSubmissionDate().plusDays(30):null); + response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null); + response.setEvaluationDate(application.getSubmissionDate() != null ? application.getSubmissionDate().plusDays(30) : null); } @@ -751,7 +794,8 @@ public class ApplicationEvaluationDao { return criteriaResponses; } - List getChecklistResponse(Long applicationId){ CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); + List getChecklistResponse(Long applicationId) { + CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); List checklistEntities = callTargetAudienceChecklistRepository.findByCallId(call.getId()); List checklistResponses = checklistEntities.stream().map(checklist -> { ChecklistResponse response = new ChecklistResponse(); @@ -764,6 +808,7 @@ public class ApplicationEvaluationDao { return checklistResponses; } + public List getFieldResponses(Long applicationId) { List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationId); List fieldResponses = new ArrayList<>(); @@ -832,21 +877,34 @@ public class ApplicationEvaluationDao { } public void deleteById(Long id) { - ApplicationEvaluationEntity applicationEvaluationEntity= validateApplicationEvaluation(id); + ApplicationEvaluationEntity applicationEvaluationEntity = validateApplicationEvaluation(id); applicationEvaluationEntity.setIsDeleted(true); - applicationEvaluationEntity=saveApplicationEvaluationEntity(applicationEvaluationEntity); + applicationEvaluationEntity = saveApplicationEvaluationEntity(applicationEvaluationEntity); } - public ApplicationEvaluationEntity saveApplicationEvaluationEntity(ApplicationEvaluationEntity applicationEvaluationEntityData){ + + public ApplicationEvaluationEntity saveApplicationEvaluationEntity(ApplicationEvaluationEntity applicationEvaluationEntityData) { return applicationEvaluationRepository.save(applicationEvaluationEntityData); } - public ApplicationEvaluationResponse updateApplicationEvaluationStatus(Long applicationId, ApplicationEvaluationStatusTypeEnum status) { - ApplicationEvaluationEntity existingEntity = validateApplicationEvaluation(applicationId); - if (status != null && !status.getValue().equals(existingEntity.getStatus())) { - existingEntity.setStatus(status.getValue()); - } - ApplicationEvaluationEntity updatedEntity = applicationEvaluationRepository.save(existingEntity); - return convertToResponse(updatedEntity); - } + public ApplicationEvaluationResponse updateApplicationEvaluationStatus(ApplicationEntity application, AssignedApplicationsEntity assignedApplicationsEntity) { + Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationsEntity.getId()); + ApplicationEvaluationEntity entity = null; + if (existingEntityOptional.isPresent()) { + ApplicationEvaluationEntity existingEntity = existingEntityOptional.get(); + if (Boolean.TRUE.equals( + application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || + application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue()) + )) { + existingEntity.setStatus(ApplicationEvaluationStatusTypeEnum.CLOSE.getValue()); + assignedApplicationsEntity.setStatus(AssignedApplicationEnum.CLOSE.getValue()); + } entity = applicationEvaluationRepository.save(existingEntity); + assignedApplicationsEntity=assignedApplicationsRepository.save(assignedApplicationsEntity);} + + return convertToResponse(entity); + + + + } } + diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java index 5e4269eb..08425f4c 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import java.time.LocalDateTime; import java.util.List; @@ -12,6 +13,7 @@ public class ApplicationEvaluationResponse { private Long id; private Long applicationId; + private ApplicationStatusTypeEnum applicationStatus; private Long assignedApplicationId; private String note; private ApplicationEvaluationStatusTypeEnum status; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java index 81b9a3ea..69aa74fe 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java @@ -6,13 +6,14 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.List; import java.util.Optional; @Repository public interface ApplicationEvaluationRepository extends JpaRepository { - Optional findByApplicationIdAndIsDeletedFalse(Long applicationId); - + List findByApplicationIdAndIsDeletedFalse(Long applicationId); + Optional findByIdAndIsDeletedFalse(Long id); Optional findByAssignedApplicationsEntity_IdAndIsDeletedFalse(Long assignedApplicationId); Optional findByApplicationIdAndAssignedApplicationsEntity_IdAndIsDeletedFalse(Long applicationId, Long assignedApplicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java index 6b95b8f8..a2ceec9e 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java @@ -5,17 +5,23 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; + +import java.util.List; import java.util.Optional; @Repository public interface AssignedApplicationsRepository extends JpaRepository, JpaSpecificationExecutor{ Optional findByApplicationIdAndIsDeletedFalse(Long applicationId); Optional findByIdAndIsDeletedFalse(Long id); - @Query("SELECT aa FROM AssignedApplicationsEntity aa WHERE aa.isDeleted = false " + - "AND (:applicationId IS NULL OR aa.application.id = :applicationId) " + - "AND (:id IS NULL OR aa.id = :id)") - Optional findByApplicationIdOrId(@Param("applicationId") Long applicationId, - @Param("id") Long id); + @Query("SELECT aa FROM AssignedApplicationsEntity aa WHERE aa.isDeleted = false AND aa.application.id = :applicationId") + List findAllByApplicationId(@Param("applicationId") Long applicationId); + + @Query("SELECT aa FROM AssignedApplicationsEntity aa WHERE aa.isDeleted = false AND aa.application.id = :applicationId AND aa.id = :assignedApplicationId") + Optional findByApplicationIdAndAssignedApplicationId( + @Param("applicationId") Long applicationId, + @Param("assignedApplicationId") Long assignedApplicationId); + @Query("SELECT aa FROM AssignedApplicationsEntity aa WHERE aa.isDeleted = false AND aa.id = :assignedApplicationId") + Optional findByAssignedApplicationId(@Param("assignedApplicationId") Long assignedApplicationId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index 8ad33689..c07302f7 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -14,8 +14,8 @@ public interface ApplicationEvaluationService { ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationRequest applicationEvaluationRequest,Long assignedApplicationsId); void deleteApplicationEvaluation(HttpServletRequest request,Long id); - ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId,Long assignedApplicationId); - ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long applicationEvaluationId, ApplicationEvaluationStatusTypeEnum status); + List getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId,Long assignedApplicationId); + ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long assignedApplicationId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java index 262f4a83..d7ab71a2 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Collections; import java.util.List; import java.util.Optional; @@ -42,30 +43,61 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe AssignedApplicationsEntity assignedApplication = assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationsId).orElseThrow(()-> new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG))); UserEntity user=validator.validatePreInstructor(request,assignedApplication.getUserId()); - return applicationEvaluationDao.createOrUpdateApplicationEvaluation(user,req,assignedApplication.getApplication().getId()); + return applicationEvaluationDao.createOrUpdateApplicationEvaluation(user,req,assignedApplication.getId()); } @Override @Transactional(readOnly = true) - public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId( + public List getApplicationEvaluationByApplicationId( HttpServletRequest request, Long applicationId, Long assignedApplicationId) { + if (applicationId == null && assignedApplicationId == null) { + throw new CustomValidationException( + Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.EITHER_APPLICATION_OR_ASSIGNED_APPLICATION_ID_REQUIRED_MSG) + ); + } + AssignedApplicationsEntity assignedApplications; - Optional assignedApplicationsOptional = - assignedApplicationsRepository.findByApplicationIdOrId(applicationId, assignedApplicationId); + if (applicationId != null && assignedApplicationId != null) { + assignedApplications = assignedApplicationsRepository + .findByApplicationIdAndAssignedApplicationId(applicationId, assignedApplicationId) + .orElseThrow(() -> new CustomValidationException( + Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_WITH_ID_MSG) + )); + } else if (assignedApplicationId != null) { + assignedApplications = assignedApplicationsRepository + .findByAssignedApplicationId(assignedApplicationId) + .orElseThrow(() -> new CustomValidationException( + Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_WITH_ID_MSG) + )); + } else { + List assignedApplicationsList = assignedApplicationsRepository + .findAllByApplicationId(applicationId); - AssignedApplicationsEntity assignedApplications = assignedApplicationsOptional - .orElseThrow(() -> new CustomValidationException( + if (assignedApplicationsList.isEmpty()) { + throw new CustomValidationException( Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_WITH_ID_MSG) - )); + ); + } + + assignedApplications = assignedApplicationsList.get(0); + } + UserEntity user = validator.validatePreInstructor(request, assignedApplications.getUserId()); - return applicationEvaluationDao.getApplicationEvaluationByApplicationId( - user, - assignedApplications.getApplication().getId(), - assignedApplications.getId() - ); + if (applicationId != null && assignedApplicationId == null) { + return applicationEvaluationDao.getApplicationEvaluationByApplicationId(user, assignedApplications.getApplication().getId(), null); + } + + if (applicationId != null && assignedApplicationId != null) { + return applicationEvaluationDao.getApplicationEvaluationByApplicationId(user, assignedApplications.getApplication().getId(), assignedApplications.getId()); + } + return applicationEvaluationDao.getApplicationEvaluationByApplicationId(user, null, assignedApplications.getId()); } + @Override @Transactional(rollbackFor = Exception.class) public void deleteApplicationEvaluation(HttpServletRequest request,Long id) { @@ -75,13 +107,11 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe @Override @Transactional(rollbackFor = Exception.class) - public ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long applicationId, ApplicationEvaluationStatusTypeEnum status) { - AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); - if(assignedApplications==null){ - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_WITH_ID_MSG)); - } - validator.validatePreInstructor(request, assignedApplications.getUserId()); - return applicationEvaluationDao.updateApplicationEvaluationStatus(applicationId, status); + public ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long assignedApplicationId) { + AssignedApplicationsEntity assignedApplication = assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationId).orElseThrow(()-> + new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG))); + validator.validatePreInstructor(request,assignedApplication.getUserId()); + return applicationEvaluationDao.updateApplicationEvaluationStatus(assignedApplication.getApplication(),assignedApplication); } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java index 800f443f..aca53c6f 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -38,18 +38,20 @@ public interface ApplicationEvaluationApi { @Parameter(required = true) @PathVariable("assignedApplicationsId") Long assignedApplicationsId, @Parameter( required = true) @Valid @RequestBody ApplicationEvaluationRequest evaluationRequest); - @Operation(summary = "API to get ApplicationEvaluation data for evaluation process", + @Operation( + summary = "API to get ApplicationEvaluation data for evaluation process", 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) })) + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "/application", produces = MediaType.APPLICATION_JSON_VALUE) - ResponseEntity> getApplicationEvaluationByApplicationId( + ResponseEntity>> getApplicationEvaluationByApplicationId( HttpServletRequest request, - @Parameter(description = "Application ID", required = false) @RequestParam(value = "applicationId", required = false) Long applicationId, - @Parameter(description = "Assigned Application ID", required = false) @RequestParam(value = "assignedApplicationId", required = false) Long assignedApplicationId); - + @Parameter(required = false) @RequestParam(value = "applicationId", required = false) Long applicationId, + @Parameter(required = false) @RequestParam(value = "assignedApplicationId", required = false) Long assignedApplicationId); @Operation(summary = "API to delete ApplicationEvaluation", responses = { @@ -59,7 +61,7 @@ public interface ApplicationEvaluationApi { }) @DeleteMapping(value = "/{id}") ResponseEntity> deleteApplicationEvaluation(HttpServletRequest request, - @Parameter(description = "The evaluation ID", required = true) @PathVariable("id") Long id); + @Parameter( required = true) @PathVariable("id") Long id); @Operation(summary = "Api to update application evaluation status", responses = { @@ -70,9 +72,8 @@ public interface ApplicationEvaluationApi { @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) })) }) - @PutMapping(value = "/{applicationId}/status", produces = MediaType.APPLICATION_JSON_VALUE) + @PutMapping(value = "/{assignedApplicationId}/status", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> updateApplicationEvaluationStatus(HttpServletRequest request, - @Parameter( required = true) @PathVariable("applicationId") Long applicationId, - @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) ApplicationEvaluationStatusTypeEnum status); + @Parameter( required = true) @PathVariable("assignedApplicationId") Long assignedApplicationId); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java index b523a3ec..b41a65ed 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java @@ -37,15 +37,17 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation } @Override - public ResponseEntity> getApplicationEvaluationByApplicationId( + public ResponseEntity>> getApplicationEvaluationByApplicationId( HttpServletRequest request, Long applicationId, Long assignedApplicationId) { - ApplicationEvaluationResponse response = null; - response = applicationEvaluationService.getApplicationEvaluationByApplicationId(request, applicationId,assignedApplicationId); + List responseList = + applicationEvaluationService.getApplicationEvaluationByApplicationId(request, applicationId, assignedApplicationId); + return ResponseEntity.status(HttpStatus.OK) - .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_FETCHED_SUCCESSFULLY))); + .body(new Response<>(responseList, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_FETCHED_SUCCESSFULLY))); } + @Override public ResponseEntity> deleteApplicationEvaluation(HttpServletRequest request, Long id) { @@ -55,9 +57,8 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation } @Override - public ResponseEntity> updateApplicationEvaluationStatus(HttpServletRequest request, Long applicationId, - ApplicationEvaluationStatusTypeEnum status) { - ApplicationEvaluationResponse applicationEvaluationResponse = applicationEvaluationService.updateApplicationEvaluationStatus(request, applicationId, status); + public ResponseEntity> updateApplicationEvaluationStatus(HttpServletRequest request, Long assignedApplicationId) { + ApplicationEvaluationResponse applicationEvaluationResponse = applicationEvaluationService.updateApplicationEvaluationStatus(request, assignedApplicationId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applicationEvaluationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_EVALUATION_STATUS_UPDATED_SUCCESSFULLY))); } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 5d446db2..63273a75 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -262,7 +262,7 @@ evaluations.fetched.successfully = All application evaluations fetched successfu application.evaluation.status.updated.successfully=Application evaluation status updated successfully. evaluationCriteria.invalid=This evaluation criterion does not belong to the current call. assigned.application.not.found.with.id=Assigned application with this application ID not found - +either.application.or.assigned.application.id.required=Either applicationId or assignedApplicationId is required. # Hub Messages hub_create_success=Hub created successfully diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index fc74a527..2e77d058 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -260,6 +260,7 @@ evaluation.deleted.successfully = Valutazione dell'applicazione eliminata con su evaluations.fetched.successfully = Tutte le valutazioni delle applicazioni recuperate con successo. application.evaluation.status.updated.successfully=Stato della valutazione dell'applicazione aggiornato con successo. assigned.application.not.found.with.id=Applicazione assegnata con questo ID dell'applicazione non trovata +either.application.or.assigned.application.id.required=È richiesto almeno uno tra applicationId o assignedApplicationId. application.assigned.success.msg =Domanda assegnata con successo application.already.assigned.msg =La domanda � gi� assegnata From 516a64f858ff2bb2835b70c148992c617bb43235 Mon Sep 17 00:00:00 2001 From: harish Date: Sun, 27 Oct 2024 22:22:03 +0530 Subject: [PATCH 09/13] updatedCode --- .../dao/ApplicationAmendmentRequestDao.java | 29 ++++-- .../dao/ApplicationEvaluationDao.java | 2 +- .../ApplicationAmendmentRequestEntity.java | 11 ++- .../ApplicationAmendmentRequestResponse.java | 5 +- .../ApplicationAmendmentRequestService.java | 4 +- .../service/ApplicationEvaluationService.java | 6 +- ...pplicationAmendmentRequestServiceImpl.java | 10 ++- .../ApplicationEvaluationServiceImpl.java | 12 ++- .../api/ApplicationAmendmentRequestApi.java | 4 +- ...ApplicationAmendmentRequestController.java | 4 +- .../db/changelog/db.changelog-1.0.0.xml | 89 +++++++++++-------- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 3 +- 13 files changed, 116 insertions(+), 64 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 8800490e..4b2e414a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -12,6 +12,7 @@ import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBea import net.gepafin.tendermanagement.model.response.AmendmentFormFieldResponse; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; import net.gepafin.tendermanagement.repositories.*; +import net.gepafin.tendermanagement.service.ApplicationEvaluationService; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.DateTimeUtil; @@ -50,8 +51,14 @@ public class ApplicationAmendmentRequestDao { @Autowired private DocumentRepository documentRepository; - public List getApplicationDataForAmendment(HttpServletRequest request,Long applicationId){ - log.info("Fetching the application data for the Amendment process {}", applicationId); + + @Autowired + private ApplicationEvaluationService applicationEvaluationService; + + public List getApplicationDataForAmendment(HttpServletRequest request,Long applicationEvaluationId){ + log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); + ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); + Long applicationId = applicationEvaluationEntity.getApplicationId(); ApplicationEntity application = applicationService.validateApplication(applicationId); String callName = application.getCall().getName(); Long protocolNumber = (application.getProtocol() != null && application.getProtocol().getProtocolNumber() != null) @@ -149,19 +156,23 @@ public class ApplicationAmendmentRequestDao { return filteredList; } - public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(Long applicationId, ApplicationAmendmentRequest applicationAmendmentRequest){ - log.info("Submiting application data for amendment Process with details: {}", applicationId); + public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(Long applicationEvaluationId, ApplicationAmendmentRequest applicationAmendmentRequest){ + log.info("Submiting application data for amendment Process with details: {}", applicationEvaluationId); - ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = createApplicationAmendmentRequestEntity(applicationAmendmentRequest); + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = createApplicationAmendmentRequestEntity(applicationAmendmentRequest,applicationEvaluationId); ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = convertEntityToResponse(applicationAmendmentRequestEntity); log.info("Application submitted successfully for amendment", applicationAmendmentRequestResponse); return applicationAmendmentRequestResponse; } - public ApplicationAmendmentRequestEntity createApplicationAmendmentRequestEntity(ApplicationAmendmentRequest applicationAmendmentRequest){ + public ApplicationAmendmentRequestEntity createApplicationAmendmentRequestEntity(ApplicationAmendmentRequest applicationAmendmentRequest,Long applicationEvaluationId){ ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = new ApplicationAmendmentRequestEntity(); applicationAmendmentRequestEntity.setNote(applicationAmendmentRequest.getNote()); applicationAmendmentRequestEntity.setResponseDays(applicationAmendmentRequest.getResponseDays()); + ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); + + applicationAmendmentRequestEntity.setApplicationEvaluationEntity(applicationEvaluationEntity); + applicationAmendmentRequestEntity.setApplicationId(applicationEvaluationEntity.getApplicationId()); if (applicationAmendmentRequest.getFormFields() != null) { String fieldIdsString = applicationAmendmentRequest.getFormFields().stream() @@ -185,8 +196,11 @@ public class ApplicationAmendmentRequestDao { public ApplicationAmendmentRequestResponse convertEntityToResponse(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity){ ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = new ApplicationAmendmentRequestResponse(); applicationAmendmentRequestResponse.setId(applicationAmendmentRequestEntity.getId()); - Long applicationId = 1L; + Long applicationId= applicationAmendmentRequestEntity.getApplicationId(); + ApplicationEntity application = applicationService.validateApplication(applicationId); + applicationAmendmentRequestResponse.setApplicationId(applicationId); + applicationAmendmentRequestResponse.setApplicationEvaluationId(applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getId()); applicationAmendmentRequestResponse.setNote(applicationAmendmentRequestEntity.getNote()); applicationAmendmentRequestResponse.setResponseDays(applicationAmendmentRequestEntity.getResponseDays()); applicationAmendmentRequestResponse.setStartDate(applicationAmendmentRequestEntity.getCreatedDate()); @@ -244,6 +258,7 @@ public class ApplicationAmendmentRequestDao { return applicationAmendmentRequestEntity; } + public void deleteById(Long id) { log.info("Deleting assigned application with ID: {}", id); ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity= validateApplicationAmendmentRequest(id); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index cf64291a..4d2b8985 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -459,7 +459,7 @@ public class ApplicationEvaluationDao { return updatedFieldList; } - private ApplicationEvaluationEntity validateApplicationEvaluation(Long id) { + public ApplicationEvaluationEntity validateApplicationEvaluation(Long id) { Optional entityOptional = applicationEvaluationRepository.findById(id); if (entityOptional.isEmpty()) { throw new ResourceNotFoundException(Status.NOT_FOUND, diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java index b13792e2..3746927d 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java @@ -1,8 +1,6 @@ package net.gepafin.tendermanagement.entities; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.Table; +import jakarta.persistence.*; import lombok.Data; @Entity @@ -22,10 +20,17 @@ public class ApplicationAmendmentRequestEntity extends BaseEntity { @Column(name = "IS_EMAIL") private Boolean isEmail=false; + @Column(name = "APPLICATION_ID") + private Long applicationId; + @Column(name = "FORM_FIELDS") private String formFields; @Column(name="IS_DELETED") private Boolean isDeleted=false; + @ManyToOne + @JoinColumn(name = "APPLICATION_EVALUATION_ID", nullable = false) + private ApplicationEvaluationEntity applicationEvaluationEntity; + } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java index 7758de10..2d485361 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; +import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import java.time.LocalDateTime; import java.util.List; @@ -17,6 +18,8 @@ public class ApplicationAmendmentRequestResponse { private String callName; private String beneficiaryName; private List formFields; - private List updatedFormFields; + private List applicationFormFields; + private Long applicationId; + private Long applicationEvaluationId; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java index d32c2a29..7e0a739c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; @@ -8,11 +9,12 @@ import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestRe import java.util.List; public interface ApplicationAmendmentRequestService { - public List getApplicationDataForAmendment(HttpServletRequest request,Long applicationId); + public List getApplicationDataForAmendment(HttpServletRequest request,Long applicationEvaluationId); public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(HttpServletRequest request, Long applicationEvaluationId , ApplicationAmendmentRequest applicationAmendmentRequest); void deleteApplicationAmendmentRequest(HttpServletRequest request, Long id); ApplicationAmendmentRequestResponse getApplicationAmendmentRequestById(HttpServletRequest request,Long id); List getAllApplicationAmendmentRequest(HttpServletRequest request); ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean); + ApplicationAmendmentRequestEntity validateApplicationAmendmentRequest(Long applicationAmendmentId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index 8ad33689..245ad479 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -1,12 +1,11 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; -import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; -import net.gepafin.tendermanagement.model.request.UpdateApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; -import net.gepafin.tendermanagement.model.response.ApplicationResponse; + import java.util.List; @@ -18,4 +17,5 @@ public interface ApplicationEvaluationService { ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long applicationEvaluationId, ApplicationEvaluationStatusTypeEnum status); + ApplicationEvaluationEntity validateApplicationEvaluation(Long applicationEvaluationId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java index fd190f3d..260a5e70 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.ApplicationAmendmentRequestDao; +import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; @@ -23,9 +24,9 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm private ApplicationAmendmentRequestDao applicationAmendmentRequestDao; @Override - public List getApplicationDataForAmendment(HttpServletRequest request, Long applicationId) { + public List getApplicationDataForAmendment(HttpServletRequest request, Long applicationEvaluationId) { UserEntity user= validator.validateUser(request); - return applicationAmendmentRequestDao.getApplicationDataForAmendment(request,applicationId); + return applicationAmendmentRequestDao.getApplicationDataForAmendment(request,applicationEvaluationId); } @Override @@ -57,5 +58,10 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm return applicationAmendmentRequestDao.updateApplicationAmendment(id,applicationAmendmentRequestBean); } + @Override + public ApplicationAmendmentRequestEntity validateApplicationAmendmentRequest(Long applicationAmendmentId) { + return applicationAmendmentRequestDao.validateApplicationAmendmentRequest(applicationAmendmentId); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java index 262f4a83..1f032aff 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -5,14 +5,13 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.ApplicationEvaluationDao; +import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; -import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; -import net.gepafin.tendermanagement.model.request.UpdateApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; -import net.gepafin.tendermanagement.model.response.ApplicationResponse; + import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; import net.gepafin.tendermanagement.service.ApplicationEvaluationService; import net.gepafin.tendermanagement.util.Validator; @@ -23,7 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; + import java.util.Optional; @Service @@ -84,4 +83,9 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe return applicationEvaluationDao.updateApplicationEvaluationStatus(applicationId, status); } + + @Override + public ApplicationEvaluationEntity validateApplicationEvaluation(Long applicationEvaluationId) { + return applicationEvaluationDao.validateApplicationEvaluation(applicationEvaluationId); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java index 5cef3b39..91551d7e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java @@ -30,8 +30,8 @@ public interface ApplicationAmendmentRequestApi { @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) })) }) - @GetMapping(value = "/{applicationId}", produces = "application/json") - ResponseEntity>> getApplicationDataForAmendment(HttpServletRequest request, @Parameter(description = "The application id", required = true) @PathVariable(value = "applicationId", required = true) Long applicationId); + @GetMapping(value = "applicationEvaluation/{id}", produces = "application/json") + ResponseEntity>> getApplicationDataForAmendment(HttpServletRequest request, @Parameter(description = "The Application Evaluation id", required = true) @PathVariable(value = "id", required = true) Long applicationEvaluationId); @Operation(summary = "Api to submit the application data for the Amendment", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java index a9bb8d8e..27316bd5 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java @@ -27,8 +27,8 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme ApplicationAmendmentRequestService applicationAmendmentRequestService; @Override - public ResponseEntity>> getApplicationDataForAmendment(HttpServletRequest request, Long applicationId) { - List applicationAmendmentBean = applicationAmendmentRequestService.getApplicationDataForAmendment(request,applicationId); + public ResponseEntity>> getApplicationDataForAmendment(HttpServletRequest request, Long applicationEvaluationId) { + List applicationAmendmentBean = applicationAmendmentRequestService.getApplicationDataForAmendment(request,applicationEvaluationId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applicationAmendmentBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_DATA_FOR_AMENDMENT_SUCCESS_MSG))); } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 83d098bb..27a58cf3 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1345,43 +1345,7 @@ referencedColumnNames="id"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 6637785e..7f951e39 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -287,6 +287,7 @@ invalid.application.status = Invalid Application status. application.data.amendment.success = Successfully retrieved the application data for the amendment process. delete.application.amendment.success = Application Amendment successfully deleted. +create.application.data.amendment.msg = Application amendment submited succesfully. application.amendment.not.found = Application Amendment Request not found with the given ID. application.amendment.get.success = Application Amendment details fetched successfully with given ID. application.amendment.update.successfully = Application Amendment Updated Successfully. \ No newline at end of file diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index faba7714..06b49496 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -284,4 +284,5 @@ application.data.amendment.success = Recupero riuscito dei dati dell'applicazion delete.application.amendment.success =Emendamento all'applicazione eliminato con successo. application.amendment.not.found = Richiesta di modifica dell'applicazione non trovata con l'ID indicato. application.amendment.get.success = Dettagli della modifica dell'applicazione recuperati correttamente con l'ID fornito. -application.amendment.update.successfully = Emendamento all'applicazione aggiornato con successo. \ No newline at end of file +application.amendment.update.successfully = Emendamento all'applicazione aggiornato con successo. +create.application.data.amendment.msg =Emendamento alla domanda inviato con successo \ No newline at end of file From e1b6ec6c023d8c5ade98a04dfbefd41d059bb22f Mon Sep 17 00:00:00 2001 From: piyuskag Date: Mon, 28 Oct 2024 11:22:48 +0530 Subject: [PATCH 10/13] document code updation. --- .../impl/S3ReUploadMigrationService.java | 18 +++------ .../UserSignedAndDelegationServiceImpl.java | 40 ++++++------------- .../db/changelog/db.changelog-1.0.0.xml | 10 ++--- 3 files changed, 22 insertions(+), 46 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java index 4db4ea12..4bc59150 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java @@ -80,7 +80,7 @@ public class S3ReUploadMigrationService { File localFile = downloadFileFromS3(oldUrl); String newKey = generateNewS3Path(document); // Make sure this generates the correct new path String uploadedPath = uploadFileToNewBucket(localFile, newKey); - updateDocumentPathAndDeleteOldEntry(document, uploadedPath); + updateDocumentPathAndNameEntry(document, uploadedPath); } catch (Exception e) { log.error("Error processing document {}: {}", document.getId(), e.getMessage()); } @@ -178,20 +178,12 @@ public class S3ReUploadMigrationService { } - private void updateDocumentPathAndDeleteOldEntry(DocumentEntity document, String newPath) { + private void updateDocumentPathAndNameEntry(DocumentEntity document, String newPath) { String fileName = extractFileName(newPath); - DocumentEntity newDocument = new DocumentEntity(); - newDocument.setFilePath(newPath); - newDocument.setSource(document.getSource()); - newDocument.setType(document.getType()); - newDocument.setIsDeleted(false); - newDocument.setSourceId(document.getSourceId()); - newDocument.setFileName(fileName); - - documentRepository.save(newDocument); - documentRepository.delete(document); - + document.setFilePath(newPath); + document.setFileName(fileName); + documentRepository.save(document); log.info("Migrated document ID: {} to new path: {}", document.getId(), newPath); } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java index c1228565..dbd54afd 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java @@ -32,7 +32,7 @@ public class UserSignedAndDelegationServiceImpl { private static final String OLD_BUCKET = "mementoresources"; private static final String NEW_BUCKET = "mementoresources"; - + private static final String SECURE_KEY = "267163962963"; @Autowired @@ -49,7 +49,7 @@ public class UserSignedAndDelegationServiceImpl { @Autowired ApplicationRepository applicationRepository; - + @Autowired S3ConfigRepository s3ConfigRepository; @@ -58,7 +58,6 @@ public class UserSignedAndDelegationServiceImpl { private boolean migrationCompleted = false; - public String migrateUserDelegatedDocuments(String providedKey) { if (migrationCompleted) { @@ -84,7 +83,7 @@ public class UserSignedAndDelegationServiceImpl { File localFile = downloadFileFromS3(oldUrl); String newKey = generateNewS3PathForDelegationDoc(); String uploadedPath = uploadFileToNewBucket(localFile, newKey); - updateDelegatedDocumentPathAndDeleteOldEntry(document, uploadedPath); + updateDelegatedDocumentPathAndNameEntry(document, uploadedPath); } catch (Exception e) { log.error("Error processing user designated document {}: {}", document.getId(), e.getMessage()); } @@ -92,7 +91,6 @@ public class UserSignedAndDelegationServiceImpl { return "Migrated"; } - public String migrateUserSignedDocuments(String providedKey) { if (migrationCompleted) { @@ -117,7 +115,7 @@ public class UserSignedAndDelegationServiceImpl { File localFile = downloadFileFromS3(oldUrl); String newKey = generateNewS3PathForUserSignedDoc(document); String uploadedPath = uploadFileToNewBucket(localFile, newKey); - updateDocumentPathAndDeleteOldEntry(document, uploadedPath); + updateDocumentPathAndNameEntry(document, uploadedPath); } catch (Exception e) { log.error("Error processing user signed document {}: {}", document.getId(), e.getMessage()); } @@ -227,35 +225,21 @@ public class UserSignedAndDelegationServiceImpl { return path.substring(path.lastIndexOf('/') + 1); } - private void updateDocumentPathAndDeleteOldEntry(ApplicationSignedDocumentEntity document, String newPath) { + private void updateDocumentPathAndNameEntry(ApplicationSignedDocumentEntity document, String newPath) { - ApplicationSignedDocumentEntity newDocument = new ApplicationSignedDocumentEntity(); String fileName = extractFileNameFromPath(newPath); - newDocument.setFilePath(newPath); - newDocument.setFileName(fileName); - newDocument.setApplication(document.getApplication()); - newDocument.setStatus("ACTIVE"); - - applicationSignedDocumentRepository.save(newDocument); - applicationSignedDocumentRepository.delete(document); - + document.setFilePath(newPath); + document.setFileName(fileName); + applicationSignedDocumentRepository.save(document); log.info("Migrated document ID: {} to new path: {}", document.getId(), newPath); } - private void updateDelegatedDocumentPathAndDeleteOldEntry(UserCompanyDelegationEntity document, String newPath) { + private void updateDelegatedDocumentPathAndNameEntry(UserCompanyDelegationEntity document, String newPath) { String fileName = extractFileNameFromPath(newPath); - UserCompanyDelegationEntity newDocument = new UserCompanyDelegationEntity(); - newDocument.setFilePath(newPath); - newDocument.setFileName(fileName); - newDocument.setBeneficiaryId(document.getBeneficiaryId()); - newDocument.setUserId(document.getUserId()); - newDocument.setCompanyId(document.getCompanyId()); - newDocument.setStatus("ACTIVE"); - - userCompanyDelegationRepository.save(newDocument); - userCompanyDelegationRepository.delete(document); - + document.setFilePath(newPath); + document.setFileName(fileName); + userCompanyDelegationRepository.save(document); log.info("Migrated document ID: {} to new path: {}", document.getId(), newPath); } } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 72224de3..456337cb 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1443,7 +1443,7 @@ - + @@ -1452,7 +1452,7 @@ - + @@ -1461,7 +1461,7 @@ - + @@ -1470,7 +1470,7 @@ - + @@ -1479,7 +1479,7 @@ - + From 58ef5dc80cc6be1c2e6c7898ccd7d363182d2ea6 Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 28 Oct 2024 12:13:49 +0530 Subject: [PATCH 11/13] updatedCode --- .../dao/ApplicationAmendmentRequestDao.java | 159 +++++++++++++----- .../ApplicationAmendmentRequestResponse.java | 1 + ...ApplicationAmendmentRequestRepository.java | 3 +- .../ApplicationAmendmentRequestService.java | 4 +- .../service/AssignedApplicationsService.java | 2 + ...pplicationAmendmentRequestServiceImpl.java | 6 +- .../impl/AssignedApplicationsServiceImpl.java | 6 + .../api/ApplicationAmendmentRequestApi.java | 7 +- ...ApplicationAmendmentRequestController.java | 8 +- src/main/resources/application.properties | 2 + 10 files changed, 139 insertions(+), 59 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 4b2e414a..c728adc4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -2,24 +2,31 @@ package net.gepafin.tendermanagement.dao; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.persistence.criteria.Join; +import jakarta.persistence.criteria.Predicate; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; import net.gepafin.tendermanagement.model.response.AmendmentFormFieldResponse; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; import net.gepafin.tendermanagement.repositories.*; -import net.gepafin.tendermanagement.service.ApplicationEvaluationService; -import net.gepafin.tendermanagement.service.ApplicationService; -import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.service.*; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; +import java.time.temporal.ChronoUnit; + import java.time.LocalDateTime; import java.util.*; @@ -30,6 +37,9 @@ import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @Component public class ApplicationAmendmentRequestDao { + @Value("${application.amendment.expiration.days}") + private long expirationDays; + @Autowired private ApplicationService applicationService; @@ -39,6 +49,9 @@ public class ApplicationAmendmentRequestDao { @Autowired private UserService userService; + @Autowired + private DocumentService documentService; + @Autowired private ApplicationFormRepository applicationFormRepository; @@ -55,11 +68,25 @@ public class ApplicationAmendmentRequestDao { @Autowired private ApplicationEvaluationService applicationEvaluationService; - public List getApplicationDataForAmendment(HttpServletRequest request,Long applicationEvaluationId){ + @Autowired + private AssignedApplicationsService assignedApplicationsService; + + @Autowired + private ApplicationEvaluationRepository applicationEvaluationRepository; + + @Autowired + private ApplicationRepository applicationRepository; + + @Autowired + private AssignedApplicationsRepository assignedApplicationsRepository; + + public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(HttpServletRequest request, Long applicationEvaluationId) { log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); Long applicationId = applicationEvaluationEntity.getApplicationId(); ApplicationEntity application = applicationService.validateApplication(applicationId); + + // Set common application-level details String callName = application.getCall().getName(); Long protocolNumber = (application.getProtocol() != null && application.getProtocol().getProtocolNumber() != null) ? application.getProtocol().getProtocolNumber() @@ -71,26 +98,31 @@ public class ApplicationAmendmentRequestDao { String beneficiaryName = (!firstName.isBlank() ? firstName : "") + (!lastName.isBlank() ? " " + lastName : ""); - beneficiaryName = beneficiaryName.isBlank() ? "" : beneficiaryName; + ApplicationAmendmentRequestResponse response = new ApplicationAmendmentRequestResponse(); + response.setId(applicationEvaluationId); + response.setProtocolNumber(protocolNumber); + response.setCallName(callName); + response.setBeneficiaryName(beneficiaryName); + response.setApplicationId(applicationId); + response.setApplicationEvaluationId(applicationEvaluationId); + List forms = applicationFormRepository.findByApplicationId(applicationId); - List responses = new ArrayList<>(); + List allFormFields = new ArrayList<>(); for (ApplicationFormEntity form : forms) { String content = form.getForm().getContent(); List> result = filterByName(content, "fileupload"); - List formFields = getIdAndLabelFromResult(result); - - ApplicationAmendmentRequestResponse response = convertEntityToResponse( - protocolNumber, callName, formFields, beneficiaryName); - - responses.add(response); + allFormFields.addAll(getIdAndLabelFromResult(result)); } - return responses; + response.setFormFields(allFormFields); + + return response; } + public List getIdAndLabelFromResult(List> result) { List formFieldResponses = new ArrayList<>(); @@ -118,24 +150,6 @@ public class ApplicationAmendmentRequestDao { } - - private ApplicationAmendmentRequestResponse convertEntityToResponse( - Long protocolNumber, String callName, - List formFields,String beneficiaryName) { - - ApplicationAmendmentRequestResponse response = new ApplicationAmendmentRequestResponse(); - response.setProtocolNumber(protocolNumber); - response.setCallName(callName); - response.setBeneficiaryName(beneficiaryName); - response.setFormFields(formFields); - response.setResponseDays(null); - response.setSendEmail(false); - response.setSendNotification(false); - response.setNote(null); - response.setStartDate(null); - return response; - } - public static List> filterByName(String content, String target) { ObjectMapper objectMapper = new ObjectMapper(); List> filteredList = new ArrayList<>(); @@ -172,7 +186,9 @@ public class ApplicationAmendmentRequestDao { ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); applicationAmendmentRequestEntity.setApplicationEvaluationEntity(applicationEvaluationEntity); - applicationAmendmentRequestEntity.setApplicationId(applicationEvaluationEntity.getApplicationId()); + Long applicationId = applicationEvaluationEntity.getApplicationId(); + Long assignedApplicationId = applicationEvaluationEntity.getAssignedApplicationsEntity().getId(); + applicationAmendmentRequestEntity.setApplicationId(applicationId); if (applicationAmendmentRequest.getFormFields() != null) { String fieldIdsString = applicationAmendmentRequest.getFormFields().stream() @@ -185,6 +201,19 @@ public class ApplicationAmendmentRequestDao { applicationAmendmentRequestEntity.setIsEmail(false); applicationAmendmentRequestEntity.setIsNotification(false); ApplicationAmendmentRequestEntity applicationAmendment = saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity); + + //Set Status + applicationEvaluationEntity.setStatus(ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue()); + applicationEvaluationRepository.save(applicationEvaluationEntity); + + ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId); + applicationEntity.setStatus(ApplicationStatusTypeEnum.SOCCORSO.getValue()); + applicationRepository.save(applicationEntity); + + AssignedApplicationsEntity assignedApplicationsEntity = assignedApplicationsService.validateAssignedApplication(assignedApplicationId); + assignedApplicationsEntity.setStatus(AssignedApplicationEnum.SOCCORSO.getValue()); + assignedApplicationsRepository.save(assignedApplicationsEntity); + return applicationAmendment; } @@ -203,7 +232,12 @@ public class ApplicationAmendmentRequestDao { applicationAmendmentRequestResponse.setApplicationEvaluationId(applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getId()); applicationAmendmentRequestResponse.setNote(applicationAmendmentRequestEntity.getNote()); applicationAmendmentRequestResponse.setResponseDays(applicationAmendmentRequestEntity.getResponseDays()); - applicationAmendmentRequestResponse.setStartDate(applicationAmendmentRequestEntity.getCreatedDate()); + LocalDateTime startDate = applicationAmendmentRequestEntity.getCreatedDate(); + applicationAmendmentRequestResponse.setStartDate(startDate); + + LocalDateTime expirationDate = startDate.plus(expirationDays, ChronoUnit.DAYS); + applicationAmendmentRequestResponse.setExpirationDate(expirationDate); + applicationAmendmentRequestResponse.setSendEmail(applicationAmendmentRequestEntity.getIsEmail()); applicationAmendmentRequestResponse.setSendNotification(applicationAmendmentRequestEntity.getIsNotification()); String callName = application.getCall().getName(); @@ -247,7 +281,7 @@ public class ApplicationAmendmentRequestDao { }) .collect(Collectors.toList()); - applicationAmendmentRequestResponse.setFormFields(formFields); + applicationAmendmentRequestResponse.setFormFields(formField); return applicationAmendmentRequestResponse; } @@ -275,15 +309,29 @@ public class ApplicationAmendmentRequestDao { return response; } - public List getAllApplicationAmendmentRequest() { + public List getAllApplicationAmendmentRequest(Long userId) { + Specification spec = search(userId); List applicationAmendmentRequestEntities = - applicationAmendmentRequestRepository.findAll(); + applicationAmendmentRequestRepository.findAll(spec); return applicationAmendmentRequestEntities.stream() .map(this::convertEntityToResponse) .collect(Collectors.toList()); } + private Specification search(Long userId) { + return (root, query, builder) -> { + Predicate predicate = builder.isFalse(root.get("isDeleted")); // Only non-deleted records + + if (userId != null) { + Join evaluationJoin = root.join("applicationEvaluationEntity"); + predicate = builder.and(predicate, builder.equal(evaluationJoin.get("userId"), userId)); + } + + return predicate; // Return final predicate + }; + } + public ApplicationAmendmentRequestResponse updateApplicationAmendment( Long id, ApplicationAmendmentRequestBean updateRequest) { @@ -303,27 +351,46 @@ public class ApplicationAmendmentRequestDao { return response; } - private boolean documentExists(String documentId) { - Long documentIdLong = Long.parseLong(documentId); // Convert to Long - return documentRepository.existsById(documentIdLong); - - } private void updateApplicationFormFields(ApplicationAmendmentRequestEntity applicationAmendment, ApplicationFormFieldRequestBean updatedFormField) { + // Convert fieldValue (object) to a comma-separated list of document IDs List documentIds = Arrays.asList(updatedFormField.getFieldValue().toString().split(",")); + List validDocumentIds = new ArrayList<>(); + for (String documentId : documentIds) { - if (!documentExists(documentId)) { - log.warn("Document with ID {} does not exist. Skipping update.", documentId); + documentId = documentId.trim(); // Remove any extra spaces + if (documentId.isEmpty()) { + log.warn("Encountered an empty document ID. Skipping."); continue; } + + try { + // Parse documentId to Long and validate it + Long documentIdLong = Long.parseLong(documentId); + DocumentEntity documentEntity = documentService.validateDocument(documentIdLong); + + if (documentEntity != null) { + validDocumentIds.add(documentId); + } else { + log.warn("Document with ID {} does not exist. Skipping this ID.", documentId); + } + } catch (NumberFormatException e) { + log.warn("Invalid document ID format: {}. Skipping this ID.", documentId); + } + } + + if (!validDocumentIds.isEmpty()) { ApplicationFormFieldEntity formEntity = applicationFormFieldRepository.findByFieldId(updatedFormField.getFieldId()); if (formEntity != null) { - formEntity.setFieldValue(updatedFormField.getFieldValue().toString()); + formEntity.setFieldValue(String.join(",", validDocumentIds)); applicationFormFieldRepository.save(formEntity); - log.info("Updated field value for field ID {} with document IDs {}", updatedFormField.getFieldId(), updatedFormField.getFieldValue()); + log.info("Updated field value for field ID {} with document IDs {}", updatedFormField.getFieldId(), String.join(",", validDocumentIds)); } else { - log.warn("No ApplicationFormEntity found with field ID {}. Skipping update.", updatedFormField.getFieldId()); + log.warn("No ApplicationFormFieldEntity found with field ID {}. Skipping update.", updatedFormField.getFieldId()); } + } else { + log.warn("No valid document IDs found for update. Skipping field ID {}", updatedFormField.getFieldId()); } } + } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java index 2d485361..23273057 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java @@ -21,5 +21,6 @@ public class ApplicationAmendmentRequestResponse { private List applicationFormFields; private Long applicationId; private Long applicationEvaluationId; + private LocalDateTime expirationDate; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index f1633356..35ba3282 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -2,9 +2,10 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import java.util.Optional; -public interface ApplicationAmendmentRequestRepository extends JpaRepository { +public interface ApplicationAmendmentRequestRepository extends JpaRepository, JpaSpecificationExecutor { Optional findByIdAndIsDeletedFalse(Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java index 7e0a739c..cce56d12 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java @@ -9,11 +9,11 @@ import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestRe import java.util.List; public interface ApplicationAmendmentRequestService { - public List getApplicationDataForAmendment(HttpServletRequest request,Long applicationEvaluationId); + public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(HttpServletRequest request,Long applicationEvaluationId); public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(HttpServletRequest request, Long applicationEvaluationId , ApplicationAmendmentRequest applicationAmendmentRequest); void deleteApplicationAmendmentRequest(HttpServletRequest request, Long id); ApplicationAmendmentRequestResponse getApplicationAmendmentRequestById(HttpServletRequest request,Long id); - List getAllApplicationAmendmentRequest(HttpServletRequest request); + List getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId); ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean); ApplicationAmendmentRequestEntity validateApplicationAmendmentRequest(Long applicationAmendmentId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java b/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java index 166e9180..f1670687 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; @@ -16,4 +17,5 @@ public interface AssignedApplicationsService { List getAllAssignedApplications(HttpServletRequest request, Long userId); AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, Long id, AssignedApplicationsRequest assignedApplicationsRequest); AssignedApplicationsResponse getAssignedApplicationById(HttpServletRequest request, Long id); + AssignedApplicationsEntity validateAssignedApplication(Long assignedApplicationId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java index 260a5e70..34edbb89 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -24,7 +24,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm private ApplicationAmendmentRequestDao applicationAmendmentRequestDao; @Override - public List getApplicationDataForAmendment(HttpServletRequest request, Long applicationEvaluationId) { + public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(HttpServletRequest request, Long applicationEvaluationId) { UserEntity user= validator.validateUser(request); return applicationAmendmentRequestDao.getApplicationDataForAmendment(request,applicationEvaluationId); } @@ -48,8 +48,8 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override - public List getAllApplicationAmendmentRequest(HttpServletRequest request) { - return applicationAmendmentRequestDao.getAllApplicationAmendmentRequest(); + public List getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId) { + return applicationAmendmentRequestDao.getAllApplicationAmendmentRequest(userId); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java index e0301dec..154e342a 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.AssignedApplicationsDao; +import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; @@ -54,4 +55,9 @@ public class AssignedApplicationsServiceImpl implements AssignedApplicationsServ return assignedApplicationsDao.getAssignedApplicationById(request, id); } + @Override + public AssignedApplicationsEntity validateAssignedApplication(Long assignedApplicationId) { + return assignedApplicationsDao.validateAssignedApplication(assignedApplicationId); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java index 91551d7e..e3434b3c 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java @@ -31,7 +31,7 @@ public interface ApplicationAmendmentRequestApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "applicationEvaluation/{id}", produces = "application/json") - ResponseEntity>> getApplicationDataForAmendment(HttpServletRequest request, @Parameter(description = "The Application Evaluation id", required = true) @PathVariable(value = "id", required = true) Long applicationEvaluationId); + ResponseEntity> getApplicationDataForAmendment(HttpServletRequest request, @Parameter(description = "The Application Evaluation id", required = true) @PathVariable(value = "id", required = true) Long applicationEvaluationId); @Operation(summary = "Api to submit the application data for the Amendment", responses = { @@ -81,8 +81,9 @@ public interface ApplicationAmendmentRequestApi { @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) })) }) - @GetMapping(value = "/getAll", produces = "application/json") - ResponseEntity>> getAllApplicationAmendmentRequest(HttpServletRequest request); + @GetMapping(value = "/user/{id}", produces = "application/json") + ResponseEntity>> getAllApplicationAmendmentRequest(HttpServletRequest request, + @Parameter(description = "The User ID", required = false) @PathVariable(value = "id",required = false) Long userId); @Operation(summary = "Api to update application amendment", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java index 27316bd5..59e42a1b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java @@ -27,8 +27,8 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme ApplicationAmendmentRequestService applicationAmendmentRequestService; @Override - public ResponseEntity>> getApplicationDataForAmendment(HttpServletRequest request, Long applicationEvaluationId) { - List applicationAmendmentBean = applicationAmendmentRequestService.getApplicationDataForAmendment(request,applicationEvaluationId); + public ResponseEntity> getApplicationDataForAmendment(HttpServletRequest request, Long applicationEvaluationId) { + ApplicationAmendmentRequestResponse applicationAmendmentBean = applicationAmendmentRequestService.getApplicationDataForAmendment(request,applicationEvaluationId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applicationAmendmentBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_DATA_FOR_AMENDMENT_SUCCESS_MSG))); } @@ -57,9 +57,9 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme } @Override - public ResponseEntity>> getAllApplicationAmendmentRequest(HttpServletRequest request) { + public ResponseEntity>> getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId) { log.info("Get All Applications Amendment Request"); - List applicationAmendmentRequestResponses = applicationAmendmentRequestService.getAllApplicationAmendmentRequest(request); + List applicationAmendmentRequestResponses = applicationAmendmentRequestService.getAllApplicationAmendmentRequest(request,userId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applicationAmendmentRequestResponses, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG))); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 2ad3ba65..921675ff 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -60,3 +60,5 @@ mailGun_base_url=https://api.eu.mailgun.net/ apiKey=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 #senderEmail=mailer@bflows.net +application.amendment.expiration.days=30 + From 586e000d142af3e2e418f3f3b0a69ae38764694f Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 28 Oct 2024 13:37:28 +0530 Subject: [PATCH 12/13] Updated code --- .../dao/ApplicationEvaluationDao.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 99068a63..681385bc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -55,10 +55,11 @@ public class ApplicationEvaluationDao { private CriteriaFormFieldRepository criteriaFormFieldRepository; - private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long applicationId) { + private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); - ApplicationEntity application = applicationService.validateApplication(applicationId); - AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); + + AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplciationId).orElse(null); + ApplicationEntity application = applicationService.validateApplication(assignedApplications.getApplication().getId()); entity.setApplicationId(application.getId()); entity.setAssignedApplicationsEntity(assignedApplications); entity.setUserId(user.getId()); @@ -337,8 +338,8 @@ public class ApplicationEvaluationDao { } - public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(UserEntity user, ApplicationEvaluationRequest req, Long applicationId) { - Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(applicationId); + public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { + Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplciationId); ApplicationEvaluationEntity entity; if (existingEntityOptional.isPresent()) { @@ -349,7 +350,7 @@ public class ApplicationEvaluationDao { entity.setIsDeleted(false); setIfUpdated(entity::getNote, entity::setNote, req.getNote()); } else { - entity = convertToEntity(user, req, applicationId); + entity = convertToEntity(user, req, assignedApplciationId); } ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(entity); @@ -530,16 +531,19 @@ public class ApplicationEvaluationDao { public ApplicationEvaluationResponse getEvaluationResponseByApplicationid(UserEntity user, Long applicationId, Long assignedApplicationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); ApplicationEvaluationResponse response = new ApplicationEvaluationResponse(); - ApplicationEntity application = applicationService.validateApplication(applicationId); CallEntity call = null; + ApplicationEntity application=null; AssignedApplicationsEntity assignedApplications = null; - if (applicationId != null) { + if (applicationId != null && assignedApplicationId==null) { + application = applicationService.validateApplication(applicationId); call = callRepository.findCallEntityByApplicationId(applicationId); assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); } else if (assignedApplicationId != null) { - call = callRepository.findCallEntityByApplicationId(assignedApplicationId); assignedApplications = assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG))); + application = applicationService.validateApplication(assignedApplications.getApplication().getId()); + call = callRepository.findCallEntityByApplicationId(application.getId()); + } else { call = callRepository.findCallEntityByApplicationId(applicationId); assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); @@ -547,17 +551,17 @@ public class ApplicationEvaluationDao { List evaluationCriterias = evaluationCriteriaRepository.findByCallId(call.getId()); List checklistEntities = callTargetAudienceChecklistRepository.findByCallId(call.getId()); List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationId); - response.setApplicationId(applicationId); + response.setApplicationId(application.getId()); response.setAssignedApplicationId(assignedApplications.getId()); response.setNote(null); response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.OPEN.getValue())); response.setMinScore(call.getThreshold()!=null?call.getThreshold():null); - setCriteriaResponses(entity, applicationId, response, evaluationCriterias); - setChecklistResponses(entity, applicationId, response, checklistEntities); - setFileResponses(entity, applicationId, response, applicationFormEntities); + setCriteriaResponses(entity, application.getId(), response, evaluationCriterias); + setChecklistResponses(entity, application.getId(), response, checklistEntities); + setFileResponses(entity, application.getId(), response, applicationFormEntities); - setApplicationDetails(response, applicationId, user); + setApplicationDetails(response, application.getId(), user); return response; } @@ -899,9 +903,9 @@ public class ApplicationEvaluationDao { existingEntity.setStatus(ApplicationEvaluationStatusTypeEnum.CLOSE.getValue()); assignedApplicationsEntity.setStatus(AssignedApplicationEnum.CLOSE.getValue()); } entity = applicationEvaluationRepository.save(existingEntity); - assignedApplicationsEntity=assignedApplicationsRepository.save(assignedApplicationsEntity);} + assignedApplicationsEntity=assignedApplicationsRepository.save(assignedApplicationsEntity); - return convertToResponse(entity); + return convertToResponse(entity);}return null; From e99926086c6d3a154e603e2657e83ec0d31aa081 Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 28 Oct 2024 16:06:37 +0530 Subject: [PATCH 13/13] updated Code --- .../dao/ApplicationAmendmentRequestDao.java | 78 ++++++++++++------- ...ApplicationAmendmentRequestRepository.java | 9 +++ .../ApplicationFormFieldRepository.java | 1 + .../ApplicationAmendmentRequestService.java | 1 + ...pplicationAmendmentRequestServiceImpl.java | 6 ++ .../api/ApplicationAmendmentRequestApi.java | 13 ++++ ...ApplicationAmendmentRequestController.java | 8 ++ 7 files changed, 88 insertions(+), 28 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index c728adc4..59cc5802 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -351,46 +351,68 @@ public class ApplicationAmendmentRequestDao { return response; } + private void updateApplicationFormFields(ApplicationAmendmentRequestEntity applicationAmendment, ApplicationFormFieldRequestBean updatedFormField) { - // Convert fieldValue (object) to a comma-separated list of document IDs - List documentIds = Arrays.asList(updatedFormField.getFieldValue().toString().split(",")); + List documentIds; + + // Check if fieldValue is an array + if (updatedFormField.getFieldValue() instanceof List) { + documentIds = ((List) updatedFormField.getFieldValue()).stream() + .map(Object::toString) + .collect(Collectors.toList()); + } else { + log.warn("Expected fieldValue as a list but got: {}", updatedFormField.getFieldValue()); + return; + } + List validDocumentIds = new ArrayList<>(); - for (String documentId : documentIds) { - documentId = documentId.trim(); // Remove any extra spaces - if (documentId.isEmpty()) { - log.warn("Encountered an empty document ID. Skipping."); - continue; - } - - try { - // Parse documentId to Long and validate it - Long documentIdLong = Long.parseLong(documentId); - DocumentEntity documentEntity = documentService.validateDocument(documentIdLong); - - if (documentEntity != null) { - validDocumentIds.add(documentId); - } else { - log.warn("Document with ID {} does not exist. Skipping this ID.", documentId); - } - } catch (NumberFormatException e) { - log.warn("Invalid document ID format: {}. Skipping this ID.", documentId); + DocumentEntity documentEntity = documentService.validateDocument(Long.parseLong(documentId)); + if (documentEntity != null) { + validDocumentIds.add(documentId); + } else { + log.warn("Document with ID {} does not exist. Skipping this ID.", documentId); } } if (!validDocumentIds.isEmpty()) { - ApplicationFormFieldEntity formEntity = applicationFormFieldRepository.findByFieldId(updatedFormField.getFieldId()); + List applicationForms = applicationFormRepository.findByApplicationId(applicationAmendment.getApplicationId()); - if (formEntity != null) { - formEntity.setFieldValue(String.join(",", validDocumentIds)); - applicationFormFieldRepository.save(formEntity); - log.info("Updated field value for field ID {} with document IDs {}", updatedFormField.getFieldId(), String.join(",", validDocumentIds)); - } else { - log.warn("No ApplicationFormFieldEntity found with field ID {}. Skipping update.", updatedFormField.getFieldId()); + boolean fieldUpdated = false; + + for (ApplicationFormEntity applicationForm : applicationForms) { + Optional formFieldEntityOptional = applicationFormFieldRepository + .findByApplicationFormIdAndFieldId(applicationForm.getId(), updatedFormField.getFieldId()); + + if (formFieldEntityOptional.isPresent()) { + ApplicationFormFieldEntity formEntity = formFieldEntityOptional.get(); + formEntity.setFieldValue(String.join(",", validDocumentIds)); + applicationFormFieldRepository.save(formEntity); + log.info("Updated field value for application ID {} and field ID {} with document IDs {}", + applicationAmendment.getApplicationId(), updatedFormField.getFieldId(), String.join(",", validDocumentIds)); + fieldUpdated = true; + break; + } + } + + if (!fieldUpdated) { + log.warn("No ApplicationFormFieldEntity found for application ID {} and field ID {}. Skipping update.", + applicationAmendment.getApplicationId(), updatedFormField.getFieldId()); } } else { log.warn("No valid document IDs found for update. Skipping field ID {}", updatedFormField.getFieldId()); } } + + public List getAllAmendmentRequestByBeneficiaryId(Long beneficiaryId) { + + List entities = + applicationAmendmentRequestRepository.findByUserId(beneficiaryId); + + return entities.stream() + .map(this::convertEntityToResponse) + .collect(Collectors.toList()); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 35ba3282..608786e9 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -3,9 +3,18 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import java.util.List; import java.util.Optional; public interface ApplicationAmendmentRequestRepository extends JpaRepository, JpaSpecificationExecutor { Optional findByIdAndIsDeletedFalse(Long id); + + @Query(value = "SELECT ar.* FROM application_amendment_request ar " + + "JOIN application app ON ar.application_id = app.id " + + "WHERE app.user_id = :userId AND ar.is_deleted = false", + nativeQuery = true) + List findByUserId(@Param("userId") Long userId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java index f8736d1c..b989e2dd 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormFieldRepository.java @@ -37,4 +37,5 @@ public interface ApplicationFormFieldRepository extends JpaRepository findByApplicationFormIdAndFieldId(Long id, String fieldId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java index cce56d12..ed4dc5b1 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java @@ -16,5 +16,6 @@ public interface ApplicationAmendmentRequestService { List getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId); ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean); ApplicationAmendmentRequestEntity validateApplicationAmendmentRequest(Long applicationAmendmentId); + List getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request,Long beneficiaryId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java index 34edbb89..23af105f 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -63,5 +63,11 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm return applicationAmendmentRequestDao.validateApplicationAmendmentRequest(applicationAmendmentId); } + @Override + public List getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, Long beneficiaryId) { + return applicationAmendmentRequestDao.getAllAmendmentRequestByBeneficiaryId(beneficiaryId); + } + + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java index e3434b3c..4cd537ae 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java @@ -100,4 +100,17 @@ public interface ApplicationAmendmentRequestApi { @Parameter(description = "The Application Amendment id", required = true) @PathVariable("id") Long id, @Parameter(description = "Assigned Application request object", required = true) @Valid @RequestBody ApplicationAmendmentRequestBean applicationAmendmentRequestBean); + @Operation(summary = "Api to get all applications amendment request by beneficary user Id", + 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) })) }) + @GetMapping(value = "/beneficiary/{id}", produces = "application/json") + ResponseEntity>> getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, + @Parameter(description = "Id", required = false) @PathVariable(value = "id",required = false) Long beneficiaryId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java index 59e42a1b..635a7244 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java @@ -71,4 +71,12 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(updateApplicationAmendment, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_UPDATE_SUCCESSFULLY_MSG))); } + + @Override + public ResponseEntity>> getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, Long beneficiaryId) { + log.info("Get All Application Amendment Request By Beneficiary ID"); + List applicationAmendmentRequestResponseList = applicationAmendmentRequestService.getAllAmendmentRequestByBeneficiaryId(request, beneficiaryId); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(applicationAmendmentRequestResponseList, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG))); + } }