From d20b9abc079a6d32c088244cb5e3b741ede998a7 Mon Sep 17 00:00:00 2001 From: piyuskag Date: Fri, 25 Oct 2024 15:29:28 +0530 Subject: [PATCH 01/76] Done Ticket GEPAFINBE-71 --- .../constants/GepafinConstant.java | 9 + .../tendermanagement/dao/ApplicationDao.java | 27 +- .../tendermanagement/dao/DelegationDao.java | 22 +- .../tendermanagement/dao/DocumentDao.java | 60 +- .../tendermanagement/dao/S3ConfigDao.java | 104 +++ .../tendermanagement/dao/S3PathConfig.java | 49 + .../entities/S3ConfigEntity.java | 25 + .../enums/DocOtherSourceTypeEnum.java | 17 + .../model/request/S3ConfigReq.java | 20 + .../model/response/S3ConfigBean.java | 11 + .../repositories/ApplicationRepository.java | 3 +- .../ApplicationSignedDocumentRepository.java | 11 + .../repositories/DocumentRepository.java | 2 + .../repositories/S3ConfigRepository.java | 24 + .../UserCompanyDelegationRepository.java | 6 + .../service/S3ConfigService.java | 19 + .../service/impl/DocumentServiceImpl.java | 2 +- .../service/impl/S3ConfigServiceImpl.java | 41 + .../impl/S3ReUploadMigrationService.java | 197 ++++ .../UserSignedAndDelegationServiceImpl.java | 261 ++++++ .../web/rest/api/S3ConfigApi.java | 67 ++ .../web/rest/api/S3MigrationApi.java | 28 + .../rest/api/UserSignedAndDelegationApi.java | 38 + .../rest/api/impl/DocumentApiController.java | 2 +- .../web/rest/api/impl/S3ConfigController.java | 59 ++ .../api/impl/S3MigrationApiController.java | 19 + ...ignedAndDelegationMigrationController.java | 24 + .../db/changelog/db.changelog-1.0.0.xml | 882 ++++++++++-------- 28 files changed, 1620 insertions(+), 409 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/S3ConfigDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/S3ConfigEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/S3ConfigReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/S3ConfigBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/S3ConfigRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/S3ConfigService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/S3ConfigServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/S3ConfigApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/S3MigrationApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/UserSignedAndDelegationApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3ConfigController.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3MigrationApiController.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3UserSignedAndDelegationMigrationController.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 38e3969a..525849b7 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -249,5 +249,14 @@ public class GepafinConstant { public static final String HUB_NOT_FOUND = "hub_not_found"; public static final String EVALUATIONCRITERIA_INVALID = "evaluationCriteria.invalid"; public static final String GET_ERROR_S3 = "get.error.s3"; + + public static final String ADDED_S3_PATH_STRUCTURE ="added.s3.path.structure"; + public static final String S3_PATH_STRUCTURE_BY_TYPE ="fetched.s3.path.structure.by.type.successfully"; + public static final String S3_PATH_STRUCTURE_NOT_FOUND_BY_TYPE_MSG ="s3.path.not.found.by.type"; + public static final String S3_PATH_STRUCTURE_NOT_FOUND_BY_ID_MSG ="s3.path.not.found.by.id"; + public static final String S3_PATH_DELETE_MSG ="s3.path.config.delete.successfully"; + public static final String S3_PATH_CONFIG_UPDATE_MSG ="s3.path.config.updated.successfully"; + 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."; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 8aff7b3b..a9162986 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -6,6 +6,7 @@ import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; import net.gepafin.tendermanagement.enums.ApplicationSignedDocumentStatusEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.enums.UserCompanyDelegationStatusEnum; @@ -127,6 +128,9 @@ public class ApplicationDao { @Autowired private UserService userService; + @Autowired + S3PathConfig s3ConfigBean; + public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { FormEntity formEntity = formService.validateForm(formId); @@ -805,9 +809,9 @@ public class ApplicationDao { applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue()); applicationSignedDocumentRepository.save(applicationSignedDocument); } - UploadFileOnAmazonS3Response uploadFileOnAmazonS3 = amazonS3Service.uploadFileOnAmazonS3(signedDocumentS3Folder, - file); - applicationSignedDocument = new ApplicationSignedDocumentEntity(); + UploadFileOnAmazonS3Response uploadFileOnAmazonS3 = uploadFileOnAmazonS3ForUserSignedDocument(file, + applicationEntity.getCall().getId(), applicationId); + applicationSignedDocument = new ApplicationSignedDocumentEntity(); applicationSignedDocument.setApplication(applicationEntity); applicationSignedDocument.setFileName(uploadFileOnAmazonS3.getFileName()); applicationSignedDocument.setFilePath(uploadFileOnAmazonS3.getFilePath()); @@ -815,7 +819,22 @@ public class ApplicationDao { applicationSignedDocumentRepository.save(applicationSignedDocument); return convertApplicationSignedDocumentToApplicationSignedDocumentResponse(applicationSignedDocument); } - + private UploadFileOnAmazonS3Response uploadFileOnAmazonS3ForUserSignedDocument(MultipartFile file, Long callId, Long applicationId) { + try { + String s3Path = generateS3PathForDelegation(callId, applicationId); + log.info("S3 Path {}", s3Path); + return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); + } catch (Exception e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); + } + } + private String generateS3PathForDelegation(Long callId, Long applicationId) { + try { + return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, callId, applicationId); + } catch (IllegalArgumentException e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); + } + } private ApplicationSignedDocumentResponse convertApplicationSignedDocumentToApplicationSignedDocumentResponse( ApplicationSignedDocumentEntity applicationSignedDocument) { ApplicationSignedDocumentResponse applicationSignedDocumentResponse = new ApplicationSignedDocumentResponse(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index f609086f..b8ce98a0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Function; +import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.springframework.beans.factory.annotation.Autowired; @@ -51,6 +52,9 @@ public class DelegationDao { @Autowired private DocumentRepository documentRepository; + + @Autowired + private S3PathConfig s3ConfigBean; @Value("${aws.s3.url.folder.delegation}") private String s3Folder; @@ -179,7 +183,7 @@ public class DelegationDao { userCompanyDelegationEntity.setStatus(UserCompanyDelegationStatusEnum.INACTIVE.getValue()); userCompanyDelegationRepository.save(userCompanyDelegationEntity); } - UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = amazonS3Service.uploadFileOnAmazonS3(s3Folder, file); + UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = uploadFileOnAmazonS3ForCompanyDelegation(file); userCompanyDelegationEntity = new UserCompanyDelegationEntity(); userCompanyDelegationEntity.setCompanyId(companyId); userCompanyDelegationEntity.setUserId(userEntity.getId()); @@ -192,7 +196,21 @@ public class DelegationDao { userCompanyDelegationRepository.save(userCompanyDelegationEntity); return convertUserCompanyDelegationToCompanyDelegationResponse(userCompanyDelegationEntity); } - + private UploadFileOnAmazonS3Response uploadFileOnAmazonS3ForCompanyDelegation(MultipartFile file) { + try { + String s3Path = generateS3PathForDelegation(); + return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); + } catch (Exception e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); + } + } + private String generateS3PathForDelegation() { + try { + return s3ConfigBean.generateDocumentPathForDelegationAndSignedDocument(DocOtherSourceTypeEnum.USER_DELEGATION); + } catch (IllegalArgumentException e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); + } + } private CompanyDelegationResponse convertUserCompanyDelegationToCompanyDelegationResponse( UserCompanyDelegationEntity userCompanyDelegationEntity) { return Utils.convertSourceObjectToDestinationObject(userCompanyDelegationEntity, CompanyDelegationResponse.class); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index 90725964..226848f7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -2,7 +2,10 @@ package net.gepafin.tendermanagement.dao; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; +import net.gepafin.tendermanagement.repositories.ApplicationRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -24,6 +27,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import java.util.ArrayList; import java.util.List; +@Slf4j @Component public class DocumentDao { @@ -38,6 +42,12 @@ public class DocumentDao { @Autowired private CallService callService; + + @Autowired + private S3PathConfig s3ConfigBean; + + @Autowired + private ApplicationRepository applicationFormRepository; @Value("${aws.s3.url.folder}") private String s3Folder; @@ -46,8 +56,7 @@ public class DocumentDao { List documentEntities = new ArrayList<>(); Long source = resolveSourceId(sourceId, sourceType); for (MultipartFile file : files) { - UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = amazonS3Service.uploadFileOnAmazonS3(s3Folder, - file); + UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = uploadFileOnAmazonS3(file, sourceType, sourceId); if (uploadFileOnAmazonS3Response != null) { DocumentEntity documentEntity = new DocumentEntity(); documentEntity.setFileName(uploadFileOnAmazonS3Response.getFileName()); @@ -62,6 +71,30 @@ public class DocumentDao { documentRepository.saveAll(documentEntities); return documentEntities.stream().map(callDao::convertToDocumentResponseBean).collect(Collectors.toList()); } + private UploadFileOnAmazonS3Response uploadFileOnAmazonS3(MultipartFile file, DocumentSourceTypeEnum type, Long sourceId) { + + Long applicationId = 0L; + Long callId = sourceId; + if (type == DocumentSourceTypeEnum.APPLICATION) { + applicationId = sourceId; + callId = applicationFormRepository.findCallIdById(applicationId); + } + try { + String s3Path = generateS3Path(type, callId, applicationId); + log.info("Generated S3 path {}", s3Path); + return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); + } catch (Exception e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); + } + } + public String generateS3Path(DocumentSourceTypeEnum typeOfDocument, Long callId, Long applicationId) { + + try { + return s3ConfigBean.generateDocumentPath(typeOfDocument, callId, applicationId); + } catch (IllegalArgumentException e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); + } + } private Long resolveSourceId(Long sourceId, DocumentSourceTypeEnum sourceType) { if (sourceType == DocumentSourceTypeEnum.CALL) { CallEntity callEntity = callService.validateCall(sourceId); @@ -91,8 +124,9 @@ public class DocumentDao { public DocumentResponseBean updateDocument(Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) { DocumentEntity documentEntity = validateDocument(documentId); - UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = amazonS3Service.uploadFileOnAmazonS3(s3Folder, file); - if (uploadFileOnAmazonS3Response != null) { + String type = documentEntity.getSource(); + UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = updateFileOnAmazonS3(file, DocumentSourceTypeEnum.valueOf(type), documentEntity.getSourceId()); + if (uploadFileOnAmazonS3Response != null) { documentEntity.setFileName(uploadFileOnAmazonS3Response.getFileName()); documentEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath()); documentEntity.setType(documentTypeEnum.getValue()); @@ -102,7 +136,25 @@ public class DocumentDao { } return callDao.convertToDocumentResponseBean(documentEntity); } + private UploadFileOnAmazonS3Response updateFileOnAmazonS3(MultipartFile file, DocumentSourceTypeEnum type, Long id) { + try { + Long callId; + Long applicationId; + if(type.equals("APPLICATION")){ + callId = applicationFormRepository.findCallIdById(id); + applicationId = id; + }else{ + callId = id; + applicationId = 0L; + } + String s3Path = generateS3Path(type, callId, applicationId); + log.info("Generated S3 path {}", s3Path); + return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); + } catch (Exception e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); + } + } public DocumentResponseBean getDocument(Long documentId) { DocumentEntity documentEntity = validateDocument(documentId); return callDao.convertToDocumentResponseBean(documentEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/S3ConfigDao.java b/src/main/java/net/gepafin/tendermanagement/dao/S3ConfigDao.java new file mode 100644 index 00000000..3661ad02 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/S3ConfigDao.java @@ -0,0 +1,104 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.model.request.S3ConfigReq; +import net.gepafin.tendermanagement.model.response.S3ConfigBean; +import net.gepafin.tendermanagement.repositories.S3ConfigRepository; +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.util.Optional; + +import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; + +@Component +public class S3ConfigDao { + private static final Logger log = LoggerFactory.getLogger(S3ConfigDao.class); + + @Autowired + S3ConfigRepository s3ConfigRepository; + + public S3ConfigBean addS3Path(S3ConfigReq s3PathConfigurationReq) { + + log.info("Adding s3 s3PathConfigurationReq structure with it's type.."); + S3ConfigEntity s3PathConfigurationEntity = convertToS3pathEntity(s3PathConfigurationReq); + s3PathConfigurationEntity = s3ConfigRepository.save(s3PathConfigurationEntity); + log.info("Added s3 path config details {} to DB.", s3PathConfigurationEntity); + return convertToS3pathBean(s3PathConfigurationEntity); + } + private S3ConfigEntity convertToS3pathEntity(S3ConfigReq s3PathConfigReq) { + + S3ConfigEntity s3PathConfigEntity = new S3ConfigEntity(); + s3PathConfigEntity.setPath(s3PathConfigReq.getPath()); + s3PathConfigEntity.setType(s3PathConfigReq.getType()); + s3PathConfigEntity.setBucketName(s3PathConfigReq.getBucketName()); + return s3PathConfigEntity; + } + private S3ConfigBean convertToS3pathBean(S3ConfigEntity s3PathConfigReq) { + + S3ConfigBean s3PathConfigBean = new S3ConfigBean(); + s3PathConfigBean.setPath(s3PathConfigReq.getPath()); + s3PathConfigBean.setType(s3PathConfigReq.getType()); + s3PathConfigBean.setBucketName(s3PathConfigReq.getBucketName()); + return s3PathConfigBean; + } + + public Optional getS3PathByType(String type) { + + log.info("Fetching S3-Path structure by type: {}", type); + Optional s3PathData = s3ConfigRepository.getPathByType(type); + if (s3PathData == null) { + log.error("No S3-Path found for type: {}", type); + throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.S3_PATH_STRUCTURE_NOT_FOUND_BY_TYPE_MSG)); + } + log.info("Fetched S3-Path: {} for type: {}", s3PathData, type); + return s3PathData; + } + + public S3ConfigEntity deleteS3PathConfigById(Long id) { + + log.info("Checking s3-path associated with this id {} to delete....", id); + S3ConfigEntity s3PathConfigData = s3ConfigRepository.findS3PathConfigurationById(id); + if (s3PathConfigData == null) { + log.error("No S3-Path found for id: {}", id); + throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.S3_PATH_STRUCTURE_NOT_FOUND_BY_ID_MSG)); + } else { + log.info("Found s3-path associated with this id {} to delete.", id); + s3ConfigRepository.deleteById(id); + log.error("Deleted s3-path configuration successfully for id: {}", id); + return s3PathConfigData; + } + } + public S3ConfigBean updateS3PathConfiguration(S3ConfigReq s3PathConfigurationReq, Long id) { + + log.info("Updating S3-path Configuration."); + S3ConfigEntity s3PathConfigDataExists = s3ConfigRepository.findS3PathConfigurationById(id); + if (s3PathConfigDataExists == null) { + log.error("No S3-Path found for id: {}", id); + throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.S3_PATH_STRUCTURE_NOT_FOUND_BY_ID_MSG)); + } else { + Optional s3PathData = s3ConfigRepository.getPathByType(s3PathConfigurationReq.getType()); + if(s3PathData != null){ + log.error("S3-Path type already exist. {}", s3PathData); + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.S3_PATH_CONFIG_DUPLICATE_TYPE_ALREADY_EXIST)); + } + S3ConfigEntity s3PathConfigurationEntity = convertToS3pathEntity(s3PathConfigurationReq); + setIfUpdated(s3PathConfigurationEntity::getPath, s3PathConfigurationEntity::setPath, s3PathConfigurationReq.getPath()); + setIfUpdated(s3PathConfigurationEntity::getBucketName, s3PathConfigurationEntity::setBucketName, s3PathConfigurationReq.getBucketName()); + setIfUpdated(s3PathConfigurationEntity::getType, s3PathConfigurationEntity::setType, s3PathConfigurationReq.getType()); +// s3PathConfigurationEntity.setType(s3PathConfigurationReq.getType()); +// s3PathConfigurationEntity.setPath(s3PathConfigurationReq.getPath()); +// s3PathConfigurationEntity.setBucketName(s3PathConfigurationReq.getBucketName()); + s3ConfigRepository.save(s3PathConfigurationEntity); + log.info("Updated S3-path-configuration successfully."); + return convertToS3pathBean(s3PathConfigurationEntity); + } + + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java b/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java new file mode 100644 index 00000000..b127b699 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java @@ -0,0 +1,49 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; +import net.gepafin.tendermanagement.repositories.S3ConfigRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class S3PathConfig { + + @Autowired + S3ConfigRepository s3ConfigRepository; + + public String generateDocumentPath(DocumentSourceTypeEnum type, Long callId, Long applicationId) { + + S3ConfigEntity config = getDocumentPath(type); + return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId); + } + public String generateDocumentPathForOther(DocOtherSourceTypeEnum type, Long callId, Long applicationId) { + + S3ConfigEntity config = getDocumentPathForOther(type); + return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId); + } + private String buildS3Path(String pathTemplate, Long callId, Long applicationId) { + + return pathTemplate.replace("{call_id}", callId != null && callId != 0L ? "call_" + callId : "").replace("{application_id}", applicationId != null && applicationId != 0L ? "application_" + applicationId : ""); + } + public String generateDocumentPathForDelegationAndSignedDocument(DocOtherSourceTypeEnum type) { + + S3ConfigEntity config = getDocumentPathForOther(type); + return config.getParentFolder() + "/" + config.getPath(); + } + private S3ConfigEntity getDocumentPath(DocumentSourceTypeEnum type) { + + return s3ConfigRepository.getPathByType(type.name()).orElseThrow(() -> new IllegalArgumentException("No path configuration found for type: " + type)); + } + private S3ConfigEntity getDocumentPathForOther(DocOtherSourceTypeEnum type) { + + return s3ConfigRepository.getPathByType(type.name()).orElseThrow(() -> new IllegalArgumentException("No path configuration found for type: " + type)); + } + public String getBucketNameForOtherType(DocOtherSourceTypeEnum type){ + return s3ConfigRepository.getBucketNameByType(type); + } + public String getBucketNameForCallAppType(DocumentSourceTypeEnum type){ + return s3ConfigRepository.getBucketNameByType(type); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/S3ConfigEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/S3ConfigEntity.java new file mode 100644 index 00000000..66502bbc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/S3ConfigEntity.java @@ -0,0 +1,25 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.Data; + +@Entity +@Table(name = "s3_path_configuration") +@Data +public class S3ConfigEntity extends BaseEntity { + + @Column(name = "TYPE") + private String type; + + @Column(name = "PATH") + private String path; + + @Column(name = "BUCKET_NAME") + private String bucketName; + + @Column(name = "PARENT_FOLDER") + private String parentFolder; +} + diff --git a/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java new file mode 100644 index 00000000..751dfa92 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.enums; + +public enum DocOtherSourceTypeEnum { + USER_SIGNED_DOCUMENT("USER_SIGNED_DOCUMENT"), + USER_DELEGATION("USER_DELEGATION"), + TEMPLATE("TEMPLATE"); + + private String value; + + DocOtherSourceTypeEnum(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/S3ConfigReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/S3ConfigReq.java new file mode 100644 index 00000000..859878de --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/S3ConfigReq.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class S3ConfigReq { + @NotNull + private String path; + + @NotNull + private String type; + + @NotNull + private String bucketName; + + @NotNull + private String parentFolder; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/S3ConfigBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/S3ConfigBean.java new file mode 100644 index 00000000..798f8b2c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/S3ConfigBean.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class S3ConfigBean { + private String path; + private String type; + private String bucketName; + private String parentFolder; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 7b57fcf2..d3ff6d01 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -40,5 +40,6 @@ public interface ApplicationRepository extends JpaRepository findByCompanyIdAndUserIdAndIsDeletedFalse(Long companyId,Long userId); - + @Query("SELECT a.call.id FROM ApplicationEntity a WHERE a.id = :id") + Long findCallIdById(@Param("id") Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationSignedDocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationSignedDocumentRepository.java index 35322a6a..b9d2bce3 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationSignedDocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationSignedDocumentRepository.java @@ -1,13 +1,24 @@ package net.gepafin.tendermanagement.repositories; 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 net.gepafin.tendermanagement.entities.ApplicationSignedDocumentEntity; +import java.util.List; + @Repository public interface ApplicationSignedDocumentRepository extends JpaRepository { ApplicationSignedDocumentEntity findByApplicationIdAndStatus(Long applicationId, String status); + Long findApplicationIdById(Long id); + + @Query("SELECT a.id FROM ApplicationSignedDocumentEntity d JOIN d.application a WHERE d.id = :id") + List findApplicationIdIdsById(@Param("id") Long id); + + @Query("SELECT d FROM ApplicationSignedDocumentEntity d WHERE d.status = :status") + List findAllByIsStatus(@Param("status")String status); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index 4f621d38..b7fc2923 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -25,5 +25,7 @@ public interface DocumentRepository extends JpaRepository Optional findByIdAndSourceIdAndSourceAndIsDeletedFalse(Long id, Long sourceId, String source); + @Query("SELECT d FROM DocumentEntity d WHERE d.isDeleted = false") + List findAllByIsDeleteFalse(); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/S3ConfigRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/S3ConfigRepository.java new file mode 100644 index 00000000..2349861c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/S3ConfigRepository.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface S3ConfigRepository extends JpaRepository { + Optional getPathByType(String type); + + S3ConfigEntity findS3PathConfigurationById(Long id); + + String getBucketNameByType(DocumentSourceTypeEnum type); + + String getBucketNameByType(DocOtherSourceTypeEnum type); + + @Query("Select s3.parentFolder From S3ConfigEntity s3 Where s3.type = :s") + String getPathByTypeOther(String s); +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserCompanyDelegationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserCompanyDelegationRepository.java index 1224dd70..03067c80 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserCompanyDelegationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserCompanyDelegationRepository.java @@ -2,9 +2,15 @@ package net.gepafin.tendermanagement.repositories; import org.springframework.data.jpa.repository.JpaRepository; import net.gepafin.tendermanagement.entities.UserCompanyDelegationEntity; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; public interface UserCompanyDelegationRepository extends JpaRepository { UserCompanyDelegationEntity findByUserIdAndCompanyIdAndStatus(Long userId, Long companyId, String status); + @Query("SELECT d FROM UserCompanyDelegationEntity d where d.status = :status") + List findAllByStatus(@Param("status") String status); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/S3ConfigService.java b/src/main/java/net/gepafin/tendermanagement/service/S3ConfigService.java new file mode 100644 index 00000000..d284e649 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/S3ConfigService.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.service; + +import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.model.request.S3ConfigReq; +import net.gepafin.tendermanagement.model.response.S3ConfigBean; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +@Component +public interface S3ConfigService { + S3ConfigBean addS3Path(S3ConfigReq s3Path); + + Optional getS3PathByType(String type); + + S3ConfigEntity deleteS3PathById(Long id); + + S3ConfigBean updateS3PathConfiguration(S3ConfigReq s3PathConfigurationReq, Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java index 3b3fa310..235a1244 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java @@ -34,7 +34,7 @@ public class DocumentServiceImpl implements DocumentService { @Override public DocumentResponseBean updateDocument(HttpServletRequest httpServletRequest, Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) { - return documentDao.updateDocument(documentId,file,documentTypeEnum); + return documentDao.updateDocument(documentId, file,documentTypeEnum); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/S3ConfigServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ConfigServiceImpl.java new file mode 100644 index 00000000..5dfa22de --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ConfigServiceImpl.java @@ -0,0 +1,41 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.transaction.Transactional; +import net.gepafin.tendermanagement.dao.S3ConfigDao; +import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.model.request.S3ConfigReq; +import net.gepafin.tendermanagement.model.response.S3ConfigBean; +import net.gepafin.tendermanagement.service.S3ConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class S3ConfigServiceImpl implements S3ConfigService { + @Autowired + S3ConfigDao s3ConfigDao; + + @Override + public S3ConfigBean addS3Path(S3ConfigReq s3Path) { + + return s3ConfigDao.addS3Path(s3Path); + } + @Override + public Optional getS3PathByType(String type) { + + return s3ConfigDao.getS3PathByType(type); + } + @Override + @Transactional + public S3ConfigEntity deleteS3PathById(Long id) { + + return s3ConfigDao.deleteS3PathConfigById(id); + } + @Override + @Transactional + public S3ConfigBean updateS3PathConfiguration(S3ConfigReq s3PathConfigurationReq, Long id) { + + return s3ConfigDao.updateS3PathConfiguration(s3PathConfigurationReq, id); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java new file mode 100644 index 00000000..4db4ea12 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java @@ -0,0 +1,197 @@ +package net.gepafin.tendermanagement.service.impl; + +import com.amazonaws.AmazonServiceException; +import com.amazonaws.SdkClientException; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.model.GetObjectRequest; +import com.amazonaws.services.s3.model.ObjectMetadata; +import lombok.extern.slf4j.Slf4j; +import net.gepafin.tendermanagement.dao.S3PathConfig; +import net.gepafin.tendermanagement.entities.DocumentEntity; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; +import net.gepafin.tendermanagement.repositories.ApplicationRepository; +import net.gepafin.tendermanagement.repositories.ApplicationSignedDocumentRepository; +import net.gepafin.tendermanagement.repositories.DocumentRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +@Slf4j +@Service +public class S3ReUploadMigrationService { + + private static final String OLD_BUCKET = "mementoresources"; + + private static final String SECURE_KEY = "267163962963"; + + @Autowired + private DocumentRepository documentRepository; + + @Autowired + private AmazonS3Client s3Client; + + @Autowired + private S3PathConfig s3ConfigBean; + + @Autowired + private ApplicationRepository applicationRepository; + + @Autowired + private ApplicationSignedDocumentRepository applicationSignedDocumentRepository; + + @Autowired + private AmazonS3 amazonS3; + + @Value("${aws.s3.url}") + private String s3Url; + + private boolean migrationCompleted = false; + + public String reUploadAndMigrateDocuments(String providedKey) { + + if (migrationCompleted) { + return "Migration already completed."; + } + + // Validate the provided key + if (!isValidKey(providedKey)) { + return "Invalid or missing migration key."; + } + + List documents = documentRepository.findAllByIsDeleteFalse(); + + if (documents.isEmpty()) { + return "No documents found to migrate."; + } + + for (DocumentEntity document : documents) { + String oldUrl = document.getFilePath(); // This should contain the full URL + log.info("Processing {}", oldUrl); + + try { + File localFile = downloadFileFromS3(oldUrl); + String newKey = generateNewS3Path(document); // Make sure this generates the correct new path + String uploadedPath = uploadFileToNewBucket(localFile, newKey); + updateDocumentPathAndDeleteOldEntry(document, uploadedPath); + } catch (Exception e) { + log.error("Error processing document {}: {}", document.getId(), e.getMessage()); + } + } + return "Migrated Successfully."; + } + + private boolean isValidKey(String providedKey) { + + return providedKey != null && providedKey.equals(SECURE_KEY); + } + + private File downloadFileFromS3(String fileUrl) throws Exception { + + String key = extractS3KeyFromUrl(fileUrl); // Get the S3 key from the URL + File localFile = new File("/tmp/" + extractFileName(key)); // Save file locally + + GetObjectRequest getObjectRequest = new GetObjectRequest(OLD_BUCKET, key); // Use the key + + try (InputStream s3Stream = s3Client.getObject(getObjectRequest).getObjectContent(); FileOutputStream outputStream = new FileOutputStream(localFile)) { + s3Stream.transferTo(outputStream); + } + + log.info("Downloaded file from old S3 bucket: {}", key); + return localFile; + } + + private String extractS3KeyFromUrl(String url) { + // Assuming the URL structure is consistent + return url.replace("https://mementoresources.s3.eu-west-1.amazonaws.com/", ""); + } + + private String uploadFileToNewBucket(File localFile, String s3Folder) { + + InputStream inputStream = null; // Declare the InputStream here for cleanup + try { + // Extract file name from the local file + String fileName = extractFileName(localFile.getAbsolutePath()); // Get the file name + String path = s3Folder + "/" + fileName; // Construct the S3 path + + // Create InputStream from the local file + inputStream = new FileInputStream(localFile); + + // Set up object metadata + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentType("application/octet-stream"); + objectMetadata.setContentLength(localFile.length()); + + // Upload to S3 + s3Client.putObject(OLD_BUCKET, path, inputStream, objectMetadata); + + // Construct the full S3 URL + String fullUrl = String.format("https://%s.s3.%s.amazonaws.com/%s", OLD_BUCKET, "eu-west-1", path); + log.info("File '{}' uploaded successfully to Amazon S3 with URL: {}", fileName, fullUrl); + return fullUrl; + + } catch (IOException e) { + log.error("IOException occurred during file upload for '{}': {}", localFile.getName(), e.getMessage()); + throw new RuntimeException("Upload failed for: " + s3Folder + "/" + localFile.getName(), e); + } catch (AmazonServiceException e) { + log.error("Amazon service exception while uploading file '{}': {}", localFile.getName(), e.getMessage()); + throw new RuntimeException("Upload failed for: " + s3Folder + "/" + localFile.getName(), e); + } catch (SdkClientException e) { + log.error("SDK client exception while uploading file '{}': {}", localFile.getName(), e.getMessage()); + throw new RuntimeException("Upload failed for: " + s3Folder + "/" + localFile.getName(), e); + } finally { + // Close InputStream if it was opened + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + log.warn("Failed to close InputStream for file '{}': {}", localFile.getName(), e.getMessage()); + } + } + } + } + + private String generateNewS3Path(DocumentEntity document) { + + DocumentSourceTypeEnum sourceType = DocumentSourceTypeEnum.valueOf(document.getSource()); + Long callId; + + if (sourceType.equals(DocumentSourceTypeEnum.CALL)) { + return s3ConfigBean.generateDocumentPath(sourceType, document.getSourceId(), 0L); + } else { + callId = applicationRepository.findCallIdById(document.getSourceId()); + return s3ConfigBean.generateDocumentPath(sourceType, callId, document.getSourceId()); + } + } + + private String extractFileName(String filePath) { + + String[] parts = filePath.split("/"); + return parts[parts.length - 1]; + } + + + private void updateDocumentPathAndDeleteOldEntry(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); + + 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 new file mode 100644 index 00000000..c1228565 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java @@ -0,0 +1,261 @@ +package net.gepafin.tendermanagement.service.impl; + +import com.amazonaws.AmazonServiceException; +import com.amazonaws.SdkClientException; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.model.GetObjectRequest; +import com.amazonaws.services.s3.model.ObjectMetadata; +import lombok.extern.slf4j.Slf4j; +import net.gepafin.tendermanagement.dao.S3PathConfig; +import net.gepafin.tendermanagement.entities.ApplicationSignedDocumentEntity; +import net.gepafin.tendermanagement.entities.UserCompanyDelegationEntity; +import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; +import net.gepafin.tendermanagement.repositories.ApplicationRepository; +import net.gepafin.tendermanagement.repositories.ApplicationSignedDocumentRepository; +import net.gepafin.tendermanagement.repositories.S3ConfigRepository; +import net.gepafin.tendermanagement.repositories.UserCompanyDelegationRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Service +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 + private UserCompanyDelegationRepository userCompanyDelegationRepository; + + @Autowired + private AmazonS3Client s3Client; + + @Autowired + private S3PathConfig s3ConfigBean; + + @Autowired + private ApplicationSignedDocumentRepository applicationSignedDocumentRepository; + + @Autowired + ApplicationRepository applicationRepository; + + @Autowired + S3ConfigRepository s3ConfigRepository; + + @Value("${aws.s3.url}") + private String s3Url; + + private boolean migrationCompleted = false; + + + public String migrateUserDelegatedDocuments(String providedKey) { + + if (migrationCompleted) { + return "Migration already completed."; + } + + // Validate the provided key + if (isValidKey(providedKey)) { + return "Invalid or missing migration key."; + } + + List documents = userCompanyDelegationRepository.findAllByStatus("ACTIVE"); + + if (documents.isEmpty()) { + return "No documents found to migrate."; + } + + for (UserCompanyDelegationEntity document : documents) { + String oldUrl = document.getFilePath(); + log.info("Processing user designated document: {}", oldUrl); + + try { + File localFile = downloadFileFromS3(oldUrl); + String newKey = generateNewS3PathForDelegationDoc(); + String uploadedPath = uploadFileToNewBucket(localFile, newKey); + updateDelegatedDocumentPathAndDeleteOldEntry(document, uploadedPath); + } catch (Exception e) { + log.error("Error processing user designated document {}: {}", document.getId(), e.getMessage()); + } + } + return "Migrated"; + } + + + public String migrateUserSignedDocuments(String providedKey) { + + if (migrationCompleted) { + return "Migration already completed."; + } + + // Validate the provided key + if (isValidKey(providedKey)) { + return "Invalid or missing migration key."; + } + List documents = applicationSignedDocumentRepository.findAllByIsStatus("ACTIVE"); + + if (documents.isEmpty()) { + return "No documents found to migrate."; + } + + for (ApplicationSignedDocumentEntity document : documents) { + String oldUrl = document.getFilePath(); + log.info("Processing user signed document: {}", oldUrl); + + try { + File localFile = downloadFileFromS3(oldUrl); + String newKey = generateNewS3PathForUserSignedDoc(document); + String uploadedPath = uploadFileToNewBucket(localFile, newKey); + updateDocumentPathAndDeleteOldEntry(document, uploadedPath); + } catch (Exception e) { + log.error("Error processing user signed document {}: {}", document.getId(), e.getMessage()); + } + } + return "Migrated."; + } + + private boolean isValidKey(String providedKey) { + + return providedKey == null || !providedKey.equals(SECURE_KEY); + } + + private String generateNewS3PathForDelegationDoc() { + + return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_DELEGATION, 0L, 0L); + } + + private String generateNewS3PathForUserSignedDoc(ApplicationSignedDocumentEntity document) { + // Fetch the list of application IDs associated with the document + List applicationIds = applicationSignedDocumentRepository.findApplicationIdIdsById(document.getId()); + List paths = new ArrayList<>(); + + // Loop through the application IDs and generate paths + for (Long applicationId : applicationIds) { + Long callId = applicationRepository.findCallIdById(applicationId); + + // Construct the path for the current application and call ID + String newPath = String.format("%s/call/call_%d/application/application_%d/user_signed_document", s3ConfigRepository.getPathByTypeOther( + String.valueOf(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT)) , callId, applicationId); + + log.info("Generated new S3 path: {}", newPath); + paths.add(newPath); + } + + return String.join(",", paths); + } + + private File downloadFileFromS3(String fileUrl) throws Exception { + + String key = extractS3KeyFromUrl(fileUrl); + File localFile = new File("/tmp/" + extractFileName(key)); + + GetObjectRequest getObjectRequest = new GetObjectRequest(OLD_BUCKET, key); + + try (InputStream s3Stream = s3Client.getObject(getObjectRequest).getObjectContent(); FileOutputStream outputStream = new FileOutputStream(localFile)) { + s3Stream.transferTo(outputStream); + } + + log.info("Downloaded file from old S3 bucket: {}", key); + return localFile; + } + + private String extractS3KeyFromUrl(String url) { + + return url.replace("https://mementoresources.s3.eu-west-1.amazonaws.com/", ""); + } + + private String uploadFileToNewBucket(File localFile, String s3Path) { + + InputStream inputStream = null; + try { + String fileName = extractFileName(localFile.getAbsolutePath()); // Extract file name + String fullPath = String.format("%s/%s", s3Path, fileName); // Construct full path + + inputStream = new FileInputStream(localFile); // Create InputStream + + // Set metadata for the file + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentLength(localFile.length()); + objectMetadata.setContentType("application/octet-stream"); + + // Upload the file to S3 with the constructed path + s3Client.putObject(NEW_BUCKET, fullPath, inputStream, objectMetadata); + + // Construct the full S3 URL for the uploaded file + String fullUrl = String.format("https://%s.s3.%s.amazonaws.com/%s", NEW_BUCKET, "eu-west-1", fullPath); + log.info("File '{}' uploaded successfully to Amazon S3 with URL: {}", fileName, fullUrl); + return fullUrl; + + } catch (IOException e) { + log.error("IOException occurred during file upload for '{}': {}", localFile.getName(), e.getMessage()); + throw new RuntimeException("Upload failed for: " + localFile, e); + } catch (AmazonServiceException e) { + log.error("Amazon service exception while uploading file '{}': {}", localFile.getName(), e.getMessage()); + throw new RuntimeException("Upload failed for: " + localFile, e); + } catch (SdkClientException e) { + log.error("SDK client exception while uploading file '{}': {}", localFile.getName(), e.getMessage()); + throw new RuntimeException("Upload failed for: " + localFile, e); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + log.warn("Failed to close InputStream for file '{}': {}", localFile.getName(), e.getMessage()); + } + } + } + } + + private String extractFileName(String filePath) { + + String[] parts = filePath.split("/"); + return parts[parts.length - 1]; + } + private String extractFileNameFromPath(String path) { + + return path.substring(path.lastIndexOf('/') + 1); + } + + private void updateDocumentPathAndDeleteOldEntry(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); + + log.info("Migrated document ID: {} to new path: {}", document.getId(), newPath); + } + + private void updateDelegatedDocumentPathAndDeleteOldEntry(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); + + log.info("Migrated document ID: {} to new path: {}", document.getId(), newPath); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/S3ConfigApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/S3ConfigApi.java new file mode 100644 index 00000000..61b3bd6c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/S3ConfigApi.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.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.model.request.S3ConfigReq; +import net.gepafin.tendermanagement.model.response.S3ConfigBean; +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 org.springframework.web.bind.annotation.RequestBody; + +import java.util.Optional; + +@Validated +public interface S3ConfigApi { + + @Operation(summary = "Api to create S3Path structure.", 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> addS3Path(@Valid @RequestBody S3ConfigReq s3pathReq); + + @Operation(summary = "Api to get S3Path structure. by type", 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>> getS3PathByType(@Valid @Param(value = "type") String type); + + @Operation(summary = "Api to delete S3Path structure. 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) })) }) + @DeleteMapping(value = "", produces = { "application/json" }) + ResponseEntity> deleteS3PathConfigById(@Valid @Param(value = "id") Long id); + + @Operation(summary = "Api to update S3Path structure. 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) })) }) + @PutMapping(value = "", produces = { "application/json" }) + ResponseEntity> updateS3PathConfigById(@Valid @RequestBody S3ConfigReq s3PathConfigurationReq, @Param(value = "id") Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/S3MigrationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/S3MigrationApi.java new file mode 100644 index 00000000..4a4d3eb1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/S3MigrationApi.java @@ -0,0 +1,28 @@ +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.validation.Valid; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.data.repository.query.Param; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; + +@Validated +public interface S3MigrationApi { + + @Operation(summary = "Api to migrate S3 doc to db and update s3 files as per specified folder.", 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 = "/{key}", produces = { "application/json" }) + String reUploadAndMigrateDocuments(@Parameter(description = "The secret key", required = true) @PathVariable("key") String key); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserSignedAndDelegationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserSignedAndDelegationApi.java new file mode 100644 index 00000000..2a3978a1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserSignedAndDelegationApi.java @@ -0,0 +1,38 @@ +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.validation.Valid; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.data.repository.query.Param; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; + +@Validated +public interface UserSignedAndDelegationApi { + @Operation(summary = "Api to migrate S3 doc to db and user-delegated folder", 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 = "/{key}", produces = { "application/json" }) + String migrateUserDelegatedDocuments(@Parameter(description = "The secret key", required = true) @PathVariable("key") String key); + + @Operation(summary = "Api to migrate S3 doc to user-signed.", 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 = "/{key}", produces = { "application/json" }) + String migrateUserSignedDocuments(@Parameter(description = "The secret key", required = true) @PathVariable("key") String key); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java index 7141a256..34caa9fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java @@ -31,7 +31,7 @@ DocumentApiController implements DocumentApi { public ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, Long sourceId, DocumentSourceTypeEnum sourceType, List files, DocumentTypeEnum fileType) { try { - List responseBeans = documentService.uploadFile(files, sourceId,sourceType, fileType); + List responseBeans = documentService.uploadFile(files, sourceId, sourceType, fileType); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response>(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILES_UPLOADED_MSG))); } catch (CustomValidationException ex) { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3ConfigController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3ConfigController.java new file mode 100644 index 00000000..62f12414 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3ConfigController.java @@ -0,0 +1,59 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.model.request.S3ConfigReq; +import net.gepafin.tendermanagement.model.response.S3ConfigBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.S3ConfigService; +import net.gepafin.tendermanagement.web.rest.api.S3ConfigApi; +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.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/s3-path-config}") +public class S3ConfigController implements S3ConfigApi { + + private static final Logger log = LoggerFactory.getLogger(S3ConfigController.class); + + @Autowired + S3ConfigService s3PathService; + + @Override + public ResponseEntity> addS3Path(S3ConfigReq s3pathReq) { + + log.info("Request Body : {}, {}, {}", s3pathReq.getPath(), s3pathReq.getType(), s3pathReq.getBucketName()); + S3ConfigBean s3Path = s3PathService.addS3Path(s3pathReq); + return ResponseEntity.status(HttpStatus.CREATED).body(new Response(s3Path, Status.SUCCESS, Translator.toLocale(GepafinConstant.ADDED_S3_PATH_STRUCTURE))); + } + @Override + public ResponseEntity>> getS3PathByType(String type) { + + log.info("Request to get S3Path by type {}", type); + Optional s3Path = s3PathService.getS3PathByType(type); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response>(s3Path, Status.SUCCESS, Translator.toLocale(GepafinConstant.S3_PATH_STRUCTURE_BY_TYPE))); + } + @Override + public ResponseEntity> deleteS3PathConfigById(Long id) { + log.info("Request to delete S3Path by Id {}", id); + S3ConfigEntity deletedS3PathConfig = s3PathService.deleteS3PathById(id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response(deletedS3PathConfig, Status.SUCCESS, Translator.toLocale(GepafinConstant.S3_PATH_DELETE_MSG))); + } + @Override + public ResponseEntity> updateS3PathConfigById(S3ConfigReq s3PathConfigurationReq, Long id) { + S3ConfigBean updatedS3PathConfiguration = s3PathService.updateS3PathConfiguration(s3PathConfigurationReq, id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response(updatedS3PathConfiguration, Status.SUCCESS, Translator.toLocale(GepafinConstant.S3_PATH_CONFIG_UPDATE_MSG))); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3MigrationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3MigrationApiController.java new file mode 100644 index 00000000..7e58800e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3MigrationApiController.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import net.gepafin.tendermanagement.service.impl.S3ReUploadMigrationService; +import net.gepafin.tendermanagement.web.rest.api.S3MigrationApi; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/s3-migration}") +public class S3MigrationApiController implements S3MigrationApi { + + @Autowired + S3ReUploadMigrationService s3MigrationService; + @Override + public String reUploadAndMigrateDocuments(String providedKey) { + return s3MigrationService.reUploadAndMigrateDocuments(providedKey); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3UserSignedAndDelegationMigrationController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3UserSignedAndDelegationMigrationController.java new file mode 100644 index 00000000..061b731b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3UserSignedAndDelegationMigrationController.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import net.gepafin.tendermanagement.service.impl.UserSignedAndDelegationServiceImpl; +import net.gepafin.tendermanagement.web.rest.api.UserSignedAndDelegationApi; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/s3-user-signed-and-delegation-migration}") +public class S3UserSignedAndDelegationMigrationController implements UserSignedAndDelegationApi { + + @Autowired + UserSignedAndDelegationServiceImpl userSignedAndDelegationService; + + @Override + public String migrateUserDelegatedDocuments(String providedKey) { + return userSignedAndDelegationService.migrateUserDelegatedDocuments(providedKey); + } + @Override + public String migrateUserSignedDocuments(String providedKey) { + return userSignedAndDelegationService.migrateUserSignedDocuments(providedKey); + } +} 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..06d8550a 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 @@ -67,7 +67,7 @@ - + @@ -83,7 +83,7 @@ - + @@ -101,18 +101,18 @@ - - + + - - + + - - + + @@ -122,19 +122,19 @@ - + - + - + - + - + @@ -250,7 +250,8 @@ - + + @@ -270,34 +271,39 @@ - + + - + - + - + + + - - - + + - + @@ -318,7 +324,8 @@ - + @@ -329,7 +336,8 @@ - + @@ -340,7 +348,8 @@ - + @@ -351,7 +360,8 @@ - + @@ -416,7 +426,8 @@ - + + @@ -432,7 +443,8 @@ - + + @@ -454,50 +466,50 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -507,62 +519,62 @@ + path="db/dump/inserted_form_field_data_30_08_2024.sql"/> select setval('gepafin_schema.form_field_id_seq', (select max(id)+1 from gepafin_schema.form_field), false) - - - - - - - - - - + + + + + + + + + + + references="lookup_data(id)"/> - - - - + + + + TRUNCATE TABLE FORM_FIELD RESTART IDENTITY; + path="db/dump/update_form_field_data_04_09_2024.sql"/> - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -586,23 +598,26 @@ - + + - + - + - + - + + @@ -618,9 +633,10 @@ - + + - + @@ -634,12 +650,13 @@ - + + - + - + @@ -658,18 +675,20 @@ - + - + + - + @@ -693,7 +712,7 @@ TRUNCATE TABLE FORM_FIELD RESTART IDENTITY; + path="classpath:db/dump/inserted_form_field_data_13_09_2024.sql"/> @@ -708,7 +727,7 @@ + path="classpath:db/dump/updated_form_field_data_16-09-2024.sql"/> @@ -739,16 +758,16 @@ $$; - - - - - - - - - - + + + + + + + + + + @@ -783,99 +802,99 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - + id = 13 - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - + + + + - - + + - + - + @@ -890,25 +909,25 @@ - + - - - + + + - - - - + + + + - + - + @@ -924,8 +943,8 @@ - - + + @@ -934,48 +953,48 @@ + path="classpath:db/dump/updated_form_field_data_03-10-2024.sql"/> - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -983,7 +1002,7 @@ + path="classpath:db/dump/updated_form_field_data_03-10-2024_1.sql"/> @@ -994,8 +1013,8 @@ - - + + @@ -1003,16 +1022,16 @@ - - + + + primaryKeyName="protocol_pkey"/> @@ -1058,132 +1077,132 @@ - - - - + + + + + primaryKeyName="system_email_template_pkey"/> - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - + - - - - - name='table' - - + + + + + name='table' + + + path="db/dump/update_system_email_template_of_application_submission.sql"/> - + + primaryKeyName="login_attempt_pkey"/> - - + + - - + + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + - + + primaryKeyName="criteria_form_field_pkey"/> - - - - + + + + - - - - + + + + - + @@ -1226,9 +1245,10 @@ - + - + @@ -1244,47 +1264,44 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -1293,12 +1310,12 @@ - + - - + + @@ -1315,17 +1332,90 @@ - + - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From cfb1c52f83cb7dd8c8eb3ecb2bedd61dff4cc0ac Mon Sep 17 00:00:00 2001 From: nisha Date: Sat, 26 Oct 2024 09:05:22 +0530 Subject: [PATCH 02/76] Updated code for pdf correction --- .../gepafin/tendermanagement/dao/PdfDao.java | 125 ++++++++++++++---- 1 file changed, 97 insertions(+), 28 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index efdc3798..bf585e19 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -17,6 +17,7 @@ import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -25,6 +26,7 @@ import org.springframework.stereotype.Component; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.util.*; import java.util.List; import java.util.stream.Collectors; @@ -60,7 +62,7 @@ public class PdfDao { // writer.setPageEvent(pageEvent); document.open(); // pageEvent.setTotalPages(writer.getPageNumber()); - addLogo(document, "https://mementoresources.s3.eu-west-1.amazonaws.com/gepafin/logo.jpg"); // Add your image path here + addLogo(document, "logo.jpg"); // Add your image path here BaseColor customColor = new BaseColor(0, 128, 0); // Adjust RGB values as needed @@ -82,8 +84,6 @@ public class PdfDao { ApplicationGetResponseBean applicationGetResponseBean=applicationDao.getApplicationByFormId(request, applicationId, null); for(FormApplicationResponse formApplicationResponse: applicationGetResponseBean.getForm()) { - document.add(new Paragraph(formApplicationResponse.getLabel(),sectionFont)); - document.add(new Paragraph(" ")); // Add line break List fieldLabelValuePairRequests = getFormFieldsToLabels(formApplicationResponse,writer,document); addColoredLines(writer,document,greenColor); document.add(new Paragraph(" ")); // Add line break @@ -231,24 +231,70 @@ public class PdfDao { } } else { - PdfPCell valueCell = new PdfPCell(new Phrase(String.valueOf(value), valueFont)); - valueCell.setPadding(5f); // Increase padding for better spacing - valueCell.setPaddingLeft(leftMargin); // Increase left margin for value - valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell - valueCell.setMinimumHeight(30f); - valueCell.setVerticalAlignment(Element.ALIGN_MIDDLE); - valueCell.setCellEvent(new RoundedCorners()); // Apply rounded corners - valueTable.addCell(valueCell); - document.add(valueTable); + String fieldValue=Utils.convertToString(value); + Image img = null; // This may throw MalformedURLException + if (fieldValue.equalsIgnoreCase("true")) { + // Use images for tick and cross + try { + img = Image.getInstance("true.jpg"); + } catch (IOException e) { + log.error("Error while uploading image for pdf for true"); + } + img.scaleAbsolute(15, 15); // Resize the image if needed + + PdfPCell cell = new PdfPCell(img); + cell.setPadding(5f); // Increase padding for better spacing + cell.setPaddingLeft(leftMargin); // Increase left margin for value + cell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell + cell.setMinimumHeight(30f); + cell.setVerticalAlignment(Element.ALIGN_LEFT); + cell.setCellEvent(new RoundedCorners()); // Apply rounded corners + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + valueTable.addCell(cell); + document.add(valueTable); + } + else if (fieldValue.equalsIgnoreCase("false")) { + // Use images for tick and cross + try { + img = Image.getInstance("false.jpg"); + } catch (IOException e) { + log.error("Error while uploading image for pdf for true"); + } + img.scaleAbsolute(15, 15); // Resize the image if needed + + PdfPCell cell = new PdfPCell(img); + cell.setPadding(5f); // Increase padding for better spacing + cell.setPaddingLeft(leftMargin); // Increase left margin for value + cell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell + cell.setMinimumHeight(30f); + cell.setVerticalAlignment(Element.ALIGN_LEFT); + cell.setCellEvent(new RoundedCorners()); // Apply rounded corners + cell.setHorizontalAlignment(Element.ALIGN_LEFT); + valueTable.addCell(cell); + document.add(valueTable); + } + else { + PdfPCell valueCell = new PdfPCell(new Phrase(String.valueOf(value), valueFont)); + valueCell.setPadding(5f); // Increase padding for better spacing + valueCell.setPaddingLeft(leftMargin); // Increase left margin for value + valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell + valueCell.setMinimumHeight(30f); + valueCell.setVerticalAlignment(Element.ALIGN_MIDDLE); + valueCell.setCellEvent(new RoundedCorners()); // Apply rounded corners + + valueTable.addCell(valueCell); + document.add(valueTable); + } + } - document.add(new Paragraph("\n")); // Add line break after each value } private Document createPdfTable(List> extractedData, Document document, ContentResponseBean contentResponseBean) throws DocumentException { // Create a PdfPTable with dynamic column count based on stateFieldMap size Map stateFieldMap = new HashMap<>(); + Map stateFieldBoolean = new HashMap<>(); // Populate stateFieldMap from contentResponseBean settings contentResponseBean.getSettings().stream() @@ -268,8 +314,23 @@ public class PdfDao { stateFieldMap.put(fieldName, fieldDataValue); } }); - - PdfPTable table = new PdfPTable(stateFieldMap.size()); // Number of columns equals the number of map entries + contentResponseBean.getSettings().stream() + .filter(setting -> "table_columns".equals(setting.getName())) // Check for "table_columns" + .map(SettingResponseBean::getValue) + .filter(Objects::nonNull) // Ensure value is not null + .filter(settingValue -> settingValue instanceof Map) // Ensure value is a Map + .map(settingValue -> (Map) settingValue) // Cast to Map + .map(valueMap -> (List>) valueMap.get("stateFieldData")) // Extract stateFieldData list + .filter(Objects::nonNull) // Ensure stateFieldData is not null + .flatMap(List::stream) // Flatten the list of field data maps + .forEach(fieldData -> { + String fieldName = (String) fieldData.get("name"); // Get the name field + Boolean predefined = (Boolean) fieldData.get("predefined"); // Get the predefined field + if (fieldName != null && fieldName != null) { + stateFieldBoolean.put(fieldName, predefined); + } + }); + PdfPTable table = new PdfPTable(stateFieldMap.size()); // Number of columns equals the number of map entries table.setWidthPercentage(100); // Set table width to 100% table.setTableEvent(new RoundedBorderEvent()); @@ -278,29 +339,37 @@ public class PdfDao { float maxTableHeight = 700f; // Maximum height of the table before a page break boolean headersAdded = false; // Flag to check if headers have been added + List trueKeys = new ArrayList<>(); + List falseKeys = new ArrayList<>(); + for (Map.Entry entry : stateFieldBoolean.entrySet()) { + if (Boolean.TRUE.equals(entry.getValue())) { + trueKeys.add(entry.getKey()); // Store true keys + } else { + falseKeys.add(entry.getKey()); // Store false keys + } + } + List orderedKeys = new ArrayList<>(trueKeys); + orderedKeys.addAll(falseKeys); // Iterate through extracted data to populate the table for (Map row : extractedData) { // Add headers once if (!headersAdded) { - for (Map.Entry stateField : stateFieldMap.entrySet()) { - String headerValue = stateField.getValue(); // Header text + for (String key : orderedKeys) { + String headerValue = stateFieldMap.get(key); // Header text + PdfPCell headerCell = new PdfPCell(new Phrase(headerValue)); // Create a new PdfPCell for the header + headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align + headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE); + headerCell.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - PdfPCell headerCell = new PdfPCell(new Phrase(headerValue)); // Create a new PdfPCell for the header - headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align - headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE); - headerCell.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - - table.addCell(headerCell); // Add the header cell to the table - } + table.addCell(headerCell); // Add the header cell to the table + } headersAdded = true; // Prevent headers from being added again } // Add data rows matching stateFieldMap keys for (Map.Entry stateField : stateFieldMap.entrySet()) { - String stateKey = stateField.getKey(); // Get the key from stateFieldMap - if (row.containsKey(stateKey)) { // If row contains the stateKey - Object value = row.get(stateKey); // Get the value from the row map - + for (String key : orderedKeys) { // Iterate over the ordered keys + Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present PdfPCell dynamicCell = new PdfPCell(new Phrase(value != null ? value.toString() : "", textFont)); dynamicCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell dynamicCell.setMinimumHeight(rowHeight); From 452a661389da3f4efa2645709fcc156f5781cf49 Mon Sep 17 00:00:00 2001 From: piyuskag Date: Sat, 26 Oct 2024 12:11:30 +0530 Subject: [PATCH 03/76] 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 04/76] 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 6c4e172e21f5a14231e3ad9de1a6c0390d9a1fc2 Mon Sep 17 00:00:00 2001 From: harish Date: Sat, 26 Oct 2024 14:19:10 +0530 Subject: [PATCH 05/76] updated checkbox code --- .../gepafin/tendermanagement/dao/PdfDao.java | 47 +++++++++---------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index bf585e19..a2c03a5b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -10,14 +10,12 @@ import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.*; import jakarta.servlet.http.HttpServletRequest; -import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.model.request.FieldLabelValuePairRequest; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -62,7 +60,8 @@ public class PdfDao { // writer.setPageEvent(pageEvent); document.open(); // pageEvent.setTotalPages(writer.getPageNumber()); - addLogo(document, "logo.jpg"); // Add your image path here +// addLogo(document, "logo.jpg"); // Add your image path here the migration code after cherry-pick + addLogo(document, "https://mementoresources.s3.eu-west-1.amazonaws.com/gepafin/logo.jpg"); BaseColor customColor = new BaseColor(0, 128, 0); // Adjust RGB values as needed @@ -234,44 +233,42 @@ public class PdfDao { String fieldValue=Utils.convertToString(value); Image img = null; // This may throw MalformedURLException - if (fieldValue.equalsIgnoreCase("true")) { + if (fieldValue.trim().equalsIgnoreCase("true")) { // Use images for tick and cross try { - img = Image.getInstance("true.jpg"); +// img = Image.getInstance("true.jpg"); update code after cherry-pick + img = Image.getInstance("https://mementoresources.s3.eu-west-1.amazonaws.com/gepafin/true.png"); } catch (IOException e) { log.error("Error while uploading image for pdf for true"); } img.scaleAbsolute(15, 15); // Resize the image if needed PdfPCell cell = new PdfPCell(img); - cell.setPadding(5f); // Increase padding for better spacing - cell.setPaddingLeft(leftMargin); // Increase left margin for value - cell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell - cell.setMinimumHeight(30f); - cell.setVerticalAlignment(Element.ALIGN_LEFT); - cell.setCellEvent(new RoundedCorners()); // Apply rounded corners - cell.setHorizontalAlignment(Element.ALIGN_LEFT); - valueTable.addCell(cell); + cell.setPadding(0); // Remove padding + cell.setBorder(Rectangle.NO_BORDER); // Remove border + cell.setMinimumHeight(15f); // Set height to fit checkbox image + cell.setVerticalAlignment(Element.ALIGN_MIDDLE); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); // Align the checkbox image to the left + + valueTable.addCell(cell); // Add cell with checkbox to the table document.add(valueTable); - } - else if (fieldValue.equalsIgnoreCase("false")) { + } else if (fieldValue.trim().equalsIgnoreCase("false")) { // Use images for tick and cross try { - img = Image.getInstance("false.jpg"); + img = Image.getInstance("https://mementoresources.s3.eu-west-1.amazonaws.com/gepafin/false.png"); } catch (IOException e) { - log.error("Error while uploading image for pdf for true"); + log.error("Error while uploading image for pdf for false"); } img.scaleAbsolute(15, 15); // Resize the image if needed PdfPCell cell = new PdfPCell(img); - cell.setPadding(5f); // Increase padding for better spacing - cell.setPaddingLeft(leftMargin); // Increase left margin for value - cell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell - cell.setMinimumHeight(30f); - cell.setVerticalAlignment(Element.ALIGN_LEFT); - cell.setCellEvent(new RoundedCorners()); // Apply rounded corners - cell.setHorizontalAlignment(Element.ALIGN_LEFT); - valueTable.addCell(cell); + cell.setPadding(0); // Remove padding + cell.setBorder(Rectangle.NO_BORDER); // Remove border + cell.setMinimumHeight(15f); // Set height to fit checkbox image + cell.setVerticalAlignment(Element.ALIGN_MIDDLE); + cell.setHorizontalAlignment(Element.ALIGN_LEFT); // Align the checkbox image to the left + + valueTable.addCell(cell); // Add cell with checkbox to the table document.add(valueTable); } else { From 9b1c86d179a3bb148766e02ce57d6fc72dadb2fa Mon Sep 17 00:00:00 2001 From: harish Date: Sat, 26 Oct 2024 17:48:31 +0530 Subject: [PATCH 06/76] 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 07/76] 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 08/76] 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 09/76] 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 10/76] 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 11/76] 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 12/76] 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 13/76] 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 14/76] 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 15/76] 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 16/76] 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))); + } } From 1f3a5f8debf368555575d3f737d82fd804b32031 Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 28 Oct 2024 18:11:41 +0530 Subject: [PATCH 17/76] Updated code for pdf tabel updation --- .../gepafin/tendermanagement/dao/PdfDao.java | 166 +++++++++--------- .../gepafin/tendermanagement/util/Utils.java | 26 +++ 2 files changed, 112 insertions(+), 80 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index a2c03a5b..702c61d1 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -16,6 +16,7 @@ import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -91,73 +92,73 @@ public class PdfDao { Font boldSmallFont = new Font(Font.FontFamily.HELVETICA, 10, Font.BOLD,new BaseColor(105, 105, 105)); // Adding the "Documenti Allegati" section title - document.add(new Paragraph(" ")); - -// pageEvent.setTotalPages(writer.getPageNumber()); - document.newPage(); -// pageEvent.setTotalPages(writer.getPageNumber()); - document.add(new Paragraph("Documenti Allegati", sectionFont)); - document.add(new Paragraph(" ")); - - -// 1. Autocertificazione possesso Requisiti - Paragraph p1 = new Paragraph(); - p1.add(new Chunk("1. ", boldSmallFont)); - p1.add(new Chunk("Autocertificazione possesso Requisiti ", boldSmallFont)); - p1.add(new Chunk("ai sensi degli artt. 46 e 47 del DPR 445/2000", smallFont)); - document.add(p1); - document.add(new Paragraph(" ")); - - - -// 2. Informativa Privacy relativa al trattamento dei dati personali - Paragraph p2 = new Paragraph(); - p2.add(new Chunk("2. ", boldSmallFont)); - p2.add(new Chunk("Informativa Privacy relativa al trattamento dei dati personali", boldSmallFont)); - document.add(p2); - document.add(new Paragraph(" ")); - - -// 3. Dati richiesti per la valutazione dell’adeguatezza dei flussi finanziari - Paragraph p3 = new Paragraph(); - p3.add(new Chunk("3. ", boldSmallFont)); - p3.add(new Chunk("Dati richiesti per la valutazione dell’adeguatezza dei flussi finanziari prospettici come da tabella di cui all’Appendice 9", boldSmallFont)); - document.add(p3); - document.add(new Paragraph(" ")); - - -// 4. Rilevazione Centrale dei Rischi - Paragraph p4 = new Paragraph(); - p4.add(new Chunk("4. ", boldSmallFont)); - p4.add(new Chunk("Rilevazione Centrale dei Rischi riferita agli ultimi 36 mesi disponibili alla data di presentazione della Domanda", boldSmallFont)); - document.add(p4); - document.add(new Paragraph(" ")); - - -// 5. Schema di presentazione dei dati di bilancio - Paragraph p5 = new Paragraph(); - p5.add(new Chunk("5. ", boldSmallFont)); - p5.add(new Chunk("Schema di presentazione dei dati di bilancio", boldSmallFont)); - document.add(p5); - document.add(new Paragraph(" ")); - - -// 6. Dettagli bilanci in forma abbreviata - Paragraph p6 = new Paragraph(); - p6.add(new Chunk("6. ", boldSmallFont)); - p6.add(new Chunk("Dettagli bilanci in forma abbreviata", boldSmallFont)); - document.add(p6); - document.add(new Paragraph(" ")); - - -// 7. Relazione aziendale illustrativa - Paragraph p7 = new Paragraph(); - p7.add(new Chunk("7. ", boldSmallFont)); - p7.add(new Chunk("Relazione aziendale illustrativa", boldSmallFont)); - document.add(p7); - document.add(new Paragraph(" ")); - - addColoredLines(writer,document,greenColor); +// document.add(new Paragraph(" ")); +// +//// pageEvent.setTotalPages(writer.getPageNumber()); +// document.newPage(); +//// pageEvent.setTotalPages(writer.getPageNumber()); +// document.add(new Paragraph("Documenti Allegati", sectionFont)); +// document.add(new Paragraph(" ")); +// +// +//// 1. Autocertificazione possesso Requisiti +// Paragraph p1 = new Paragraph(); +// p1.add(new Chunk("1. ", boldSmallFont)); +// p1.add(new Chunk("Autocertificazione possesso Requisiti ", boldSmallFont)); +// p1.add(new Chunk("ai sensi degli artt. 46 e 47 del DPR 445/2000", smallFont)); +// document.add(p1); +// document.add(new Paragraph(" ")); +// +// +// +//// 2. Informativa Privacy relativa al trattamento dei dati personali +// Paragraph p2 = new Paragraph(); +// p2.add(new Chunk("2. ", boldSmallFont)); +// p2.add(new Chunk("Informativa Privacy relativa al trattamento dei dati personali", boldSmallFont)); +// document.add(p2); +// document.add(new Paragraph(" ")); +// +// +//// 3. Dati richiesti per la valutazione dell’adeguatezza dei flussi finanziari +// Paragraph p3 = new Paragraph(); +// p3.add(new Chunk("3. ", boldSmallFont)); +// p3.add(new Chunk("Dati richiesti per la valutazione dell’adeguatezza dei flussi finanziari prospettici come da tabella di cui all’Appendice 9", boldSmallFont)); +// document.add(p3); +// document.add(new Paragraph(" ")); +// +// +//// 4. Rilevazione Centrale dei Rischi +// Paragraph p4 = new Paragraph(); +// p4.add(new Chunk("4. ", boldSmallFont)); +// p4.add(new Chunk("Rilevazione Centrale dei Rischi riferita agli ultimi 36 mesi disponibili alla data di presentazione della Domanda", boldSmallFont)); +// document.add(p4); +// document.add(new Paragraph(" ")); +// +// +//// 5. Schema di presentazione dei dati di bilancio +// Paragraph p5 = new Paragraph(); +// p5.add(new Chunk("5. ", boldSmallFont)); +// p5.add(new Chunk("Schema di presentazione dei dati di bilancio", boldSmallFont)); +// document.add(p5); +// document.add(new Paragraph(" ")); +// +// +//// 6. Dettagli bilanci in forma abbreviata +// Paragraph p6 = new Paragraph(); +// p6.add(new Chunk("6. ", boldSmallFont)); +// p6.add(new Chunk("Dettagli bilanci in forma abbreviata", boldSmallFont)); +// document.add(p6); +// document.add(new Paragraph(" ")); +// +// +//// 7. Relazione aziendale illustrativa +// Paragraph p7 = new Paragraph(); +// p7.add(new Chunk("7. ", boldSmallFont)); +// p7.add(new Chunk("Relazione aziendale illustrativa", boldSmallFont)); +// document.add(p7); +// document.add(new Paragraph(" ")); +// +// addColoredLines(writer,document,greenColor); document.close(); @@ -272,14 +273,17 @@ public class PdfDao { document.add(valueTable); } else { - PdfPCell valueCell = new PdfPCell(new Phrase(String.valueOf(value), valueFont)); + String fieldValue1= (String) value; + if(Utils.isValidDateString(fieldValue1)){ + fieldValue1=Utils.formatDateString(String.valueOf(value)); + } + PdfPCell valueCell = new PdfPCell(new Phrase(fieldValue1, valueFont)); valueCell.setPadding(5f); // Increase padding for better spacing valueCell.setPaddingLeft(leftMargin); // Increase left margin for value valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell valueCell.setMinimumHeight(30f); valueCell.setVerticalAlignment(Element.ALIGN_MIDDLE); valueCell.setCellEvent(new RoundedCorners()); // Apply rounded corners - valueTable.addCell(valueCell); document.add(valueTable); } @@ -356,6 +360,7 @@ public class PdfDao { PdfPCell headerCell = new PdfPCell(new Phrase(headerValue)); // Create a new PdfPCell for the header headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE); + headerCell.setFixedHeight(rowHeight); headerCell.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header table.addCell(headerCell); // Add the header cell to the table @@ -364,16 +369,15 @@ public class PdfDao { } // Add data rows matching stateFieldMap keys - for (Map.Entry stateField : stateFieldMap.entrySet()) { - for (String key : orderedKeys) { // Iterate over the ordered keys - Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present - PdfPCell dynamicCell = new PdfPCell(new Phrase(value != null ? value.toString() : "", textFont)); - dynamicCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell - dynamicCell.setMinimumHeight(rowHeight); - dynamicCell.setPadding(7f); + for (String key : orderedKeys) { + Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present + PdfPCell dataCell = new PdfPCell(new Phrase(value != null ? value.toString() : "", textFont)); + dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell + dataCell.setMinimumHeight(rowHeight); + dataCell.setFixedHeight(rowHeight); + dataCell.setPadding(7f); - table.addCell(dynamicCell); // Add the dynamically created cell to the table - } + table.addCell(dataCell); // Add the cell to the table } // Check if adding another row would exceed max height @@ -485,7 +489,7 @@ public class PdfDao { } fieldValue = matchedLabels; } - + // Further processing of field value (e.g., finding labels in options) fieldValue = findLabelInOptions(content.getSettings(), fieldValue); } else { @@ -494,7 +498,9 @@ public class PdfDao { } try { - addLabelValuePair(writer,document, contentLabel, fieldValue, labelFont,valueFont,content); + if((contentLabel!=null && Boolean.FALSE.equals(contentLabel.isEmpty())) || (fieldValue!=null && !StringUtils.isEmpty((CharSequence) fieldValue))) { + addLabelValuePair(writer, document, contentLabel, fieldValue, labelFont, valueFont, content); + } } catch (DocumentException e) { log.error("Error checking object: " + e.getMessage(), e); diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index a845aaad..1c86aa6b 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -4,12 +4,18 @@ import java.lang.reflect.Field; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.security.SecureRandom; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.*; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.regex.Pattern; import java.util.stream.Collectors; +import com.itextpdf.styledxmlparser.jsoup.Jsoup; import jakarta.servlet.http.HttpServletRequest; import org.apache.commons.collections4.MapUtils; import org.slf4j.Logger; @@ -369,5 +375,25 @@ public class Utils { throw new RuntimeException("Error converting map to string", e); } } + public static boolean isValidDateString(String dateStr) { + Pattern datePattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"); + return datePattern.matcher(dateStr).matches(); + } + // Method to convert a valid date string to the "dd-MM-yyyy" format + public static String formatDateString(String dateStr) { + String originalFormatPattern = "yyyy-MM-dd'T'HH:mm:ss"; + String targetFormatPattern = "dd-MM-yyyy"; + + try { + SimpleDateFormat originalFormat = new SimpleDateFormat(originalFormatPattern); + Date date = originalFormat.parse(dateStr); + SimpleDateFormat targetFormat = new SimpleDateFormat(targetFormatPattern); + + return targetFormat.format(date); + } catch (ParseException e) { + log.error("error while prcoessing date formate"); + return null; + } + } } From 1031cfc7b549298b7c4f32991f935d6cb7c6782b Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 28 Oct 2024 18:58:52 +0530 Subject: [PATCH 18/76] Updated evaluation status end point --- .../dao/ApplicationEvaluationDao.java | 24 ++++++++++--------- .../enums/AssignedEvaluationStatus.java | 19 +++++++++++++++ .../service/ApplicationEvaluationService.java | 3 ++- .../ApplicationEvaluationServiceImpl.java | 5 ++-- .../rest/api/ApplicationEvaluationApi.java | 4 +++- .../ApplicationEvaluationApiController.java | 5 ++-- 6 files changed, 43 insertions(+), 17 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/AssignedEvaluationStatus.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 37641033..656f4777 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -890,25 +890,27 @@ public class ApplicationEvaluationDao { return applicationEvaluationRepository.save(applicationEvaluationEntityData); } - public ApplicationEvaluationResponse updateApplicationEvaluationStatus(ApplicationEntity application, AssignedApplicationsEntity assignedApplicationsEntity) { + public ApplicationEvaluationResponse updateApplicationEvaluationStatus(ApplicationEntity application, AssignedApplicationsEntity assignedApplicationsEntity, AssignedEvaluationStatus newStatus) { 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()) - )) { + application.setStatus(newStatus.getValue()); + application = applicationRepository.save(application); + if (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);}return null; - - + } + entity = applicationEvaluationRepository.save(existingEntity); + assignedApplicationsEntity = assignedApplicationsRepository.save(assignedApplicationsEntity); + return convertToResponse(entity); + } + return null; } + + } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/AssignedEvaluationStatus.java b/src/main/java/net/gepafin/tendermanagement/enums/AssignedEvaluationStatus.java new file mode 100644 index 00000000..f595843c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/AssignedEvaluationStatus.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum AssignedEvaluationStatus { + APPROVED("APPROVED"), + REJECTED("REJECTED"); + + private String value; + + AssignedEvaluationStatus(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index a43b06e5..04766777 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -3,6 +3,7 @@ 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.AssignedEvaluationStatus; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; @@ -14,7 +15,7 @@ public interface ApplicationEvaluationService { void deleteApplicationEvaluation(HttpServletRequest request,Long id); List getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId,Long assignedApplicationId); - ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long assignedApplicationId); + ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long assignedApplicationId, AssignedEvaluationStatus status); ApplicationEvaluationEntity validateApplicationEvaluation(Long applicationEvaluationId); 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 2e511272..e0fa1133 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -9,6 +9,7 @@ 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.AssignedEvaluationStatus; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; @@ -106,11 +107,11 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe @Override @Transactional(rollbackFor = Exception.class) - public ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long assignedApplicationId) { + public ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long assignedApplicationId, AssignedEvaluationStatus status) { 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); + return applicationEvaluationDao.updateApplicationEvaluationStatus(assignedApplication.getApplication(),assignedApplication,status); } 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 aca53c6f..b6bc4cfb 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 @@ -9,6 +9,7 @@ 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.enums.AssignedEvaluationStatus; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.UpdateApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; @@ -74,6 +75,7 @@ public interface ApplicationEvaluationApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PutMapping(value = "/{assignedApplicationId}/status", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> updateApplicationEvaluationStatus(HttpServletRequest request, - @Parameter( required = true) @PathVariable("assignedApplicationId") Long assignedApplicationId); + @Parameter( required = true) @PathVariable("assignedApplicationId") Long assignedApplicationId, + @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) AssignedEvaluationStatus 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 b41a65ed..18614cce 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 @@ -5,6 +5,7 @@ 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.enums.AssignedEvaluationStatus; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.UpdateApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; @@ -57,8 +58,8 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation } @Override - public ResponseEntity> updateApplicationEvaluationStatus(HttpServletRequest request, Long assignedApplicationId) { - ApplicationEvaluationResponse applicationEvaluationResponse = applicationEvaluationService.updateApplicationEvaluationStatus(request, assignedApplicationId); + public ResponseEntity> updateApplicationEvaluationStatus(HttpServletRequest request, Long assignedApplicationId, AssignedEvaluationStatus status) { + ApplicationEvaluationResponse applicationEvaluationResponse = applicationEvaluationService.updateApplicationEvaluationStatus(request, assignedApplicationId,status); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applicationEvaluationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_EVALUATION_STATUS_UPDATED_SUCCESSFULLY))); } From 353e52572e36f579813cdf531dd08e7268ac9b17 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 28 Oct 2024 19:54:35 +0530 Subject: [PATCH 19/76] updated pdf code --- src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 702c61d1..4318127e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -465,7 +465,7 @@ public class PdfDao { .collect(Collectors.toList()); fieldValue = names; } - } else if (name.equals("checkboxes")) { + } else if (name.equals("checkboxes") && fieldValue instanceof List) { List check = (List) fieldValue; List settingResponseBeans = content.getSettings(); List matchedLabels = new ArrayList<>(); From ff013827fbcbbee75c80ef2b4fe0a8983d5f0434 Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 28 Oct 2024 20:07:11 +0530 Subject: [PATCH 20/76] Updated code for pdf table issue --- .../gepafin/tendermanagement/dao/PdfDao.java | 29 ++++++++++++------- .../gepafin/tendermanagement/util/Utils.java | 27 +++++++++++++++++ 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 702c61d1..3e93f84a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -277,6 +277,9 @@ public class PdfDao { if(Utils.isValidDateString(fieldValue1)){ fieldValue1=Utils.formatDateString(String.valueOf(value)); } + if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ + fieldValue= String.valueOf(Utils.convertItalianAmountToDouble(fieldValue)); + } PdfPCell valueCell = new PdfPCell(new Phrase(fieldValue1, valueFont)); valueCell.setPadding(5f); // Increase padding for better spacing valueCell.setPaddingLeft(leftMargin); // Increase left margin for value @@ -352,7 +355,6 @@ public class PdfDao { List orderedKeys = new ArrayList<>(trueKeys); orderedKeys.addAll(falseKeys); // Iterate through extracted data to populate the table - for (Map row : extractedData) { // Add headers once if (!headersAdded) { for (String key : orderedKeys) { @@ -369,16 +371,23 @@ public class PdfDao { } // Add data rows matching stateFieldMap keys - for (String key : orderedKeys) { - Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present - PdfPCell dataCell = new PdfPCell(new Phrase(value != null ? value.toString() : "", textFont)); - dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell - dataCell.setMinimumHeight(rowHeight); - dataCell.setFixedHeight(rowHeight); - dataCell.setPadding(7f); + for (Map row : extractedData) { + // Add data rows matching stateFieldMap keys + for (String key : orderedKeys) { + if (stateFieldMap.containsKey(key)) { // Only add data cell if key is in stateFieldMap + Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present + String fieldValue= (String) value; + if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ + fieldValue= String.valueOf(Utils.convertItalianAmountToDouble(fieldValue)); + } + PdfPCell dataCell = new PdfPCell(new Phrase(fieldValue != null ?fieldValue: "", textFont)); + dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell + dataCell.setMinimumHeight(rowHeight); + dataCell.setPadding(7f); - table.addCell(dataCell); // Add the cell to the table - } + table.addCell(dataCell); // Add the cell to the table + } + } // Check if adding another row would exceed max height if (table.getTotalHeight() + rowHeight > maxTableHeight) { diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 7dea2276..563a1805 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -5,6 +5,8 @@ import java.lang.reflect.Field; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.security.SecureRandom; +import java.text.DecimalFormat; +import java.text.NumberFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.LocalDate; @@ -414,4 +416,29 @@ public class Utils { return null; } } + public static String convertItalianAmountToDouble(String amount) throws NumberFormatException { + // Step 1: Remove the thousands separator and replace the decimal separator + String normalizedAmount = amount.replace(".", "").replace(",", "."); + + // Step 2: Parse the string to a double + double value = Double.parseDouble(normalizedAmount); + if (value <= 0) { + return amount; + } + // Step 3: Format the double to 2 decimal places + DecimalFormat decimalFormat = new DecimalFormat("#.00"); + return decimalFormat.format(value); // Return formatted string + } + public static boolean isItalianFormattedAmount(String input) { + // Regular expression to match Italian-style amounts (e.g., 41.003,00 or 123,45) + if (!input.contains(",")) { + return false; // Return false if there is no comma + } + String sanitizedInput = input.replace(",", ""); + + // Step 2: Check if the remaining string is a whole number + String wholeNumberPattern = "^\\d+$"; // Regex to match whole numbers + + return sanitizedInput.matches(wholeNumberPattern); + } } From 528d266cb8e6d910db2ca253cff848b089342fce Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 28 Oct 2024 21:09:33 +0530 Subject: [PATCH 21/76] Updated Application Evaluation API to return single object response instead of array --- .../constants/GepafinConstant.java | 2 +- .../dao/ApplicationEvaluationDao.java | 59 ++++++++++--------- .../ApplicationEvaluationRepository.java | 4 +- .../AssignedApplicationsRepository.java | 14 ++--- .../service/ApplicationEvaluationService.java | 2 +- .../ApplicationEvaluationServiceImpl.java | 47 ++++----------- .../rest/api/ApplicationEvaluationApi.java | 12 ++-- .../ApplicationEvaluationApiController.java | 9 ++- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 10 files changed, 61 insertions(+), 90 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index e53385fa..fff61dcb 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -242,7 +242,7 @@ public class GepafinConstant { 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 EVALUATION_ALREADY_EXISTS_MSG = "evaluation.already.exists"; public static final String APPLICATION_ASSIGNED= "application.assigned.success.msg"; public static final String APPLICATION_ALREADY_ASSIGNED = "application.already.assigned.msg"; public static final String ASSIGNED_APPLICATION_NOT_FOUND_MSG="aasigned.application.not.found"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 656f4777..c1a47b63 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -14,6 +14,7 @@ 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.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; @@ -93,17 +94,8 @@ public class ApplicationEvaluationDao { private void populateBasicDetails(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response) { response.setId(entity.getId()); response.setApplicationId(entity.getApplicationId()); - - List assignedApplicationsList = - assignedApplicationsRepository.findAllByApplicationId(entity.getApplicationId()); - - if (assignedApplicationsList.isEmpty()) { - response.setAssignedApplicationId(null); - } else { -// AssignedApplicationsEntity assignedApplications = assignedApplicationsList.get(0); - response.setAssignedApplicationId(entity.getAssignedApplicationsEntity().getId()); - } - + 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()); @@ -111,6 +103,7 @@ public class ApplicationEvaluationDao { } + private void setCriteriaResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List evaluationCriterias) { List criteriaResponsesFromEntity = entity.getCriteria() != null ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { @@ -341,7 +334,14 @@ public class ApplicationEvaluationDao { public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplciationId); ApplicationEvaluationEntity entity; - + Optional assignedApplications=assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplciationId); + {if(assignedApplications.isPresent()) + if (applicationEvaluationRepository.existsByApplicationIdAndIsDeletedFalse(assignedApplications.get().getApplication().getId())) { + throw new CustomValidationException( + Status.BAD_REQUEST, + GepafinConstant.EVALUATION_ALREADY_EXISTS_MSG + ); + }} if (existingEntityOptional.isPresent()) { entity = existingEntityOptional.get(); entity.setCriteria(Utils.convertObjectToJson(filterNonNullCriteria(processCriteria(entity, req)))); @@ -508,26 +508,27 @@ public class ApplicationEvaluationDao { } - 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()); + 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(); } - - 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))); + return entityOptional.map(this::convertToResponse) + .orElseGet(() -> { + return getEvaluationResponseByApplicationid(user, applicationId, assignedApplicationId); + }); } - public ApplicationEvaluationResponse getEvaluationResponseByApplicationid(UserEntity user, Long applicationId, Long assignedApplicationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); ApplicationEvaluationResponse response = new ApplicationEvaluationResponse(); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java index 69aa74fe..9ec88ffa 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java @@ -12,12 +12,14 @@ import java.util.Optional; @Repository public interface ApplicationEvaluationRepository extends JpaRepository { - List findByApplicationIdAndIsDeletedFalse(Long applicationId); + Optional findByApplicationIdAndIsDeletedFalse(Long applicationId); Optional findByIdAndIsDeletedFalse(Long id); Optional findByAssignedApplicationsEntity_IdAndIsDeletedFalse(Long assignedApplicationId); Optional findByApplicationIdAndAssignedApplicationsEntity_IdAndIsDeletedFalse(Long applicationId, Long assignedApplicationId); Optional findFirstByIsDeletedFalseOrderByCreatedDateDesc(); + boolean existsByApplicationIdAndIsDeletedFalse(Long applicationId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java index a2ceec9e..b9c02945 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java @@ -13,15 +13,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 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); + @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/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index 04766777..a8b8f419 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -14,7 +14,7 @@ public interface ApplicationEvaluationService { ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationRequest applicationEvaluationRequest,Long assignedApplicationsId); void deleteApplicationEvaluation(HttpServletRequest request,Long id); - List getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId,Long assignedApplicationId); + ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId,Long assignedApplicationId); ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long assignedApplicationId, AssignedEvaluationStatus 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 e0fa1133..a5e0c8c4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -48,7 +48,7 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe @Override @Transactional(readOnly = true) - public List getApplicationEvaluationByApplicationId( + public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId( HttpServletRequest request, Long applicationId, Long assignedApplicationId) { if (applicationId == null && assignedApplicationId == null) { throw new CustomValidationException( @@ -56,45 +56,20 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe 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); - - if (assignedApplicationsList.isEmpty()) { - throw new CustomValidationException( + AssignedApplicationsEntity assignedApplications = assignedApplicationsOptional + .orElseThrow(() -> 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()); - 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()); + return applicationEvaluationDao.getApplicationEvaluationByApplicationId( + user, + assignedApplications.getApplication().getId(), + assignedApplications.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 b6bc4cfb..42455042 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 @@ -39,21 +39,17 @@ 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) })), - @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })) }) @GetMapping(value = "/application", produces = MediaType.APPLICATION_JSON_VALUE) - ResponseEntity>> getApplicationEvaluationByApplicationId( + ResponseEntity> getApplicationEvaluationByApplicationId( HttpServletRequest request, @Parameter(required = false) @RequestParam(value = "applicationId", required = false) Long applicationId, - @Parameter(required = false) @RequestParam(value = "assignedApplicationId", required = false) Long assignedApplicationId); - + @Parameter( required = false) @RequestParam(value = "assignedApplicationId", required = false) Long assignedApplicationId); @Operation(summary = "API to delete ApplicationEvaluation", responses = { @ApiResponse(responseCode = "200", description = "OK"), 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 18614cce..5e31135a 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 @@ -38,14 +38,13 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation } @Override - public ResponseEntity>> getApplicationEvaluationByApplicationId( + public ResponseEntity> getApplicationEvaluationByApplicationId( HttpServletRequest request, Long applicationId, Long assignedApplicationId) { - List responseList = - applicationEvaluationService.getApplicationEvaluationByApplicationId(request, applicationId, assignedApplicationId); - + ApplicationEvaluationResponse response = null; + response = applicationEvaluationService.getApplicationEvaluationByApplicationId(request, applicationId,assignedApplicationId); return ResponseEntity.status(HttpStatus.OK) - .body(new Response<>(responseList, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_FETCHED_SUCCESSFULLY))); + .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_FETCHED_SUCCESSFULLY))); } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index e47a62c8..cb1abbef 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -263,6 +263,7 @@ application.evaluation.status.updated.successfully=Application evaluation status 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. +evaluation.already.exists=An application evaluation already exists for this application ID. # 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 1eaa302f..6a8e4a2f 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -261,6 +261,7 @@ evaluations.fetched.successfully = Tutte le valutazioni delle applicazioni recup 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. +evaluation.already.exists=Una valutazione dell'applicazione esiste già per questo ID applicazione. application.assigned.success.msg =Domanda assegnata con successo application.already.assigned.msg =La domanda � gi� assegnata From d29ac8cc05effbee91ef6def7f3f7fca785009a5 Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 28 Oct 2024 22:15:25 +0530 Subject: [PATCH 22/76] Updated code for pdf updation --- .../gepafin/tendermanagement/dao/PdfDao.java | 7 ++- .../gepafin/tendermanagement/util/Utils.java | 52 ++++++++++++++----- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 2cf1d32b..d2e29e84 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -278,7 +278,7 @@ public class PdfDao { fieldValue1=Utils.formatDateString(String.valueOf(value)); } if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ - fieldValue= String.valueOf(Utils.convertItalianAmountToDouble(fieldValue)); + fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); } PdfPCell valueCell = new PdfPCell(new Phrase(fieldValue1, valueFont)); valueCell.setPadding(5f); // Increase padding for better spacing @@ -362,7 +362,6 @@ public class PdfDao { PdfPCell headerCell = new PdfPCell(new Phrase(headerValue)); // Create a new PdfPCell for the header headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE); - headerCell.setFixedHeight(rowHeight); headerCell.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header table.addCell(headerCell); // Add the header cell to the table @@ -378,7 +377,7 @@ public class PdfDao { Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present String fieldValue= (String) value; if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ - fieldValue= String.valueOf(Utils.convertItalianAmountToDouble(fieldValue)); + fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); } PdfPCell dataCell = new PdfPCell(new Phrase(fieldValue != null ?fieldValue: "", textFont)); dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell @@ -498,7 +497,7 @@ public class PdfDao { } fieldValue = matchedLabels; } - + // Further processing of field value (e.g., finding labels in options) fieldValue = findLabelInOptions(content.getSettings(), fieldValue); } else { diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 563a1805..3bd7041e 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -416,24 +416,50 @@ public class Utils { return null; } } - public static String convertItalianAmountToDouble(String amount) throws NumberFormatException { - // Step 1: Remove the thousands separator and replace the decimal separator - String normalizedAmount = amount.replace(".", "").replace(",", "."); +// public static String convertItalianAmountToDouble(String amount) throws NumberFormatException { +// // Step 1: Remove the thousands separator and replace the decimal separator +// String normalizedAmount = amount.replace(".", "").replace(",", "."); +// +// // Step 2: Parse the string to a double +// double value = Double.parseDouble(normalizedAmount); +// if (value <= 0) { +// return amount; +// } +// // Step 3: Format the double to 2 decimal places +// DecimalFormat decimalFormat = new DecimalFormat("#.00"); +// return decimalFormat.format(value); // Return formatted string +// } - // Step 2: Parse the string to a double - double value = Double.parseDouble(normalizedAmount); - if (value <= 0) { - return amount; + public static String convertToItalianFormat(String amount) { + try { + // Step 1: Sanitize and standardize the input + String sanitizedAmount = amount.trim(); + if (sanitizedAmount.matches("\\d")) { + return sanitizedAmount; + } + // Step 2: Handle Italian-style input (e.g., "37.192,00") + if (sanitizedAmount.contains(".") && sanitizedAmount.contains(",")) { + // Assume the period is a thousand separator and the comma is a decimal separator + sanitizedAmount = sanitizedAmount.replace(".", "").replace(",", "."); + } else if (sanitizedAmount.contains(",")) { + // If the input contains only a comma, treat it as a decimal separator + sanitizedAmount = sanitizedAmount.replace(",", "."); + } + // Step 3: Parse the cleaned-up string into a double + double parsedAmount = Double.parseDouble(sanitizedAmount); + // Step 4: Format the parsed amount to Italian format + NumberFormat italianFormat = NumberFormat.getInstance(Locale.ITALY); + italianFormat.setMinimumFractionDigits(2); + italianFormat.setMaximumFractionDigits(2); + + return italianFormat.format(parsedAmount); + } catch (NumberFormatException e) { + // In case of any issues with parsing, return a default or error message + return "Invalid amount format"; } - // Step 3: Format the double to 2 decimal places - DecimalFormat decimalFormat = new DecimalFormat("#.00"); - return decimalFormat.format(value); // Return formatted string } public static boolean isItalianFormattedAmount(String input) { // Regular expression to match Italian-style amounts (e.g., 41.003,00 or 123,45) - if (!input.contains(",")) { - return false; // Return false if there is no comma - } String sanitizedInput = input.replace(",", ""); // Step 2: Check if the remaining string is a whole number From ce9b9c73d11f1612655ae215aed466c0089cdbf7 Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 28 Oct 2024 22:53:14 +0530 Subject: [PATCH 23/76] Updated code --- .../dao/ApplicationEvaluationDao.java | 15 ++++++--------- .../response/ApplicationEvaluationResponse.java | 1 + .../AssignedApplicationsRepository.java | 10 +++++++--- .../impl/ApplicationEvaluationServiceImpl.java | 13 ++++++++++--- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index c1a47b63..e4ddac90 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -20,6 +20,7 @@ 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; @@ -94,7 +95,7 @@ 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); + AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByIdAndIsDeletedFalse(entity.getAssignedApplicationsEntity().getId()).orElse(null); response.setAssignedApplicationId(assignedApplications.getId()); response.setNote(entity.getNote()); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(entity.getStatus())); @@ -327,7 +328,8 @@ public class ApplicationEvaluationDao { 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); - + LocalDateTime callEndDate = application.getCall().getEndDate(); + response.setCallEndDate(callEndDate); } @@ -335,13 +337,6 @@ public class ApplicationEvaluationDao { Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplciationId); ApplicationEvaluationEntity entity; Optional assignedApplications=assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplciationId); - {if(assignedApplications.isPresent()) - if (applicationEvaluationRepository.existsByApplicationIdAndIsDeletedFalse(assignedApplications.get().getApplication().getId())) { - throw new CustomValidationException( - Status.BAD_REQUEST, - GepafinConstant.EVALUATION_ALREADY_EXISTS_MSG - ); - }} if (existingEntityOptional.isPresent()) { entity = existingEntityOptional.get(); entity.setCriteria(Utils.convertObjectToJson(filterNonNullCriteria(processCriteria(entity, req)))); @@ -558,6 +553,8 @@ public class ApplicationEvaluationDao { response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.OPEN.getValue())); response.setMinScore(call.getThreshold()!=null?call.getThreshold():null); + LocalDateTime callEndDate = application.getCall().getEndDate(); + response.setCallEndDate(callEndDate); setCriteriaResponses(entity, application.getId(), response, evaluationCriterias); setChecklistResponses(entity, application.getId(), response, checklistEntities); setFileResponses(entity, application.getId(), response, applicationFormEntities); 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 08425f4c..f0be1236 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -28,4 +28,5 @@ public class ApplicationEvaluationResponse { private String callName; private LocalDateTime submissionDate; private LocalDateTime evaluationDate; + private LocalDateTime callEndDate; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java index b9c02945..beeb4610 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java @@ -15,9 +15,13 @@ public interface AssignedApplicationsRepository extends JpaRepository 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); + "AND (:id IS NULL OR aa.id = :id) " + + "AND (:userId IS NULL OR aa.userId = :userId)") + Optional findByApplicationIdOrIdAndUserIdAndIsDeletedFalse( + @Param("applicationId") Long applicationId, + @Param("id") Long id, + @Param("userId") Long userId); + } 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 a5e0c8c4..691ae8f9 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -50,29 +50,36 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe @Transactional(readOnly = true) public ApplicationEvaluationResponse 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) ); } + UserEntity preInstructor = validator.validateUser(request); Optional assignedApplicationsOptional = - assignedApplicationsRepository.findByApplicationIdOrId(applicationId, assignedApplicationId); + assignedApplicationsRepository.findByApplicationIdOrIdAndUserIdAndIsDeletedFalse(applicationId,assignedApplicationId, preInstructor.getId()); + if (assignedApplicationId != null) { + assignedApplicationsOptional = assignedApplicationsOptional.filter(a -> a.getId().equals(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()); + validator.validatePreInstructor(request, assignedApplications.getUserId()); + return applicationEvaluationDao.getApplicationEvaluationByApplicationId( - user, + preInstructor, assignedApplications.getApplication().getId(), assignedApplications.getId() ); } + @Override @Transactional(rollbackFor = Exception.class) public void deleteApplicationEvaluation(HttpServletRequest request,Long id) { From 97b9a521da1ffe4035b4e423704532dcfbaf545b Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 28 Oct 2024 23:21:16 +0530 Subject: [PATCH 24/76] updated code for html content for pdf --- .../gepafin/tendermanagement/dao/PdfDao.java | 14 ++-- .../tendermanagement/util/PdfUtils.java | 66 +++++++++++++++++++ 2 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/util/PdfUtils.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index d2e29e84..766492ec 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -14,6 +14,7 @@ import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.model.request.FieldLabelValuePairRequest; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.util.PdfUtils; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import org.apache.commons.lang3.StringUtils; @@ -207,7 +208,9 @@ public class PdfDao { // Loop through the list of strings and create a cell for each string for (String item : values) { - PdfPCell valueCell = new PdfPCell(new Phrase(item, valueFont)); + +// PdfPCell valueCell = new PdfPCell(new Phrase(item, valueFont)); + PdfPCell valueCell = PdfUtils.htmlToPdfPCell(item, valueFont); valueCell.setPadding(5f); // Increase padding for better spacing valueCell.setPaddingLeft(leftMargin); // Increase left margin for value valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell @@ -280,7 +283,8 @@ public class PdfDao { if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); } - PdfPCell valueCell = new PdfPCell(new Phrase(fieldValue1, valueFont)); +// PdfPCell valueCell = new PdfPCell(new Phrase(fieldValue1, valueFont)); + PdfPCell valueCell = PdfUtils.htmlToPdfPCell(fieldValue1, valueFont); valueCell.setPadding(5f); // Increase padding for better spacing valueCell.setPaddingLeft(leftMargin); // Increase left margin for value valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell @@ -359,7 +363,8 @@ public class PdfDao { if (!headersAdded) { for (String key : orderedKeys) { String headerValue = stateFieldMap.get(key); // Header text - PdfPCell headerCell = new PdfPCell(new Phrase(headerValue)); // Create a new PdfPCell for the header +// PdfPCell headerCell = new PdfPCell(new Phrase(headerValue)); // Create a new PdfPCell for the header + PdfPCell headerCell = PdfUtils.htmlToPdfPCell(headerValue, null); headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE); headerCell.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header @@ -379,7 +384,8 @@ public class PdfDao { if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); } - PdfPCell dataCell = new PdfPCell(new Phrase(fieldValue != null ?fieldValue: "", textFont)); +// PdfPCell dataCell = new PdfPCell(new Phrase(fieldValue != null ?fieldValue: "", textFont)); + PdfPCell dataCell = PdfUtils.htmlToPdfPCell(value != null ? value.toString() : "", textFont); dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell dataCell.setMinimumHeight(rowHeight); dataCell.setPadding(7f); diff --git a/src/main/java/net/gepafin/tendermanagement/util/PdfUtils.java b/src/main/java/net/gepafin/tendermanagement/util/PdfUtils.java new file mode 100644 index 00000000..cfa32b03 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/util/PdfUtils.java @@ -0,0 +1,66 @@ +package net.gepafin.tendermanagement.util; +import com.itextpdf.text.DocumentException; +import com.itextpdf.text.Element; +import com.itextpdf.text.Font; +import com.itextpdf.text.pdf.PdfPCell; +import com.itextpdf.text.html.simpleparser.HTMLWorker; +import com.itextpdf.text.html.simpleparser.StyleSheet; +import com.itextpdf.text.Paragraph; + +import java.io.StringReader; +import java.util.List; + +import org.springframework.stereotype.Component; + +@Component +public class PdfUtils { + + + + public static PdfPCell htmlToPdfPCell(String htmlContent, Font font) { + PdfPCell cell = new PdfPCell(); + + // Check if the content is not null or empty + if (htmlContent != null && !htmlContent.trim().isEmpty()) { + // Wrap plain text in a paragraph tag if it doesn't contain any HTML + // Check if the string does not contain any '<' or '>' characters + if (!htmlContent.contains("<") || !htmlContent.contains(">")) { + htmlContent = "

" + htmlContent + "

"; // Wrap in paragraph tags + } + + try { + // Create a list to hold the elements parsed from the HTML + List elements = HTMLWorker.parseToList(new StringReader(htmlContent), new StyleSheet()); + + // Create a paragraph to hold the formatted text + Paragraph paragraph = new Paragraph(); + + // Add each element to the paragraph + for (Element element : elements) { + // If the element is a Paragraph, set the font directly + if (element instanceof Paragraph) { + ((Paragraph) element).setFont(font); + } + // If the element is a Chunk, set the font directly + else if (element instanceof com.itextpdf.text.Chunk) { + ((com.itextpdf.text.Chunk) element).setFont(font); + } + // Add the element to the paragraph + paragraph.add(element); + } + + // Add the paragraph to the cell + cell.addElement(paragraph); + + } catch (Exception e) { + e.printStackTrace(); // Log the exception for debugging + } + } + + return cell; + } + +} + + + From a3e027876ecc6bff6e51d3a517cf3f7e1af2cffc Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 29 Oct 2024 13:15:36 +0530 Subject: [PATCH 25/76] Updated code for removing attached document from pdf --- .../gepafin/tendermanagement/dao/PdfDao.java | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 766492ec..6a2c2b8c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -211,12 +211,14 @@ public class PdfDao { // PdfPCell valueCell = new PdfPCell(new Phrase(item, valueFont)); PdfPCell valueCell = PdfUtils.htmlToPdfPCell(item, valueFont); - valueCell.setPadding(5f); // Increase padding for better spacing + valueCell.setFixedHeight(30f); // Set a fixed height for the cell + valueCell.setPaddingLeft(10f); // Adjust left padding as needed + valueCell.setPaddingTop(0f); // Remove padding from top to allow vertical centering + valueCell.setPaddingBottom(6f); valueCell.setPaddingLeft(leftMargin); // Increase left margin for value valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell - valueCell.setMinimumHeight(30f); valueCell.setVerticalAlignment(Element.ALIGN_MIDDLE); - valueCell.setCellEvent(new RoundedCorners()); // Apply rounded corners + valueCell.setHorizontalAlignment(Element.ALIGN_LEFT); valueCell.setCellEvent(new RoundedCorners()); // Apply rounded corners // Add the cell to the table valueTable.addCell(valueCell); @@ -285,11 +287,14 @@ public class PdfDao { } // PdfPCell valueCell = new PdfPCell(new Phrase(fieldValue1, valueFont)); PdfPCell valueCell = PdfUtils.htmlToPdfPCell(fieldValue1, valueFont); - valueCell.setPadding(5f); // Increase padding for better spacing + valueCell.setFixedHeight(30f); // Set a fixed height for the cell + valueCell.setPaddingLeft(10f); // Adjust left padding as needed + valueCell.setPaddingTop(0f); // Remove padding from top to allow vertical centering + valueCell.setPaddingBottom(6f); valueCell.setPaddingLeft(leftMargin); // Increase left margin for value valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell - valueCell.setMinimumHeight(30f); valueCell.setVerticalAlignment(Element.ALIGN_MIDDLE); + valueCell.setHorizontalAlignment(Element.ALIGN_LEFT); valueCell.setCellEvent(new RoundedCorners()); // Apply rounded corners valueTable.addCell(valueCell); document.add(valueTable); @@ -303,6 +308,7 @@ public class PdfDao { // Create a PdfPTable with dynamic column count based on stateFieldMap size Map stateFieldMap = new HashMap<>(); Map stateFieldBoolean = new HashMap<>(); +// Font textFont = FontFactory.getFont(FontFactory.HELVETICA, 12, Font.NORMAL, new BaseColor(178, 190, 181)); // Gray text // Populate stateFieldMap from contentResponseBean settings contentResponseBean.getSettings().stream() @@ -364,11 +370,14 @@ public class PdfDao { for (String key : orderedKeys) { String headerValue = stateFieldMap.get(key); // Header text // PdfPCell headerCell = new PdfPCell(new Phrase(headerValue)); // Create a new PdfPCell for the header - PdfPCell headerCell = PdfUtils.htmlToPdfPCell(headerValue, null); + PdfPCell headerCell = PdfUtils.htmlToPdfPCell(headerValue, textFont); headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE); headerCell.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - + headerCell.setFixedHeight(30f); // Set a fixed height for the cell + headerCell.setPaddingLeft(10f); // Adjust left padding as needed + headerCell.setPaddingTop(0f); // Remove padding from top to allow vertical centering + headerCell.setPaddingBottom(6f); table.addCell(headerCell); // Add the header cell to the table } headersAdded = true; // Prevent headers from being added again @@ -385,11 +394,13 @@ public class PdfDao { fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); } // PdfPCell dataCell = new PdfPCell(new Phrase(fieldValue != null ?fieldValue: "", textFont)); - PdfPCell dataCell = PdfUtils.htmlToPdfPCell(value != null ? value.toString() : "", textFont); + PdfPCell dataCell = PdfUtils.htmlToPdfPCell(fieldValue != null ? fieldValue : "", textFont); dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell - dataCell.setMinimumHeight(rowHeight); - dataCell.setPadding(7f); - + dataCell.setPaddingLeft(10f); // Adjust left padding as needed + dataCell.setPaddingTop(0f); // Remove padding from top to allow vertical centering + dataCell.setPaddingBottom(6f); + dataCell.setVerticalAlignment(Element.ALIGN_MIDDLE); + dataCell.setHorizontalAlignment(Element.ALIGN_LEFT); table.addCell(dataCell); // Add the cell to the table } } @@ -472,13 +483,7 @@ public class PdfDao { // Process 'fileupload' and 'checkboxes' cases as in the original logic if (name.equals("fileupload")) { - if (fieldValue instanceof List && ((List) fieldValue).stream().allMatch(item -> item instanceof DocumentResponseBean)) { - List documentList = (List) fieldValue; - List names = documentList.stream() - .map(DocumentResponseBean::getName) - .collect(Collectors.toList()); - fieldValue = names; - } + continue; } else if (name.equals("checkboxes") && fieldValue instanceof List) { List check = (List) fieldValue; List settingResponseBeans = content.getSettings(); From 0a908a82fe81970c691a419d0549997ca2a15d3e Mon Sep 17 00:00:00 2001 From: piyuskag Date: Tue, 29 Oct 2024 14:45:34 +0530 Subject: [PATCH 26/76] Email notification for document and application status. --- .../dao/ApplicationAmendmentRequestDao.java | 4 +- .../dao/ApplicationEvaluationDao.java | 463 +++++++++--------- .../dao/CommunicationDao.java | 147 ------ .../dao/EmailNotificationDao.java | 158 ++++++ ...ApplicationAmendmentRequestRepository.java | 6 + .../scheduler/NotificationScheduler.java | 137 +++--- src/main/resources/message_en.properties | 16 +- src/main/resources/message_it.properties | 2 +- 8 files changed, 459 insertions(+), 474 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index af220008..7476dd58 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -59,7 +59,7 @@ public class ApplicationAmendmentRequestDao { private ApplicationFormFieldRepository applicationFormFieldRepository; @Autowired - private CommunicationDao communicationDao; + private EmailNotificationDao emailNotificationDao; @Autowired private ApplicationEvaluationService applicationEvaluationService; @@ -177,7 +177,7 @@ public class ApplicationAmendmentRequestDao { ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = convertEntityToResponse(applicationAmendmentRequestEntity); log.info("Application submitted successfully for amendment", applicationAmendmentRequestResponse); if(Boolean.TRUE.equals(applicationAmendmentRequestResponse.isSendEmail())){ - communicationDao.sendMailToNotifyBeneficiaryRegardingNewAmendment(applicationAmendmentRequestEntity); + emailNotificationDao.sendMailToNotifyBeneficiaryRegardingNewAmendment(applicationAmendmentRequestEntity); } return applicationAmendmentRequestResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 37641033..a233d558 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -29,33 +29,51 @@ 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; + @Autowired private AssignedApplicationsRepository assignedApplicationsRepository; + @Autowired private CriteriaFormFieldRepository criteriaFormFieldRepository; + @Autowired + private EmailNotificationDao emailNotificationDao; + + @Autowired + ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository; private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { + ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplciationId).orElse(null); @@ -73,6 +91,7 @@ public class ApplicationEvaluationDao { } private ApplicationEvaluationResponse convertToResponse(ApplicationEvaluationEntity entity) { + ApplicationEvaluationResponse response = new ApplicationEvaluationResponse(); populateBasicDetails(entity, response); @@ -91,16 +110,16 @@ public class ApplicationEvaluationDao { } private void populateBasicDetails(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response) { + response.setId(entity.getId()); response.setApplicationId(entity.getApplicationId()); - List assignedApplicationsList = - assignedApplicationsRepository.findAllByApplicationId(entity.getApplicationId()); + List assignedApplicationsList = assignedApplicationsRepository.findAllByApplicationId(entity.getApplicationId()); if (assignedApplicationsList.isEmpty()) { response.setAssignedApplicationId(null); } else { -// AssignedApplicationsEntity assignedApplications = assignedApplicationsList.get(0); + // AssignedApplicationsEntity assignedApplications = assignedApplicationsList.get(0); response.setAssignedApplicationId(entity.getAssignedApplicationsEntity().getId()); } @@ -110,20 +129,18 @@ public class ApplicationEvaluationDao { 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 criteriaResponsesFromEntity = entity.getCriteria() != null ? + Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { + }) : + new ArrayList<>(); List criteriaResponsesFromDB = getCriteriaResponse(entity.getApplicationId()); addMissingCriteriaResponses(criteriaResponsesFromEntity, criteriaResponsesFromDB, entity.getApplicationId()); criteriaResponsesFromEntity.forEach(criteriaResponse -> { EvaluationCriteriaEntity matchingEvaluationCriteria = evaluationCriterias.stream() - .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())) - .findFirst() - .orElse(null); + .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())).findFirst().orElse(null); if (matchingEvaluationCriteria != null) { criteriaResponse.setLabel(matchingEvaluationCriteria.getLookupData().getValue()); @@ -138,9 +155,8 @@ public class ApplicationEvaluationDao { } private void addMissingCriteriaResponses(List criteriaResponsesFromEntity, List criteriaResponsesFromDB, Long applicationId) { - Set existingCriteriaIds = criteriaResponsesFromEntity.stream() - .map(CriteriaResponse::getId) - .collect(Collectors.toSet()); + + Set existingCriteriaIds = criteriaResponsesFromEntity.stream().map(CriteriaResponse::getId).collect(Collectors.toSet()); for (CriteriaResponse dbResponse : criteriaResponsesFromDB) { if (!existingCriteriaIds.contains(dbResponse.getId())) { @@ -152,8 +168,8 @@ public class ApplicationEvaluationDao { } private List getMappedFieldsForCriteria(Long evaluationCriteriaId, Long applicationId) { - List criteriaFormFields = criteriaFormFieldRepository - .findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaId); + + List criteriaFormFields = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaId); List mappedFields = new ArrayList<>(); Set uniqueFieldIds = new HashSet<>(); @@ -170,25 +186,22 @@ public class ApplicationEvaluationDao { 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; - } - } + 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); - }); + } + } + mappedField.setFieldLabel(label); + }); } - Optional formFieldEntityOptional = applicationFormFieldRepository - .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(formFieldId, applicationForm.getId(), applicationId); + Optional formFieldEntityOptional = applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + formFieldId, applicationForm.getId(), applicationId); formFieldEntityOptional.ifPresent(field -> mappedField.setFieldValue(field.getFieldValue())); @@ -201,19 +214,18 @@ public class ApplicationEvaluationDao { } private void setChecklistResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List checklistEntities) { - List checklistResponsesFromEntity = entity.getChecklist() != null - ? Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() { - }) - : new ArrayList<>(); + + List checklistResponsesFromEntity = entity.getChecklist() != null ? + Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() { + }) : + new ArrayList<>(); List checklistResponsesFromDB = getChecklistResponse(entity.getApplicationId()); addMissingChecklistResponses(checklistResponsesFromEntity, checklistResponsesFromDB); checklistResponsesFromEntity.forEach(checklistResponse -> { - CallTargetAudienceChecklistEntity matchingChecklist = checklistEntities.stream() - .filter(checklistEntity -> checklistEntity.getId().equals(checklistResponse.getId())) - .findFirst() - .orElse(null); + CallTargetAudienceChecklistEntity matchingChecklist = checklistEntities.stream().filter(checklistEntity -> checklistEntity.getId().equals(checklistResponse.getId())) + .findFirst().orElse(null); if (matchingChecklist != null) { checklistResponse.setLabel(matchingChecklist.getLookupData().getValue()); @@ -224,9 +236,8 @@ public class ApplicationEvaluationDao { } private void addMissingChecklistResponses(List checklistResponsesFromEntity, List checklistResponsesFromDB) { - Set existingChecklistIds = checklistResponsesFromEntity.stream() - .map(ChecklistResponse::getId) - .collect(Collectors.toSet()); + + Set existingChecklistIds = checklistResponsesFromEntity.stream().map(ChecklistResponse::getId).collect(Collectors.toSet()); for (ChecklistResponse dbResponse : checklistResponsesFromDB) { if (!existingChecklistIds.contains(dbResponse.getId())) { @@ -236,10 +247,9 @@ public class ApplicationEvaluationDao { } private void setFieldResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List applicationFormEntities) { - List fieldResponsesFromEntity = entity.getFile() != null - ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() { - }) - : new ArrayList<>(); + + List fieldResponsesFromEntity = entity.getFile() != null ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() { + }) : new ArrayList<>(); List fieldResponsesFromDB = getFieldResponses(entity.getApplicationId()); addMissingFieldResponses(fieldResponsesFromEntity, fieldResponsesFromDB); @@ -267,10 +277,9 @@ public class ApplicationEvaluationDao { } fieldResponse.setLabel(label); - Optional optionalFormField = applicationFormFieldRepository - .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( - fieldResponse.getId(), applicationForm.getId(), entity.getApplicationId() - ); + Optional optionalFormField = + applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + fieldResponse.getId(), applicationForm.getId(), entity.getApplicationId()); if (optionalFormField.isPresent()) { ApplicationFormFieldEntity formField = optionalFormField.get(); @@ -307,9 +316,8 @@ public class ApplicationEvaluationDao { } private void addMissingFieldResponses(List fieldResponsesFromEntity, List fieldResponsesFromDB) { - Set existingFieldIds = fieldResponsesFromEntity.stream() - .map(FieldResponse::getId) - .collect(Collectors.toSet()); + + Set existingFieldIds = fieldResponsesFromEntity.stream().map(FieldResponse::getId).collect(Collectors.toSet()); for (FieldResponse dbResponse : fieldResponsesFromDB) { if (!existingFieldIds.contains(dbResponse.getId())) { @@ -319,6 +327,7 @@ 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()); @@ -329,16 +338,16 @@ public class ApplicationEvaluationDao { String beneficiary = String.join(" ", firstName, lastName).trim(); response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); response.setBeneficiary(beneficiary); - response.setMinScore(call.getThreshold()!=null?call.getThreshold():null); - response.setCallName(application.getCall().getName()!=null?application.getCall().getName():null); + 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); } - public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { + Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplciationId); ApplicationEvaluationEntity entity; @@ -358,189 +367,157 @@ public class ApplicationEvaluationDao { } private List filterNonNullChecklist(List checklistRequests) { - return checklistRequests.stream() - .filter(request -> request.getValid() != null) - .collect(Collectors.toList()); + + 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()); + + 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()); + + 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<>(); - Map existingCriteriaMap = existingCriteriaList.stream() - .collect(Collectors.toMap(CriteriaResponse::getId, criteria -> criteria)); + List existingCriteriaList = entity.getCriteria() != null ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { + }) : new ArrayList<>(); - List updatedCriteriaList = req.getCriteria().stream() - .map(incoming -> { - CriteriaRequest request = new CriteriaRequest(); - request.setId(incoming.getId()); - request.setScore(incoming.getScore()); - request.setValid(incoming.getValid()); + Map existingCriteriaMap = existingCriteriaList.stream().collect(Collectors.toMap(CriteriaResponse::getId, criteria -> criteria)); - CriteriaResponse existingCriteria = existingCriteriaMap.get(incoming.getId()); - if (existingCriteria != null) { - request.setScore(incoming.getScore() != null ? incoming.getScore() : null); - request.setValid(incoming.getValid() != null ? incoming.getValid() : null); - } - return request; - }) - .collect(Collectors.toList()); + 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() : null); + request.setValid(incoming.getValid() != null ? incoming.getValid() : null); + } + return request; + }).collect(Collectors.toList()); List missingCriteriaRequests = existingCriteriaList.stream() - .filter(existing -> !updatedCriteriaList.stream() - .map(CriteriaRequest::getId) - .toList() - .contains(existing.getId())) - .map(existing -> { + .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(); + }).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 existingChecklistList = entity.getChecklist() != null ? + Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() { + }) : + new ArrayList<>(); - List updatedChecklistList = req.getChecklist().stream() - .map(incoming -> { - ChecklistRequest request = new ChecklistRequest(); - request.setId(incoming.getId()); - request.setValid(incoming.getValid()); + Map existingChecklistMap = existingChecklistList.stream().collect(Collectors.toMap(ChecklistResponse::getId, checklist -> checklist)); - ChecklistResponse existingChecklist = existingChecklistMap.get(incoming.getId()); - if (existingChecklist != null && incoming.getValid() == null) { - request.setValid(null); - } - return request; - }) - .collect(Collectors.toList()); + 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 && incoming.getValid() == null) { + request.setValid(null); + } + return request; + }).collect(Collectors.toList()); List missingChecklistRequests = existingChecklistList.stream() - .filter(existing -> !updatedChecklistList.stream() - .map(ChecklistRequest::getId) - .toList() - .contains(existing.getId())) - .map(existing -> { + .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() != null ? existing.getValid() : null); return request; - }) - .toList(); + }).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 existingFieldList = entity.getFile() != null ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() { + }) : new ArrayList<>(); - List updatedFieldList = req.getFiles().stream() - .map(incoming -> { - FieldRequest request = new FieldRequest(); - request.setId(incoming.getId()); - request.setValid(incoming.getValid()); + Map existingFieldMap = existingFieldList.stream().collect(Collectors.toMap(FieldResponse::getId, field -> field)); - FieldResponse existingField = existingFieldMap.get(incoming.getId()); - if (existingField != null) { - request.setValid(incoming.getValid() != null ? incoming.getValid() : null); - } - return request; - }) - .collect(Collectors.toList()); + List updatedFieldList = req.getFiles().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() : null); + } + return request; + }).collect(Collectors.toList()); List missingFieldRequests = existingFieldList.stream() - .filter(existing -> !updatedFieldList.stream() - .map(FieldRequest::getId) - .toList() - .contains(existing.getId())) - .map(existing -> { + .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(); + }).toList(); updatedFieldList.addAll(missingFieldRequests); return updatedFieldList; } public ApplicationEvaluationEntity validateApplicationEvaluation(Long id) { + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(id); if (entityOptional.isEmpty()) { - throw new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.APPLICATION_EVALUATION_NOT_FOUND, id)); + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_EVALUATION_NOT_FOUND, id)); } return entityOptional.get(); } - 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 evaluationEntities.stream().map(this::convertToResponse).collect(Collectors.toList()); } - Optional entityOptional = - (applicationId != null && assignedApplicationId != null) - ? applicationEvaluationRepository.findByApplicationIdAndAssignedApplicationsEntity_IdAndIsDeletedFalse(applicationId, assignedApplicationId) - : applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationId); + Optional entityOptional = (applicationId != null && assignedApplicationId != null) ? + applicationEvaluationRepository.findByApplicationIdAndAssignedApplicationsEntity_IdAndIsDeletedFalse(applicationId, assignedApplicationId) : + applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationId); - return entityOptional - .map(entity -> Collections.singletonList(convertToResponse(entity))) + return entityOptional.map(entity -> Collections.singletonList(convertToResponse(entity))) .orElseGet(() -> Collections.singletonList(getEvaluationResponseByApplicationid(user, applicationId, assignedApplicationId))); } - public ApplicationEvaluationResponse getEvaluationResponseByApplicationid(UserEntity user, Long applicationId, Long assignedApplicationId) { + ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); ApplicationEvaluationResponse response = new ApplicationEvaluationResponse(); CallEntity call = null; - ApplicationEntity application=null; + ApplicationEntity application = null; AssignedApplicationsEntity assignedApplications = null; - if (applicationId != null && assignedApplicationId==null) { + if (applicationId != null && assignedApplicationId == null) { application = applicationService.validateApplication(applicationId); call = callRepository.findCallEntityByApplicationId(applicationId); assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); } else if (assignedApplicationId != null) { - assignedApplications = assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationId).orElseThrow(() -> - new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG))); + 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()); @@ -556,7 +533,7 @@ public class ApplicationEvaluationDao { response.setNote(null); response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.OPEN.getValue())); - response.setMinScore(call.getThreshold()!=null?call.getThreshold():null); + response.setMinScore(call.getThreshold() != null ? call.getThreshold() : null); setCriteriaResponses(entity, application.getId(), response, evaluationCriterias); setChecklistResponses(entity, application.getId(), response, checklistEntities); setFileResponses(entity, application.getId(), response, applicationFormEntities); @@ -566,17 +543,15 @@ public class ApplicationEvaluationDao { 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); + 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); + .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())).findFirst().orElse(null); List applicationForms = applicationFormRepository.findByApplicationId(applicationId); Map mappedFieldMap = new HashMap<>(); @@ -585,8 +560,7 @@ public class ApplicationEvaluationDao { criteriaResponse.setLabel(matchingEvaluationCriteria.getLookupData().getValue()); criteriaResponse.setMaxScore(matchingEvaluationCriteria.getScore()); - List criteriaFormFields = criteriaFormFieldRepository - .findByEvaluationCriteriaIdAndIsDeletedFalse(matchingEvaluationCriteria.getId()); + List criteriaFormFields = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(matchingEvaluationCriteria.getId()); for (ApplicationFormEntity applicationForm : applicationForms) { for (CriteriaFormFieldEntity criteriaFormField : criteriaFormFields) { @@ -598,24 +572,22 @@ public class ApplicationEvaluationDao { 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; - } - } + 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); - }); + } + } + mappedField.setFieldLabel(label); + }); } - Optional formFieldEntityOptional = applicationFormFieldRepository - .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(formFieldId, applicationForm.getId(), applicationId); + Optional formFieldEntityOptional = + applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + formFieldId, applicationForm.getId(), applicationId); formFieldEntityOptional.ifPresent(formField -> mappedField.setFieldValue(formField.getFieldValue())); mappedFieldMap.put(formFieldId, mappedField); @@ -629,17 +601,15 @@ public class ApplicationEvaluationDao { 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); + 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); + CallTargetAudienceChecklistEntity matchingChecklist = checklistEntities.stream().filter(checklistEntity -> checklistEntity.getId().equals(checklistResponse.getId())) + .findFirst().orElse(null); if (matchingChecklist != null) { checklistResponse.setLabel(matchingChecklist.getLookupData().getValue()); @@ -649,11 +619,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>() { - }) - : getFieldResponses(applicationId); + 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 -> { @@ -678,8 +648,9 @@ public class ApplicationEvaluationDao { } fieldResponse.setLabel(label); - Optional optionalFormField = applicationFormFieldRepository - .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(fieldResponse.getId(), applicationForm.getId(), applicationId); + Optional optionalFormField = + applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + fieldResponse.getId(), applicationForm.getId(), applicationId); if (optionalFormField.isPresent() && optionalFormField.get().getFieldValue() != null) { String[] documentIds = optionalFormField.get().getFieldValue().split(","); @@ -715,8 +686,8 @@ public class ApplicationEvaluationDao { 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() : ""; @@ -725,7 +696,7 @@ public class ApplicationEvaluationDao { String beneficiary = String.join(" ", firstName, lastName).trim(); response.setBeneficiary(beneficiary); - response.setCallName(application.getCall().getName()!=null?application.getCall().getName():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); @@ -733,6 +704,7 @@ public class ApplicationEvaluationDao { } List getCriteriaResponse(Long applicationId) { + CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); List evaluationCriterias = evaluationCriteriaRepository.findByCallId(call.getId()); @@ -744,8 +716,7 @@ public class ApplicationEvaluationDao { response.setMaxScore(criteria.getScore()); response.setValid(null); - List criteriaFormFields = criteriaFormFieldRepository - .findByEvaluationCriteriaIdAndIsDeletedFalse(criteria.getId()); + List criteriaFormFields = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(criteria.getId()); List mappedFields = new ArrayList<>(); Set processedFormFieldIds = new HashSet<>(); @@ -760,32 +731,24 @@ public class ApplicationEvaluationDao { 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; - } - } + 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); - }); + } + } + mappedField.setFieldLabel(label); + }); } - applicationFormRepository.findByApplicationId(applicationId).stream() - .flatMap(applicationForm -> applicationFormFieldRepository - .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( - criteriaFormField.getFormFieldId(), applicationForm.getId(), applicationId) - .stream()) - .findFirst() - .ifPresent(formField -> mappedField.setFieldValue(formField.getFieldValue())); + 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()); @@ -799,6 +762,7 @@ public class ApplicationEvaluationDao { } List getChecklistResponse(Long applicationId) { + CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); List checklistEntities = callTargetAudienceChecklistRepository.findByCallId(call.getId()); List checklistResponses = checklistEntities.stream().map(checklist -> { @@ -814,6 +778,7 @@ public class ApplicationEvaluationDao { } public List getFieldResponses(Long applicationId) { + List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationId); List fieldResponses = new ArrayList<>(); @@ -828,8 +793,8 @@ public class ApplicationEvaluationDao { String fieldId = contentResponseBean.getId(); Long applicationFormId = applicationForm.getId(); - Optional optionalFormField = applicationFormFieldRepository - .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(fieldId, applicationFormId, applicationId); + Optional optionalFormField = applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + fieldId, applicationFormId, applicationId); if (optionalFormField.isPresent()) { ApplicationFormFieldEntity formField = optionalFormField.get(); @@ -881,33 +846,43 @@ public class ApplicationEvaluationDao { } 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(ApplicationEntity application, AssignedApplicationsEntity assignedApplicationsEntity) { - Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationsEntity.getId()); - ApplicationEvaluationEntity entity = null; + Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse( + assignedApplicationsEntity.getId()); + ApplicationEvaluationEntity entity; + + String statusType = application.getStatus(); if (existingEntityOptional.isPresent()) { ApplicationEvaluationEntity existingEntity = existingEntityOptional.get(); - if (Boolean.TRUE.equals( - application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || - application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue()) - )) { + 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);}return null; - - + } + entity = applicationEvaluationRepository.save(existingEntity); + assignedApplicationsRepository.save(assignedApplicationsEntity); + ApplicationAmendmentRequestEntity amendmentRequest = applicationAmendmentRequestRepository.findByApplicationEvaluationIdAndIsDeletedFalse(existingEntity.getId()); + if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.APPROVED.getValue())))) { + emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(amendmentRequest); + } + if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.REJECTED.getValue())))) { + emailNotificationDao.sendInadmissibilityEmailForRejectedApplication(amendmentRequest); + } + return convertToResponse(entity); + } + return null; } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java index 9d546496..afe7e21e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java @@ -3,25 +3,12 @@ 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.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.model.response.SystemEmailTemplateResponse; import net.gepafin.tendermanagement.repositories.CommunicationRepository; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; -import net.gepafin.tendermanagement.service.ApplicationService; -import net.gepafin.tendermanagement.service.SystemEmailTemplatesService; -import net.gepafin.tendermanagement.service.UserService; -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; @@ -30,9 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.time.LocalDateTime; -import java.util.HashMap; import java.util.List; -import java.util.Map; @Component public class CommunicationDao { @@ -44,19 +29,6 @@ public class CommunicationDao { @Autowired ApplicationAmendmentRequestService applicationAmendmentRequestService; - @Autowired - private MailUtil mailUtil; - - @Autowired - private SystemEmailTemplatesService systemEmailTemplatesService; - - @Autowired - private ApplicationService applicationService; - - @Autowired - private UserService userService; - - public CommunicationResponseBean addCommentToAmendmentRequest(CommunicationRequestBean communicationReq, Long amendmentId) { log.info("Adding communication request..."); @@ -127,123 +99,4 @@ public class CommunicationDao { communicationEntity.setCommentedDate(LocalDateTime.now()); return communicationEntity; } - - public void sendMailToNotifyBeneficiaryRegardingNewAmendment(ApplicationAmendmentRequestEntity applicationAmendmentRequest) { - - ApplicationEntity applicationEntity = applicationService.validateApplication(applicationAmendmentRequest.getApplicationId()); - - SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( - SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, applicationEntity.getCall(), null); - - // Create the map for subject placeholders - Map subjectPlaceholders = new HashMap<>(); - subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); - - // Create the map for body placeholders - Map bodyPlaceholders = new HashMap<>(); - bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); - bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatLocalDateTime(applicationAmendmentRequest.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY)); - bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationAmendmentRequest.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); - bodyPlaceholders.put("{{form_dataInput}}", ""); - - // Replace placeholders in the subject and body - String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); - String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); - UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); - mailUtil.sendByMailGun(subject, body, List.of(userEntity.getBeneficiary().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(); - } - 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/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java new file mode 100644 index 00000000..7c008754 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -0,0 +1,158 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.response.SystemEmailTemplateResponse; +import net.gepafin.tendermanagement.repositories.CallRepository; +import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.service.SystemEmailTemplatesService; +import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.util.MailUtil; +import net.gepafin.tendermanagement.util.Utils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class EmailNotificationDao { + + @Autowired + private MailUtil mailUtil; + + @Autowired + private SystemEmailTemplatesService systemEmailTemplatesService; + + @Autowired + private ApplicationService applicationService; + + @Autowired + private UserService userService; + + @Autowired + CallRepository callRepository; + + public void sendMailToNotifyBeneficiaryRegardingNewAmendment(ApplicationAmendmentRequestEntity applicationAmendmentRequest) { + + ApplicationEntity applicationEntity = applicationService.validateApplication(applicationAmendmentRequest.getApplicationId()); + + SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( + SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, applicationEntity.getCall(), null); + + // Create the map for subject placeholders + Map subjectPlaceholders = new HashMap<>(); + subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); + + // Create the map for body placeholders + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); + bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatLocalDateTime(applicationAmendmentRequest.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY)); + bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationAmendmentRequest.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); + bodyPlaceholders.put("{{form_dataInput}}", ""); + + // Replace placeholders in the subject and body + String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); + String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); + mailUtil.sendByMailGun(subject, body, List.of(userEntity.getBeneficiary().getEmail()), null); + } + + public void sendApplicationFailureNotificationEmail(ApplicationAmendmentRequestEntity amendmentRequest) { + + ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); + SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( + SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, applicationEntity.getCall(), null); + + // Create the map for subject placeholders + Map subjectPlaceholders = new HashMap<>(); + subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); + + // Create the map for body placeholders + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + bodyPlaceholders.put("{{date_time_emailSend}}", DateTimeUtil.formatLocalDateTime(amendmentRequest.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); + UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); + if (userEntity.getBeneficiary().getEmail() != null) { + mailUtil.sendByMailGun(subject, body, List.of(userEntity.getBeneficiary().getEmail()), null); + } + } + + public void sendAdmissibilityNotificationEmailForApprovedApplication(ApplicationAmendmentRequestEntity amendmentRequest) { + + ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); + SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( + SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, applicationEntity.getCall(), null); + + // Create the map for subject placeholders + Map subjectPlaceholders = new HashMap<>(); + subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); + + // Create the map for body placeholders + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); + bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); + bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().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); + + UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); + String userEmail; + String companyEmail; + if (userEntity.getBeneficiary().getEmail() != null && applicationEntity.getCompany().getEmail() != null) { + userEmail = userEntity.getBeneficiary().getEmail(); + companyEmail = applicationEntity.getCompany().getEmail(); + mailUtil.sendByMailGun(subject, body, List.of(userEmail), null); + mailUtil.sendByMailGun(subject, body, List.of(companyEmail), null); + } + } + + public void sendInadmissibilityEmailForRejectedApplication(ApplicationAmendmentRequestEntity amendmentRequest) { + + ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); + SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( + SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, applicationEntity.getCall(), null); + + // Create the map for subject placeholders + Map subjectPlaceholders = new HashMap<>(); + subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); + + // Create the map for body placeholders + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); + bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); + bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); + bodyPlaceholders.put("{{form_text}}", ""); + + // Replace placeholders in the subject and body + String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); + String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + + UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); + String userEmail; + String companyEmail; + if (userEntity.getBeneficiary().getEmail() != null && applicationEntity.getCompany().getEmail() != null) { + userEmail = userEntity.getBeneficiary().getEmail(); + companyEmail = applicationEntity.getCompany().getEmail(); + mailUtil.sendByMailGun(subject, body, List.of(userEmail), null); + mailUtil.sendByMailGun(subject, body, List.of(companyEmail), null); + } + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 608786e9..55ff393d 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -17,4 +17,10 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository findByUserId(@Param("userId") Long userId); + + List findByIsDeletedFalse(); + + @Query(value = "SELECT amr FROM ApplicationAmendmentRequestEntity amr " + "WHERE amr.applicationEvaluationEntity.id = :id " + "AND amr.applicationEvaluationEntity.isDeleted = false") + ApplicationAmendmentRequestEntity findByApplicationEvaluationIdAndIsDeletedFalse(Long id); + } diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java index 43d844b0..f83af795 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java @@ -1,72 +1,65 @@ -//package net.gepafin.tendermanagement.scheduler; -// -//import net.gepafin.tendermanagement.dao.CommunicationDao; -//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 -// CommunicationDao communicationDao; -// -// @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) { -// communicationDao.sendApplicationFailureNotificationEmail(user.getEmail(), application); -// } -// } -// } -// } -// } -// -// private ApplicationAmendmentRequestEntity getAmendmentRequestForApplication(ApplicationEntity application, List amendmentRequestList) { -// -// return amendmentRequestList.stream().filter(request -> request.getId().equals(application.getId())).findFirst().orElse(null); -// } -//} +package net.gepafin.tendermanagement.scheduler; + +import net.gepafin.tendermanagement.dao.EmailNotificationDao; +import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; +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 + ApplicationAmendmentRequestRepository applicationAmendmentRepository; + + @Autowired + EmailNotificationDao emailNotificationDao; + + @Scheduled(cron = "0 0/1 * * * ?") + 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.getCreatedDate(); + + // Eg :- Check if requestDate + 7 days is less than or equal to today + if (requestDate.plusDays(amendmentRequest.getResponseDays()).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("CLOSE"); + // applicationAmendmentRepository.save(amendmentRequest); // Save updated amendment request + emailNotificationDao.sendApplicationFailureNotificationEmail(amendmentRequest); + } + } + } + } + + 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/resources/message_en.properties b/src/main/resources/message_en.properties index e47a62c8..6cdaec2b 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -292,11 +292,11 @@ application.amendment.not.found = Application Amendment Request not found with t application.amendment.get.success = Application Amendment details fetched successfully with given ID. application.amendment.update.successfully = Application Amendment Updated Successfully. -added.comment.to.amendment.request.success = Application Amendment Comment Added Successfully.; -comment.not.found = Comment Not Found."; -comment.updated.successfully = Comment Updated Successfully."; -comment.deleted.successfully = Comment Deleted Successfully."; -comment.not.associate.with.amendment = Comment Not Associated with Amendment Request."; -amendment.found.success = Amendment Request Found Successfully."; -invalid.amendment.for.comment = Invalid Amendment Request for the Given Comment."; -DD_MM_YYYY_HH_MM = DD-MM-YYYY HH:MM."; +added.comment.to.amendment.request.success = Application Amendment Comment Added Successfully. +comment.not.found = Comment Not Found. +comment.updated.successfully = Comment Updated Successfully. +comment.deleted.successfully = Comment Deleted Successfully. +comment.not.associate.with.amendment = Comment Not Associated with Amendment Request. +amendment.found.success = Amendment Request Found Successfully. +invalid.amendment.for.comment = Invalid Amendment Request for the Given Comment. +DD_MM_YYYY_HH_MM = dd_MM_yyyy HH:mm diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 1eaa302f..82a69616 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -294,5 +294,5 @@ comment.deleted.successfully = Commento eliminato con successo. comment.not.associate.with.amendment = Il commento non � associato alla richiesta di emendamento. amendment.found.success = Richiesta di emendamento trovata con successo. invalid.amendment.for.comment = Richiesta di emendamento non valida per il commento fornito. -DD_MM_YYYY_HH_MM = DD-MM-YYYY HH:MM. +DD_MM_YYYY_HH_MM = dd_MM_yyyy HH:mm create.application.data.amendment.msg =Emendamento alla domanda inviato con successo From c640a8e7509131d40c4b4c2471a884caaad108c7 Mon Sep 17 00:00:00 2001 From: piyuskag Date: Tue, 29 Oct 2024 15:04:03 +0530 Subject: [PATCH 27/76] updated code. --- .../net/gepafin/tendermanagement/dao/EmailNotificationDao.java | 2 ++ ...t_system_email_template_for_notification_mail_27_10_2024.sql | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 7c008754..cacbe281 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -14,11 +14,13 @@ import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.MailUtil; import net.gepafin.tendermanagement.util.Utils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; +@Component public class EmailNotificationDao { @Autowired diff --git a/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_27_10_2024.sql b/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_27_10_2024.sql index 60556052..360bdd30 100644 --- a/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_27_10_2024.sql +++ b/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_27_10_2024.sql @@ -47,7 +47,7 @@ VALUES ( 4, 'Notification of Inadmissibility Due to Failure to Respond Template', - 'INADMISSIBILITY_NOTIFICATION', + 'INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE', '
From 2f68329eee441aa673a341a80fae7f9ace944f3a Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 29 Oct 2024 16:10:03 +0530 Subject: [PATCH 28/76] Updated code --- .../web/rest/api/ApplicationAmendmentRequestApi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 4cd537ae..1607da7a 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 @@ -72,7 +72,7 @@ public interface ApplicationAmendmentRequestApi { @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", + @Operation(summary = "Api to get all applications amendment request by preInstructor user Id", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -109,7 +109,7 @@ 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 = "/beneficiary/{id}", produces = "application/json") + @GetMapping(value = "/beneficiary/user/{id}", produces = "application/json") ResponseEntity>> getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, @Parameter(description = "Id", required = false) @PathVariable(value = "id",required = false) Long beneficiaryId); From 6e5e148e05d61fe7f2beb84ddabe9ff639e04be1 Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 29 Oct 2024 16:59:13 +0530 Subject: [PATCH 29/76] Updated evaluation endpoint and created an endpoint for extending response days for amendment --- .../constants/GepafinConstant.java | 2 +- .../dao/ApplicationAmendmentRequestDao.java | 36 ++++++++++++------- .../dao/ApplicationEvaluationDao.java | 28 +++++++++++---- .../ApplicationAmendmentRequestService.java | 2 +- .../service/ApplicationEvaluationService.java | 10 +++--- ...pplicationAmendmentRequestServiceImpl.java | 5 +++ .../ApplicationEvaluationServiceImpl.java | 32 ++++++++--------- .../api/ApplicationAmendmentRequestApi.java | 15 ++++++++ .../rest/api/ApplicationEvaluationApi.java | 18 ++-------- ...ApplicationAmendmentRequestController.java | 13 +++++++ .../ApplicationEvaluationApiController.java | 19 +++++----- src/main/resources/message_en.properties | 2 ++ src/main/resources/message_it.properties | 1 + 13 files changed, 117 insertions(+), 66 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index fff61dcb..ed496900 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -276,7 +276,7 @@ public class GepafinConstant { 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"; - + public static final String RESPONSE_DAYS_EXTENDED_SUCCESS_MSG = "response.days.extended.success"; public static final String COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS = "added.comment.to.amendment.request.success"; public static final String COMMENT_NOT_FOUND = "comment.not.found"; public static final String COMMENT_UPDATED_SUCCESS_MSG = "comment.updated.successfully"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index af220008..f76117ec 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -63,10 +63,10 @@ public class ApplicationAmendmentRequestDao { @Autowired private ApplicationEvaluationService applicationEvaluationService; - + @Autowired private ProtocolDao protocolDao; - + @Autowired private AssignedApplicationsService assignedApplicationsService; @@ -200,11 +200,11 @@ public class ApplicationAmendmentRequestDao { .collect(Collectors.joining(",")); applicationAmendmentRequestEntity.setFormFields(fieldIdsString); } - UserEntity userEntity = userService.validateUser(applicationEvaluationId); + UserEntity userEntity = userService.validateUser(applicationEvaluationEntity.getUserId()); Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub()); - ProtocolEntity protocolEntity = protocolDao.createProtocolEntity( - applicationEvaluationEntity.getAssignedApplicationsEntity().getApplication(), protocolNumber, - userEntity.getHub().getId()); + ProtocolEntity protocolEntity = protocolDao.createProtocolEntity( + applicationEvaluationEntity.getAssignedApplicationsEntity().getApplication(), protocolNumber, + userEntity.getHub().getId()); applicationAmendmentRequestEntity.setProtocol(protocolEntity); applicationAmendmentRequestEntity.setIsEmail(false); applicationAmendmentRequestEntity.setIsNotification(false); @@ -294,11 +294,11 @@ public class ApplicationAmendmentRequestDao { return applicationAmendmentRequestResponse; } - public ApplicationAmendmentRequestEntity validateApplicationAmendmentRequest(Long id) { - return applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); - } + public ApplicationAmendmentRequestEntity validateApplicationAmendmentRequest(Long id) { + return applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); + } public void deleteById(Long id) { log.info("Deleting assigned application with ID: {}", id); @@ -422,4 +422,16 @@ public class ApplicationAmendmentRequestDao { .collect(Collectors.toList()); } -} + public ApplicationAmendmentRequestResponse extendResponseDays(Long id, Long newResponseDays) { + ApplicationAmendmentRequestEntity request = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); + + if (newResponseDays != null && newResponseDays > 0) { + Long currentResponseDays = request.getResponseDays() != null ? request.getResponseDays() : 0L; + request.setResponseDays(currentResponseDays + newResponseDays); + applicationAmendmentRequestRepository.save(request); + } + return convertEntityToResponse(request); + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index e4ddac90..0bbbce90 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -333,10 +333,18 @@ public class ApplicationEvaluationDao { } - public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { - Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplciationId); + public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation( + UserEntity user, + ApplicationEvaluationRequest req, + Long assignedApplicationId, + AssignedEvaluationStatus status) { + + Optional existingEntityOptional = + applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationId); ApplicationEvaluationEntity entity; - Optional assignedApplications=assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplciationId); + Optional assignedApplications = + assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationId); + if (existingEntityOptional.isPresent()) { entity = existingEntityOptional.get(); entity.setCriteria(Utils.convertObjectToJson(filterNonNullCriteria(processCriteria(entity, req)))); @@ -345,13 +353,19 @@ public class ApplicationEvaluationDao { entity.setIsDeleted(false); setIfUpdated(entity::getNote, entity::setNote, req.getNote()); } else { - entity = convertToEntity(user, req, assignedApplciationId); + entity = convertToEntity(user, req, assignedApplicationId); + } + if (status != null) { + ApplicationEntity application = applicationService.validateApplication(assignedApplications.get().getApplication().getId()); + AssignedApplicationsEntity assignedApplicationsEntity = assignedApplications.get(); + return updateApplicationEvaluationStatus(application, assignedApplicationsEntity, status); + } else { + ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(entity); + return convertToResponse(savedEntity); } - - ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(entity); - return convertToResponse(savedEntity); } + private List filterNonNullChecklist(List checklistRequests) { return checklistRequests.stream() .filter(request -> request.getValid() != null) diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java index ed4dc5b1..c0860963 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java @@ -17,5 +17,5 @@ public interface ApplicationAmendmentRequestService { ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean); ApplicationAmendmentRequestEntity validateApplicationAmendmentRequest(Long applicationAmendmentId); List getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request,Long beneficiaryId); - + ApplicationAmendmentRequestResponse extendResponseDays(HttpServletRequest request, Long id, Long addedDays); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index a8b8f419..c6e7fe27 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -11,12 +11,14 @@ import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse import java.util.List; public interface ApplicationEvaluationService { - ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationRequest applicationEvaluationRequest,Long assignedApplicationsId); + ApplicationEvaluationResponse createOrUpdateApplicationEvaluation( + HttpServletRequest request, + ApplicationEvaluationRequest applicationEvaluationRequest, + Long assignedApplicationsId, + AssignedEvaluationStatus status); + void deleteApplicationEvaluation(HttpServletRequest request,Long id); ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId,Long assignedApplicationId); - ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long assignedApplicationId, AssignedEvaluationStatus 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 1fb77c4b..c2114626 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -66,6 +66,11 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm return applicationAmendmentRequestDao.getAllAmendmentRequestByBeneficiaryId(beneficiaryId); } + @Override + public ApplicationAmendmentRequestResponse extendResponseDays(HttpServletRequest request, Long id, Long addedDays) { + return applicationAmendmentRequestDao.extendResponseDays(id, addedDays); + + } } 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 691ae8f9..0cf02632 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -39,11 +39,21 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe @Override @Transactional(rollbackFor = Exception.class) - 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.getId()); + public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation( + HttpServletRequest request, + ApplicationEvaluationRequest req, + Long assignedApplicationsId, + AssignedEvaluationStatus status) { + + 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.getId(), status); } @Override @@ -78,8 +88,6 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe ); } - - @Override @Transactional(rollbackFor = Exception.class) public void deleteApplicationEvaluation(HttpServletRequest request,Long id) { @@ -87,16 +95,6 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe applicationEvaluationDao.deleteById(id); } - @Override - @Transactional(rollbackFor = Exception.class) - public ApplicationEvaluationResponse updateApplicationEvaluationStatus(HttpServletRequest request, Long assignedApplicationId, AssignedEvaluationStatus status) { - 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,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 4cd537ae..08174b06 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 @@ -112,5 +112,20 @@ public interface ApplicationAmendmentRequestApi { @GetMapping(value = "/beneficiary/{id}", produces = "application/json") ResponseEntity>> getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, @Parameter(description = "Id", required = false) @PathVariable(value = "id",required = false) Long beneficiaryId); + @Operation(summary = "Api to extend response days for an 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) })) + }) + @PutMapping(value = "/{id}/extendExpiration", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> extendResponseDays( + HttpServletRequest request, + @Parameter( required = true) @PathVariable("id") Long id, + @Parameter( required = true) @RequestParam("extendedDays") Long extendedDays); } 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 42455042..bd7d9357 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 @@ -36,8 +36,9 @@ public interface ApplicationEvaluationApi { @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); + @Parameter(description = "Assigned Application ID", required = true) @PathVariable("assignedApplicationsId") Long assignedApplicationsId, + @Parameter(description = "Application Evaluation Request Body", required = true) @Valid @RequestBody ApplicationEvaluationRequest evaluationRequest, + @Parameter( required = false) @RequestParam(value = "status", required = false) AssignedEvaluationStatus status); @Operation(summary = "API to get ApplicationEvaluation data for evaluation process", responses = { @@ -60,18 +61,5 @@ public interface ApplicationEvaluationApi { ResponseEntity> deleteApplicationEvaluation(HttpServletRequest request, @Parameter( 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 = "/{assignedApplicationId}/status", produces = MediaType.APPLICATION_JSON_VALUE) - ResponseEntity> updateApplicationEvaluationStatus(HttpServletRequest request, - @Parameter( required = true) @PathVariable("assignedApplicationId") Long assignedApplicationId, - @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) AssignedEvaluationStatus status); } 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 635a7244..1c582144 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 @@ -79,4 +79,17 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(applicationAmendmentRequestResponseList, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG))); } + @Override + public ResponseEntity> extendResponseDays( + HttpServletRequest request, + Long id, + Long addedDays) { + + log.info("Extending response days for Amendment Request ID: {}", id); + + ApplicationAmendmentRequestResponse response = applicationAmendmentRequestService.extendResponseDays(request, id, addedDays); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.RESPONSE_DAYS_EXTENDED_SUCCESS_MSG))); + } } 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 5e31135a..c8a2620b 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,13 +30,20 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation private ApplicationEvaluationService applicationEvaluationService; @Override - public ResponseEntity> createOrUpdateApplicationEvaluation(HttpServletRequest request, - Long assignedApplicationsId,ApplicationEvaluationRequest evaluationRequest) { - ApplicationEvaluationResponse response = applicationEvaluationService.createOrUpdateApplicationEvaluation(request,evaluationRequest,assignedApplicationsId); + public ResponseEntity> createOrUpdateApplicationEvaluation( + HttpServletRequest request, + Long assignedApplicationsId, + ApplicationEvaluationRequest evaluationRequest, + AssignedEvaluationStatus status) { + + ApplicationEvaluationResponse response = applicationEvaluationService.createOrUpdateApplicationEvaluation( + request, evaluationRequest, assignedApplicationsId, status); + 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, Long assignedApplicationId) { @@ -56,10 +63,4 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_DELETED_SUCCESSFULLY))); } - @Override - public ResponseEntity> updateApplicationEvaluationStatus(HttpServletRequest request, Long assignedApplicationId, AssignedEvaluationStatus status) { - ApplicationEvaluationResponse applicationEvaluationResponse = applicationEvaluationService.updateApplicationEvaluationStatus(request, assignedApplicationId,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/message_en.properties b/src/main/resources/message_en.properties index cb1abbef..e44ffd21 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -253,6 +253,7 @@ 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. @@ -292,6 +293,7 @@ create.application.data.amendment.msg = Application amendment submited succesful 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. +response.days.extended.success=Response days extended successfully. added.comment.to.amendment.request.success = Application Amendment Comment Added Successfully.; comment.not.found = Comment Not Found."; diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 6a8e4a2f..d3b7fccb 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -287,6 +287,7 @@ delete.application.amendment.success =Emendamento all'applicazione eliminato con 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. +response.days.extended.success=Giorni di risposta estesi con successo. added.comment.to.amendment.request.success = Commento aggiunto con successo alla richiesta di emendamento. comment.not.found = Commento non trovato. From 93def98fe961a1338dc813fb320c94a7c442ed74 Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 29 Oct 2024 18:12:28 +0530 Subject: [PATCH 30/76] Updated code --- .../dao/ApplicationEvaluationDao.java | 12 +++++++----- ...tus.java => ApplicationStatusForEvaluation.java} | 4 ++-- .../model/request/ApplicationEvaluationRequest.java | 2 ++ .../service/ApplicationEvaluationService.java | 9 ++------- .../impl/ApplicationEvaluationServiceImpl.java | 10 +++------- .../web/rest/api/ApplicationEvaluationApi.java | 12 ++---------- .../impl/ApplicationEvaluationApiController.java | 13 +++---------- 7 files changed, 21 insertions(+), 41 deletions(-) rename src/main/java/net/gepafin/tendermanagement/enums/{AssignedEvaluationStatus.java => ApplicationStatusForEvaluation.java} (75%) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 78360951..729f2e17 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -346,8 +346,7 @@ public class ApplicationEvaluationDao { public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation( UserEntity user, ApplicationEvaluationRequest req, - Long assignedApplicationId, - AssignedEvaluationStatus status) { + Long assignedApplicationId) { Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationId); @@ -365,12 +364,14 @@ public class ApplicationEvaluationDao { } else { entity = convertToEntity(user, req, assignedApplicationId); } + ApplicationStatusForEvaluation status = req.getApplicationStatus(); + + ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(entity); if (status != null) { ApplicationEntity application = applicationService.validateApplication(assignedApplications.get().getApplication().getId()); AssignedApplicationsEntity assignedApplicationsEntity = assignedApplications.get(); return updateApplicationEvaluationStatus(application, assignedApplicationsEntity, status); } else { - ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(entity); return convertToResponse(savedEntity); } } @@ -876,17 +877,18 @@ public class ApplicationEvaluationDao { } public ApplicationEvaluationResponse updateApplicationEvaluationStatus(ApplicationEntity application, AssignedApplicationsEntity assignedApplicationsEntity, - AssignedEvaluationStatus newStatus) { + ApplicationStatusForEvaluation newStatus) { Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse( assignedApplicationsEntity.getId()); ApplicationEvaluationEntity entity; - String statusType = application.getStatus(); + if (existingEntityOptional.isPresent()) { ApplicationEvaluationEntity existingEntity = existingEntityOptional.get(); application.setStatus(newStatus.getValue()); application = applicationRepository.save(application); + String statusType = application.getStatus(); if (application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue())) { existingEntity.setStatus(ApplicationEvaluationStatusTypeEnum.CLOSE.getValue()); assignedApplicationsEntity.setStatus(AssignedApplicationEnum.CLOSE.getValue()); diff --git a/src/main/java/net/gepafin/tendermanagement/enums/AssignedEvaluationStatus.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusForEvaluation.java similarity index 75% rename from src/main/java/net/gepafin/tendermanagement/enums/AssignedEvaluationStatus.java rename to src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusForEvaluation.java index f595843c..61c39b8e 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/AssignedEvaluationStatus.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusForEvaluation.java @@ -2,13 +2,13 @@ package net.gepafin.tendermanagement.enums; import com.fasterxml.jackson.annotation.JsonValue; -public enum AssignedEvaluationStatus { +public enum ApplicationStatusForEvaluation { APPROVED("APPROVED"), REJECTED("REJECTED"); private String value; - AssignedEvaluationStatus(String value) { + ApplicationStatusForEvaluation(String value) { this.value = 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 index 767b4aef..9563f00b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.model.request; import lombok.Data; +import net.gepafin.tendermanagement.enums.ApplicationStatusForEvaluation; import java.util.List; @Data @@ -10,4 +11,5 @@ public class ApplicationEvaluationRequest { private List checklist; private List files; private String note; + private ApplicationStatusForEvaluation applicationStatus; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index c6e7fe27..c9f72e6a 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -2,20 +2,15 @@ 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.AssignedEvaluationStatus; +import net.gepafin.tendermanagement.enums.ApplicationStatusForEvaluation; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; - -import java.util.List; - public interface ApplicationEvaluationService { ApplicationEvaluationResponse createOrUpdateApplicationEvaluation( HttpServletRequest request, ApplicationEvaluationRequest applicationEvaluationRequest, - Long assignedApplicationsId, - AssignedEvaluationStatus status); + Long assignedApplicationsId); void deleteApplicationEvaluation(HttpServletRequest request,Long id); 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 0cf02632..8550b63f 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -8,8 +8,7 @@ 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.AssignedEvaluationStatus; +import net.gepafin.tendermanagement.enums.ApplicationStatusForEvaluation; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; @@ -23,8 +22,6 @@ 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; @Service @@ -42,8 +39,7 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation( HttpServletRequest request, ApplicationEvaluationRequest req, - Long assignedApplicationsId, - AssignedEvaluationStatus status) { + Long assignedApplicationsId) { AssignedApplicationsEntity assignedApplication = assignedApplicationsRepository .findByIdAndIsDeletedFalse(assignedApplicationsId) @@ -53,7 +49,7 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe UserEntity user = validator.validatePreInstructor(request, assignedApplication.getUserId()); - return applicationEvaluationDao.createOrUpdateApplicationEvaluation(user, req, assignedApplication.getId(), status); + return applicationEvaluationDao.createOrUpdateApplicationEvaluation(user, req, assignedApplication.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 bd7d9357..bc17e345 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 @@ -7,22 +7,15 @@ 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.enums.AssignedEvaluationStatus; +import net.gepafin.tendermanagement.enums.ApplicationStatusForEvaluation; 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 or update ApplicationEvaluation", @@ -37,8 +30,7 @@ public interface ApplicationEvaluationApi { ResponseEntity> createOrUpdateApplicationEvaluation( HttpServletRequest request, @Parameter(description = "Assigned Application ID", required = true) @PathVariable("assignedApplicationsId") Long assignedApplicationsId, - @Parameter(description = "Application Evaluation Request Body", required = true) @Valid @RequestBody ApplicationEvaluationRequest evaluationRequest, - @Parameter( required = false) @RequestParam(value = "status", required = false) AssignedEvaluationStatus status); + @Parameter(description = "Application Evaluation Request Body", required = true) @Valid @RequestBody ApplicationEvaluationRequest evaluationRequest); @Operation(summary = "API to get ApplicationEvaluation data for evaluation process", responses = { 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 c8a2620b..f56a85fb 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 @@ -3,13 +3,9 @@ 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.enums.AssignedEvaluationStatus; +import net.gepafin.tendermanagement.enums.ApplicationStatusForEvaluation; 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; @@ -20,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.List; - @RestController @RequestMapping("${openapi.gepafin.base-path:/v1/applicationEvaluation}") public class ApplicationEvaluationApiController implements ApplicationEvaluationApi { @@ -33,11 +27,10 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation public ResponseEntity> createOrUpdateApplicationEvaluation( HttpServletRequest request, Long assignedApplicationsId, - ApplicationEvaluationRequest evaluationRequest, - AssignedEvaluationStatus status) { + ApplicationEvaluationRequest evaluationRequest) { ApplicationEvaluationResponse response = applicationEvaluationService.createOrUpdateApplicationEvaluation( - request, evaluationRequest, assignedApplicationsId, status); + request, evaluationRequest, assignedApplicationsId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CREATED_SUCCESSFULLY))); From 8f55a96825fef9e7da2d6a8c84d8834fa5e58d53 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 29 Oct 2024 19:47:11 +0530 Subject: [PATCH 31/76] Updated code for updating application status form AWAITING to DRAFT --- .../net/gepafin/tendermanagement/dao/ApplicationDao.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index e1cf0820..cf1265fe 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -611,8 +611,11 @@ public class ApplicationDao { sendMailToUserAndCompany(userEntity, applicationEntity); sendMailTodefaultSystemAndGepafin(userEntity, applicationEntity); applicationEntity.setStatus(status.getValue()); - applicationEntity = saveApplicationEntity(applicationEntity); } + if (status.equals(ApplicationStatusTypeEnum.DRAFT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.AWAITING.getValue()))) { + applicationEntity.setStatus(status.getValue()); + } + applicationEntity = saveApplicationEntity(applicationEntity); return getApplicationResponse(applicationEntity); From 51f1e97dd54127bdea4f9f4d78a0cbe2d58d4683 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Tue, 29 Oct 2024 21:31:35 +0530 Subject: [PATCH 32/76] fixed s3 call document download issue --- .../net/gepafin/tendermanagement/dao/ApplicationDao.java | 4 ++-- .../java/net/gepafin/tendermanagement/dao/CallDao.java | 9 ++++++--- .../net/gepafin/tendermanagement/dao/DelegationDao.java | 8 ++++---- .../net/gepafin/tendermanagement/dao/DocumentDao.java | 7 +++---- src/main/resources/application.properties | 8 ++++---- 5 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index cf1265fe..f7068c4a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -115,8 +115,8 @@ public class ApplicationDao { @Autowired private ApplicationSignedDocumentRepository applicationSignedDocumentRepository; - @Value("${aws.s3.url.folder.signed.document}") - private String signedDocumentS3Folder; +// @Value("${aws.s3.url.folder.signed.document}") +// private String signedDocumentS3Folder; @Autowired private UserService userService; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index b52aa97b..39736a57 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -21,7 +21,6 @@ import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import org.h2.util.IOUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -94,14 +93,17 @@ public class CallDao { @Autowired private FormDao formDao; - @Value("${aws.s3.url.folder}") - private String s3Folder; +// @Value("${aws.s3.url.folder}") +// private String s3Folder; @Autowired private AmazonS3Service amazonS3Service; @Autowired private CriteriaFormFieldRepository criteriaFormFieldRepository; + + @Autowired + private S3PathConfig s3PathConfig; public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, UserEntity userEntity) { createCallRequest.setRegionId(userEntity.getRoleEntity().getRegion().getId()); @@ -127,6 +129,7 @@ public class CallDao { ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) { for (DocumentEntity document : documents) { + String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.CALL, callId, 0L); try (InputStream fileInputStream = amazonS3Service.getFile(s3Folder, document.getFilePath())) { String fileName = Utils.extractFileName(document.getFilePath()); ZipEntry zipEntry = new ZipEntry(fileName); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index 20ae2cca..2243edf0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -8,10 +8,10 @@ import java.util.Map; import java.util.function.Function; import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; + import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -58,8 +58,8 @@ public class DelegationDao { @Autowired private S3PathConfig s3ConfigBean; - @Value("${aws.s3.url.folder.delegation}") - private String s3Folder; +// @Value("${aws.s3.url.folder.delegation}") +// private String s3Folder; @Autowired private UserCompanyDelegationRepository userCompanyDelegationRepository; @@ -67,9 +67,9 @@ public class DelegationDao { @Autowired private Validator validator; - public ByteArrayOutputStream generateDocument(Map placeholders, String templateName) { try { + String s3Folder = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_DELEGATION, 0L, 0L); InputStream templateStream = amazonS3Service.getFile(s3Folder ,templateName); XWPFDocument doc = loadTemplate(templateStream); replacePlaceholders(doc, placeholders); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index 226848f7..ffcbad26 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -7,7 +7,6 @@ import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -49,8 +48,8 @@ public class DocumentDao { @Autowired private ApplicationRepository applicationFormRepository; - @Value("${aws.s3.url.folder}") - private String s3Folder; +// @Value("${aws.s3.url.folder}") +// private String s3Folder; public List uploadFiles(List files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType) { List documentEntities = new ArrayList<>(); @@ -141,7 +140,7 @@ public class DocumentDao { try { Long callId; Long applicationId; - if(type.equals("APPLICATION")){ + if(type.equals(DocumentSourceTypeEnum.APPLICATION)){ callId = applicationFormRepository.findCallIdById(id); applicationId = id; }else{ diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 921675ff..a971dc04 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,7 +4,7 @@ spring.application.name=tendermanagement spring.servlet.multipart.max-file-size=300MB spring.servlet.multipart.max-request-size=300MB -spring.profiles.active=testing +spring.profiles.active=local # JPA Configuration @@ -30,9 +30,9 @@ aws.secret.access.key=FtnkzF8E3vtqPrVnloqMyNSUSqg0f9Z9L0R7qQOu aws.s3.region=eu-west-1 aws.s3.bucket.name=mementoresources aws.s3.url = https://mementoresources.s3.eu-west-1.amazonaws.com/ -aws.s3.url.folder=gepafin -aws.s3.url.folder.delegation=gepafin/delegation -aws.s3.url.folder.signed.document=gepafin/signed-document +#aws.s3.url.folder=gepafin +#aws.s3.url.folder.delegation=gepafin/delegation +#aws.s3.url.folder.signed.document=gepafin/signed-document # JWT configuration # Ensure these values match your expectations security.authentication.jwt.secret=my-secret-token-to-change-in-prod-environment-your-super-secure-randomly-generated-key From 5908334398865ab7432836ebe3de02a2e2cc4e56 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Tue, 29 Oct 2024 21:36:45 +0530 Subject: [PATCH 33/76] updated application property --- src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a971dc04..a870b853 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,7 +4,7 @@ spring.application.name=tendermanagement spring.servlet.multipart.max-file-size=300MB spring.servlet.multipart.max-request-size=300MB -spring.profiles.active=local +spring.profiles.active=testing # JPA Configuration From bfe4aa01eb7c45ac7fd02250bdfdbfa246574ce1 Mon Sep 17 00:00:00 2001 From: piyuskag Date: Wed, 30 Oct 2024 07:37:46 +0530 Subject: [PATCH 34/76] Updated code. --- .../tendermanagement/web/rest/api/CommunicationApi.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationApi.java index 98224277..eb1351c9 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationApi.java @@ -33,7 +33,7 @@ public interface CommunicationApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PostMapping(value = "/{amendmentId}", produces = { "application/json" }) ResponseEntity> addCommentToAmendmentRequest(HttpServletRequest request, - @RequestBody @Parameter CommunicationRequestBean communicationResponseBean, @Param(value = "amendmentId") Long amendmentId); + @RequestBody @Parameter CommunicationRequestBean communicationResponseBean, @PathVariable(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 = @@ -43,7 +43,7 @@ public interface CommunicationApi { @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); + public ResponseEntity> getAmendmentComments(@PathVariable(value = "amendmentId") 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 = { @@ -54,7 +54,7 @@ public interface CommunicationApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PutMapping(value = "/{amendmentId}/{commentId}", produces = { "application/json" }) ResponseEntity> updateCommunicationAmendment(HttpServletRequest request, - @RequestBody @Parameter CommunicationRequestBean communicationResponseBean, @PathVariable Long amendmentId, @PathVariable Long commentId); + @RequestBody @Parameter CommunicationRequestBean communicationResponseBean, @PathVariable(value = "amendmentId") Long amendmentId, @PathVariable(value = "commentId") 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 = { @@ -64,6 +64,6 @@ public interface CommunicationApi { @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, + ResponseEntity> deleteApplicationAmendmentComment(HttpServletRequest request, @PathVariable(value = "amendmentId") Long amendmentId, @Param(value = "commentId") Long commentId); } From d9178796fb92ad1a68f73e0954c6f35aea02bf89 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Wed, 30 Oct 2024 09:55:51 +0530 Subject: [PATCH 35/76] updated code --- .../java/net/gepafin/tendermanagement/dao/DelegationDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index 2243edf0..dfc65ec7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -69,7 +69,7 @@ public class DelegationDao { public ByteArrayOutputStream generateDocument(Map placeholders, String templateName) { try { - String s3Folder = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_DELEGATION, 0L, 0L); + String s3Folder = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.TEMPLATE, 0L, 0L); InputStream templateStream = amazonS3Service.getFile(s3Folder ,templateName); XWPFDocument doc = loadTemplate(templateStream); replacePlaceholders(doc, placeholders); From 163ca6fe437548999532e8ce13b501398ecb72e4 Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 30 Oct 2024 10:48:22 +0530 Subject: [PATCH 36/76] Added Status in Amendment --- .../constants/GepafinConstant.java | 1 + .../dao/ApplicationAmendmentRequestDao.java | 24 ++++++++++++++++++- .../ApplicationAmendmentRequestEntity.java | 10 ++++++++ .../ApplicationAmendmentRequestEnum.java | 21 ++++++++++++++++ .../request/ApplicationAmendmentRequest.java | 2 ++ .../model/request/CloseAmendmentRequest.java | 8 +++++++ .../ApplicationAmendmentRequestResponse.java | 1 + .../ApplicationAmendmentRequestService.java | 3 ++- ...pplicationAmendmentRequestServiceImpl.java | 5 ++++ .../api/ApplicationAmendmentRequestApi.java | 14 +++++++++++ ...ApplicationAmendmentRequestController.java | 9 +++++++ .../db/changelog/db.changelog-1.0.0.xml | 9 +++++++ src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 14 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/ApplicationAmendmentRequestEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/CloseAmendmentRequest.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index fff61dcb..d5988659 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -276,6 +276,7 @@ public class GepafinConstant { 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"; + public static final String APPLICATION_AMENDMENT_CLOSED_SUCCESFULLY = "application.amendment.closed.successfully"; public static final String COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS = "added.comment.to.amendment.request.success"; public static final String COMMENT_NOT_FOUND = "comment.not.found"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 7476dd58..375e1a58 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -8,12 +8,14 @@ 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.ApplicationAmendmentRequestEnum; 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.request.CloseAmendmentRequest; import net.gepafin.tendermanagement.model.response.AmendmentFormFieldResponse; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; import net.gepafin.tendermanagement.repositories.*; @@ -25,6 +27,8 @@ 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.ZoneId; import java.time.temporal.ChronoUnit; @@ -186,6 +190,10 @@ public class ApplicationAmendmentRequestDao { ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = new ApplicationAmendmentRequestEntity(); applicationAmendmentRequestEntity.setNote(applicationAmendmentRequest.getNote()); applicationAmendmentRequestEntity.setResponseDays(applicationAmendmentRequest.getResponseDays()); + applicationAmendmentRequestEntity.setIsEmail(applicationAmendmentRequest.getIsSendEmail()); + applicationAmendmentRequestEntity.setIsNotification(applicationAmendmentRequest.getIsSendNotification()); + applicationAmendmentRequestEntity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + applicationAmendmentRequestEntity.setStatus(ApplicationAmendmentRequestEnum.AWATING.getValue()); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); applicationAmendmentRequestEntity.setApplicationEvaluationEntity(applicationEvaluationEntity); @@ -240,7 +248,8 @@ public class ApplicationAmendmentRequestDao { applicationAmendmentRequestResponse.setApplicationEvaluationId(applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getId()); applicationAmendmentRequestResponse.setNote(applicationAmendmentRequestEntity.getNote()); applicationAmendmentRequestResponse.setResponseDays(applicationAmendmentRequestEntity.getResponseDays()); - LocalDateTime startDate = applicationAmendmentRequestEntity.getCreatedDate(); + applicationAmendmentRequestResponse.setInternalNote(applicationAmendmentRequestEntity.getInternalNote()); + LocalDateTime startDate = applicationAmendmentRequestEntity.getStartDate(); applicationAmendmentRequestResponse.setStartDate(startDate); LocalDateTime expirationDate = startDate.plus(expirationDays, ChronoUnit.DAYS); @@ -422,4 +431,17 @@ public class ApplicationAmendmentRequestDao { .collect(Collectors.toList()); } + public ApplicationAmendmentRequestResponse closeAmendmentRequest(Long id, CloseAmendmentRequest closeAmendmentRequest){ + log.info("Closing application amendement with ID: {}", id); + ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); + + setIfUpdated(existingApplicationAmendment::getInternalNote, existingApplicationAmendment::setInternalNote, closeAmendmentRequest.getInternalNote()); + setIfUpdated(existingApplicationAmendment::getStatus, existingApplicationAmendment::setStatus, ApplicationAmendmentRequestEnum.CLOSE.getValue()); + + ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment); + ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment); + log.info("Application Amendment closed successfully: {}", response); + return response; + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java index 6f5a4c40..4d2dabf6 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Data; +import java.time.LocalDateTime; @Entity @Table(name="application_amendment_request") @@ -23,12 +24,21 @@ public class ApplicationAmendmentRequestEntity extends BaseEntity { @Column(name = "APPLICATION_ID") private Long applicationId; + @Column(name = "START_DATE") + private LocalDateTime startDate; + @Column(name = "FORM_FIELDS") private String formFields; @Column(name="IS_DELETED") private Boolean isDeleted=false; + @Column(name = "STATUS") + private String status; + + @Column(name = "INTERNAL_NOTE") + private String internalNote; + @ManyToOne @JoinColumn(name = "APPLICATION_EVALUATION_ID", nullable = false) private ApplicationEvaluationEntity applicationEvaluationEntity; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationAmendmentRequestEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationAmendmentRequestEnum.java new file mode 100644 index 00000000..0552fdc0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationAmendmentRequestEnum.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum ApplicationAmendmentRequestEnum { + AWATING("AWATING"), + RESPONSE_RECEIVED("RESPONSE_RECEIVED"), + CLOSE("CLOSE"), + EXPIRED("EXPIRED"); + + private String value; + + ApplicationAmendmentRequestEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java index 0ecf1f00..ade4c676 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java @@ -9,4 +9,6 @@ public class ApplicationAmendmentRequest { private String note; private List formFields; private Long responseDays; + private Boolean isSendNotification; + private Boolean isSendEmail; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CloseAmendmentRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/CloseAmendmentRequest.java new file mode 100644 index 00000000..3d05c676 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CloseAmendmentRequest.java @@ -0,0 +1,8 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class CloseAmendmentRequest { + private String InternalNote; +} 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 30fe2238..d1dfe0ba 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java @@ -23,5 +23,6 @@ public class ApplicationAmendmentRequestResponse { private Long applicationEvaluationId; private LocalDateTime expirationDate; private List commentsList; + private String internalNote; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java index ed4dc5b1..3f71e61c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java @@ -4,6 +4,7 @@ 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.request.CloseAmendmentRequest; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; import java.util.List; @@ -17,5 +18,5 @@ public interface ApplicationAmendmentRequestService { ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean); ApplicationAmendmentRequestEntity validateApplicationAmendmentRequest(Long applicationAmendmentId); List getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request,Long beneficiaryId); - + ApplicationAmendmentRequestResponse closeAmendmentRequest(HttpServletRequest request, Long id, CloseAmendmentRequest closeAmendmentRequest); } 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 1fb77c4b..38409b69 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -6,6 +6,7 @@ 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; +import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; import net.gepafin.tendermanagement.util.Validator; @@ -66,6 +67,10 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm return applicationAmendmentRequestDao.getAllAmendmentRequestByBeneficiaryId(beneficiaryId); } + @Override + public ApplicationAmendmentRequestResponse closeAmendmentRequest(HttpServletRequest request, Long id, CloseAmendmentRequest closeAmendmentRequest) { + return applicationAmendmentRequestDao.closeAmendmentRequest(id,closeAmendmentRequest); + } } 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 1607da7a..02dbdccd 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 @@ -9,6 +9,7 @@ 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.request.CloseAmendmentRequest; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -113,4 +114,17 @@ public interface ApplicationAmendmentRequestApi { ResponseEntity>> getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, @Parameter(description = "Id", required = false) @PathVariable(value = "id",required = false) Long beneficiaryId); + @Operation(summary = "Api to close the 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) })) }) + @PutMapping(value = "", produces = "application/json") + ResponseEntity> closeApplicationAmendmentRequest(HttpServletRequest request, + @Parameter(description = "The Application Amendment id", required = true) @RequestParam("id") Long id, + @Valid @RequestBody CloseAmendmentRequest closeAmendmentRequest); } 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 635a7244..114f9922 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 @@ -6,6 +6,7 @@ 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.request.CloseAmendmentRequest; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; @@ -79,4 +80,12 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(applicationAmendmentRequestResponseList, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG))); } + + @Override + public ResponseEntity> closeApplicationAmendmentRequest(HttpServletRequest request, Long id, CloseAmendmentRequest closeAmendmentRequest) { + log.info("Closing Amendment Request"); + ApplicationAmendmentRequestResponse amendmentRequestResponse = applicationAmendmentRequestService.closeAmendmentRequest(request, id,closeAmendmentRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(amendmentRequestResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_CLOSED_SUCCESFULLY))); + } } 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 e7852f74..683246e4 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 @@ -1645,5 +1645,14 @@ constraintName="fk_application_amendment_request_protocol"/> + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index e09bad42..597cc74a 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -292,6 +292,7 @@ create.application.data.amendment.msg = Application amendment submited succesful 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. +application.amendment.closed.successfully = Application Amendment Closed Successfully. added.comment.to.amendment.request.success = Application Amendment Comment Added Successfully. comment.not.found = Comment Not Found. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index ba867404..978e9e19 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -287,6 +287,7 @@ delete.application.amendment.success =Emendamento all'applicazione eliminato con 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. +application.amendment.closed.successfully = Emendamento alla domanda chiuso con successo. added.comment.to.amendment.request.success = Commento aggiunto con successo alla richiesta di emendamento. comment.not.found = Commento non trovato. From 741997f967a50b81e6f8a2baf897c300152d13d7 Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 30 Oct 2024 12:19:28 +0530 Subject: [PATCH 37/76] Updated code --- .../repositories/AssignedApplicationsRepository.java | 8 +++----- .../service/impl/ApplicationEvaluationServiceImpl.java | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java index beeb4610..164dcb0a 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java @@ -15,12 +15,10 @@ public interface AssignedApplicationsRepository extends JpaRepository 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) " + - "AND (:userId IS NULL OR aa.userId = :userId)") - Optional findByApplicationIdOrIdAndUserIdAndIsDeletedFalse( + "AND (:id IS NULL OR aa.id = :id) ") + Optional findByApplicationIdOrIdAndIsDeletedFalse( @Param("applicationId") Long applicationId, - @Param("id") Long id, - @Param("userId") Long userId); + @Param("id") Long id); 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 8550b63f..6ccee608 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -65,7 +65,7 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe } UserEntity preInstructor = validator.validateUser(request); Optional assignedApplicationsOptional = - assignedApplicationsRepository.findByApplicationIdOrIdAndUserIdAndIsDeletedFalse(applicationId,assignedApplicationId, preInstructor.getId()); + assignedApplicationsRepository.findByApplicationIdOrIdAndIsDeletedFalse(applicationId,assignedApplicationId); if (assignedApplicationId != null) { assignedApplicationsOptional = assignedApplicationsOptional.filter(a -> a.getId().equals(assignedApplicationId)); From 03c9ec8f8a76765c79501f8ccbe03dcd09221f46 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 30 Oct 2024 13:45:37 +0530 Subject: [PATCH 38/76] Craeted two enpoints in amendment --- .../dao/ApplicationAmendmentRequestDao.java | 27 ++++++++++++++++- .../ApplicationAmendmentRequestResponse.java | 3 +- ...ApplicationAmendmentRequestRepository.java | 3 ++ .../ApplicationAmendmentRequestService.java | 6 ++++ ...pplicationAmendmentRequestServiceImpl.java | 10 +++++++ .../api/ApplicationAmendmentRequestApi.java | 29 +++++++++++++++++++ ...ApplicationAmendmentRequestController.java | 15 ++++++++++ src/main/resources/application.properties | 2 +- 8 files changed, 92 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 51287713..b5d36dac 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -247,6 +247,7 @@ public class ApplicationAmendmentRequestDao { applicationAmendmentRequestResponse.setApplicationId(applicationId); applicationAmendmentRequestResponse.setApplicationEvaluationId(applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getId()); applicationAmendmentRequestResponse.setNote(applicationAmendmentRequestEntity.getNote()); + applicationAmendmentRequestResponse.setStatus(ApplicationAmendmentRequestEnum.valueOf(applicationAmendmentRequestEntity.getStatus())); applicationAmendmentRequestResponse.setResponseDays(applicationAmendmentRequestEntity.getResponseDays()); applicationAmendmentRequestResponse.setInternalNote(applicationAmendmentRequestEntity.getInternalNote()); LocalDateTime startDate = applicationAmendmentRequestEntity.getStartDate(); @@ -430,7 +431,7 @@ public class ApplicationAmendmentRequestDao { .map(this::convertEntityToResponse) .collect(Collectors.toList()); } - + public ApplicationAmendmentRequestResponse closeAmendmentRequest(Long id, CloseAmendmentRequest closeAmendmentRequest){ log.info("Closing application amendement with ID: {}", id); ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); @@ -456,4 +457,28 @@ public class ApplicationAmendmentRequestDao { } return convertEntityToResponse(request); } + + public ApplicationAmendmentRequestResponse getAmendmentByApplicationId(HttpServletRequest request, Long applicationId) { + log.info("Fetching the Amendment data from application id {}", applicationId); + ApplicationEntity application = applicationService.validateApplication(applicationId); + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity=applicationAmendmentRequestRepository.findByApplicationIdAndIsDeletedFalse(application.getId()); + ApplicationAmendmentRequestResponse response=null; + if(applicationAmendmentRequestEntity!=null) { + response = convertEntityToResponse(applicationAmendmentRequestEntity); + } + return response; + } + public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus( + Long id,ApplicationAmendmentRequestEnum statusTypeEnum) { + + log.info("Updating application amendement with status: {}", id); + ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); + if(Boolean.TRUE.equals(existingApplicationAmendment.getStatus().equals(ApplicationAmendmentRequestEnum.AWATING.getValue())) && Boolean.TRUE.equals(statusTypeEnum.equals(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED))){ + existingApplicationAmendment.setStatus(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED.getValue()); + applicationAmendmentRequestRepository.save(existingApplicationAmendment); + } + ApplicationAmendmentRequestResponse response = convertEntityToResponse(existingApplicationAmendment); + log.info("Amendment status updated successfully: {}", response); + return response; + } } 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 d1dfe0ba..c942dbf2 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; +import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; import java.time.LocalDateTime; import java.util.List; @@ -24,5 +25,5 @@ public class ApplicationAmendmentRequestResponse { private LocalDateTime expirationDate; private List commentsList; private String internalNote; - + private ApplicationAmendmentRequestEnum status; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 55ff393d..972ebccd 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -23,4 +23,7 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request,Long beneficiaryId); ApplicationAmendmentRequestResponse closeAmendmentRequest(HttpServletRequest request, Long id, CloseAmendmentRequest closeAmendmentRequest); ApplicationAmendmentRequestResponse extendResponseDays(HttpServletRequest request, Long id, Long addedDays); + public ApplicationAmendmentRequestResponse getAmendmentByApplicationId(HttpServletRequest request,Long applicationId); + public ApplicationAmendmentRequestResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationAmendmentRequestEnum status); + + } 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 5b51b48a..d8a93d36 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -4,6 +4,8 @@ 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.enums.ApplicationAmendmentRequestEnum; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; @@ -77,6 +79,14 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm return applicationAmendmentRequestDao.extendResponseDays(id, addedDays); } + public ApplicationAmendmentRequestResponse getAmendmentByApplicationId(HttpServletRequest request, Long applicationId) { + UserEntity user= validator.validateUser(request); + return applicationAmendmentRequestDao.getAmendmentByApplicationId(request,applicationId); + } + @Override + public ApplicationAmendmentRequestResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationAmendmentRequestEnum status) { + return applicationAmendmentRequestDao.updateApplicationAmendmentStatus(applicationId, status); + } } 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 61e9ddd7..2438eae6 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 @@ -7,10 +7,13 @@ 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.ApplicationAmendmentRequestEnum; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; +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; @@ -142,4 +145,30 @@ public interface ApplicationAmendmentRequestApi { ResponseEntity> closeApplicationAmendmentRequest(HttpServletRequest request, @Parameter(description = "The Application Amendment id", required = true) @RequestParam("id") Long id, @Valid @RequestBody CloseAmendmentRequest closeAmendmentRequest); + @Operation(summary = "Api to get amendment process by application 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 = "application/{id}", produces = "application/json") + ResponseEntity> getAmendmentByApplicationId(HttpServletRequest request, @Parameter(description = "The Application id", required = true) @PathVariable(value = "id", required = true) Long applicationId); + + @Operation(summary = "Api to update application amendment 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 = "/{applicationAmendmentId}/status", produces = { "application/json" }) + ResponseEntity> updateApplicationAmendmentStatus(HttpServletRequest request, + @Parameter(description = "The application amendment id", required = true) @PathVariable("applicationAmendmentId") Long applicationAmendmentId, + @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) ApplicationAmendmentRequestEnum status); + } 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 137462f1..de74ac06 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 @@ -4,6 +4,8 @@ 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.enums.ApplicationAmendmentRequestEnum; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; @@ -102,4 +104,17 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.RESPONSE_DAYS_EXTENDED_SUCCESS_MSG))); } + @Override + public ResponseEntity> getAmendmentByApplicationId(HttpServletRequest request, Long applicationId) { + ApplicationAmendmentRequestResponse applicationAmendmentBean = applicationAmendmentRequestService.getAmendmentByApplicationId(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> updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationId, + ApplicationAmendmentRequestEnum status) { + ApplicationAmendmentRequestResponse applicationResponse = applicationAmendmentRequestService.updateApplicationStatus(request, applicationId, status); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_STATUS_UPDATED_SUCCESSFULLY))); + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a870b853..a971dc04 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,7 +4,7 @@ spring.application.name=tendermanagement spring.servlet.multipart.max-file-size=300MB spring.servlet.multipart.max-request-size=300MB -spring.profiles.active=testing +spring.profiles.active=local # JPA Configuration From 4b11d463e2ca296f306e71eee55ba904413199cf Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 30 Oct 2024 15:34:50 +0530 Subject: [PATCH 39/76] Updated code for the email signature while sending emails --- .../tendermanagement/dao/ApplicationDao.java | 10 ++++- .../dao/EmailNotificationDao.java | 20 +++++---- .../gepafin/tendermanagement/dao/HubDao.java | 2 +- .../dao/SystemEmailTemplatesDao.java | 43 +++++++++++++------ .../tendermanagement/entities/HubEntity.java | 4 ++ .../tendermanagement/service/HubService.java | 1 + .../service/SystemEmailTemplatesService.java | 4 +- .../service/impl/HubServiceImpl.java | 4 ++ .../impl/SystemEmailTemplatesServiceImpl.java | 6 +-- src/main/resources/application.properties | 1 + .../db/changelog/db.changelog-1.0.0.xml | 22 ++++++++++ ...e_for_application_submition_30-10-2024.sql | 37 ++++++++++++++++ 12 files changed, 125 insertions(+), 29 deletions(-) create mode 100644 src/main/resources/db/dump/updated_system_email_template_for_application_submition_30-10-2024.sql diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index f7068c4a..f8334632 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -20,6 +20,7 @@ import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.service.DocumentService; import net.gepafin.tendermanagement.service.FormService; +import net.gepafin.tendermanagement.service.HubService; import net.gepafin.tendermanagement.service.SystemEmailTemplatesService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.DateTimeUtil; @@ -126,6 +127,9 @@ public class ApplicationDao { @Autowired private ProtocolDao protocolDao; + + @Autowired + private HubService hubService; public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { @@ -699,9 +703,10 @@ public class ApplicationDao { CallEntity call =applicationEntity.getCall(); CompanyEntity company = applicationEntity.getCompany(); ProtocolEntity protocol = applicationEntity.getProtocol(); + HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService .retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum.APPLICATION_SUBMISSION_TO_USER_AND_COMPANY, - call, null); + hub, null); // Create the map for subject placeholders Map subjectPlaceholders = new HashMap<>(); @@ -732,9 +737,10 @@ public class ApplicationDao { CallEntity call = applicationEntity.getCall(); CompanyEntity company = applicationEntity.getCompany(); ProtocolEntity protocol = applicationEntity.getProtocol(); + HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService .retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum.APPLICATION_SUBMISSION_TO_GEPAFIN, - call, null); + hub, null); // Create the map for subject placeholders Map subjectPlaceholders = new HashMap<>(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index cacbe281..75b5dbf6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -3,11 +3,12 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.response.SystemEmailTemplateResponse; -import net.gepafin.tendermanagement.repositories.CallRepository; import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.service.HubService; import net.gepafin.tendermanagement.service.SystemEmailTemplatesService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.DateTimeUtil; @@ -34,16 +35,16 @@ public class EmailNotificationDao { @Autowired private UserService userService; - + @Autowired - CallRepository callRepository; + private HubService hubService; public void sendMailToNotifyBeneficiaryRegardingNewAmendment(ApplicationAmendmentRequestEntity applicationAmendmentRequest) { ApplicationEntity applicationEntity = applicationService.validateApplication(applicationAmendmentRequest.getApplicationId()); - + HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( - SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, applicationEntity.getCall(), null); + SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, hub, null); // Create the map for subject placeholders Map subjectPlaceholders = new HashMap<>(); @@ -68,8 +69,9 @@ public class EmailNotificationDao { public void sendApplicationFailureNotificationEmail(ApplicationAmendmentRequestEntity amendmentRequest) { ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); + HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( - SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, applicationEntity.getCall(), null); + SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, hub, null); // Create the map for subject placeholders Map subjectPlaceholders = new HashMap<>(); @@ -93,8 +95,9 @@ public class EmailNotificationDao { public void sendAdmissibilityNotificationEmailForApprovedApplication(ApplicationAmendmentRequestEntity amendmentRequest) { ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); + HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( - SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, applicationEntity.getCall(), null); + SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, hub, null); // Create the map for subject placeholders Map subjectPlaceholders = new HashMap<>(); @@ -126,8 +129,9 @@ public class EmailNotificationDao { public void sendInadmissibilityEmailForRejectedApplication(ApplicationAmendmentRequestEntity amendmentRequest) { ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); + HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( - SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, applicationEntity.getCall(), null); + SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, hub, null); // Create the map for subject placeholders Map subjectPlaceholders = new HashMap<>(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java b/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java index 3d5d6e7d..ee6e0d8a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java @@ -49,7 +49,7 @@ public class HubDao { hubRepository.save(hubEntity); } - private HubEntity validateHub(Long hubId) { + public HubEntity validateHub(Long hubId) { return hubRepository.findById(hubId) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.HUB_NOT_FOUND))); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java b/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java index 9218a33d..1665a724 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/SystemEmailTemplatesDao.java @@ -9,7 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; import net.gepafin.tendermanagement.model.response.SystemEmailTemplateResponse; @@ -25,24 +25,27 @@ public class SystemEmailTemplatesDao { @Value("${fe.base.url}") private String feBaseUrl; + @Value("${default.email.signature}") + private String defaultEmailSignature; - public SystemEmailTemplateResponse retrieveTemplate(SystemEmailTemplatesEntityTypeEnum type, CallEntity call, Locale language) { + + public SystemEmailTemplateResponse retrieveTemplate(SystemEmailTemplatesEntityTypeEnum type, HubEntity hub, Locale language) { SystemEmailTemplatesEntity dbSystemEmailTemplatesEntity = null; - if(call != null){ + if(hub != null){ // dbSystemEmailTemplatesEntity = systemEmailTemplatesRespository // .findByTypeAndCallId(type.getValue(), call.getId()); } - if(dbSystemEmailTemplatesEntity == null){ + if(dbSystemEmailTemplatesEntity == null) { dbSystemEmailTemplatesEntity = systemEmailTemplatesRespository .findByType(type.getValue()); } - SystemEmailTemplateResponse systemEmailTemplateResponse = replaceHtmlContant(dbSystemEmailTemplatesEntity, call, language, Boolean.TRUE); + SystemEmailTemplateResponse systemEmailTemplateResponse = replaceHtmlContant(dbSystemEmailTemplatesEntity, hub, language, Boolean.TRUE); return systemEmailTemplateResponse; } private SystemEmailTemplateResponse replaceHtmlContant(SystemEmailTemplatesEntity dbSystemEmailTemplatesEntity, - CallEntity call, Locale language1, Boolean isDefaultReplace) { + HubEntity hub, Locale language1, Boolean isDefaultReplace) { String language = null; String htmlContent = dbSystemEmailTemplatesEntity.getHtmlContent(); String subject = dbSystemEmailTemplatesEntity.getSubject(); @@ -69,7 +72,8 @@ public class SystemEmailTemplatesDao { } - htmlContent = replacePlatformLinkPlaceholder(call, htmlContent, languageMap); + htmlContent = replacePlatformLinkPlaceholderAndEmailSignature(hub, htmlContent, languageMap); + subject = replacePlatformLinkPlaceholderAndEmailSignature(hub, subject, languageMap); SystemEmailTemplateResponse systemEmailTemplateResponse = new SystemEmailTemplateResponse(); systemEmailTemplateResponse.setHtmlContent(htmlContent); systemEmailTemplateResponse.setSubject(subject); @@ -102,15 +106,28 @@ public class SystemEmailTemplatesDao { } return ""; } - private String replacePlatformLinkPlaceholder(CallEntity call, String htmlContent, + private String replacePlatformLinkPlaceholderAndEmailSignature(HubEntity hub, String htmlContent, Map languageMap) { - String platformLink = feBaseUrl; + htmlContent = replacePlatformLinkPlaceholder(hub, htmlContent, languageMap); + htmlContent = replaceEmailSignature(hub, htmlContent, languageMap); -// if(hubEntity != null && Boolean.FALSE.equals(isEmpty(hubEntity.getDomainName()))){ -// platformLink = hubEntity.getDomainName(); -// } - htmlContent = htmlContent.replace("{{platform_link}}", platformLink); return htmlContent; } + private String replaceEmailSignature(HubEntity hub, String htmlContent, Map languageMap) { + String emailSignature = defaultEmailSignature; + if(hub != null && Boolean.FALSE.equals(StringUtils.isEmpty(hub.getEmailSignature()))){ + emailSignature = hub.getEmailSignature(); + } + return htmlContent.replace("{{email_signature}}", emailSignature); + } + + private String replacePlatformLinkPlaceholder(HubEntity hub, String htmlContent, Map languageMap) { + String platformLink = feBaseUrl; + if(hub != null && Boolean.FALSE.equals(StringUtils.isEmpty(hub.getDomainName()))){ + platformLink = hub.getDomainName(); + } + return htmlContent.replace("{{platform_link}}", platformLink); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java index 1b03f913..f3796342 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java @@ -42,4 +42,8 @@ public class HubEntity extends BaseEntity{ @Column(name = "UNIQUE_UUID") private String uniqueUuid; + + @Column(name = "EMAIL_SIGNATURE") + private String emailSignature; + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/HubService.java b/src/main/java/net/gepafin/tendermanagement/service/HubService.java index 397bc533..ad763419 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/HubService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/HubService.java @@ -15,4 +15,5 @@ public interface HubService { void deleteHub(Long hubId); HubEntity getHubByUuid(String hubUuid); HubResponseBean getHubByHubUuid(String uuid); + HubEntity valdateHub(Long hubId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/SystemEmailTemplatesService.java b/src/main/java/net/gepafin/tendermanagement/service/SystemEmailTemplatesService.java index b40dc80f..5d50893f 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/SystemEmailTemplatesService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/SystemEmailTemplatesService.java @@ -2,12 +2,12 @@ package net.gepafin.tendermanagement.service; import java.util.Locale; -import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; import net.gepafin.tendermanagement.model.response.SystemEmailTemplateResponse; public interface SystemEmailTemplatesService { - SystemEmailTemplateResponse retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum type, CallEntity call, Locale language); + SystemEmailTemplateResponse retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum type, HubEntity hub, Locale language); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java index 513a89e4..3490a0e6 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java @@ -56,4 +56,8 @@ public class HubServiceImpl implements HubService { public HubResponseBean getHubByHubUuid(String uuid) { return hubDao.getHubByHubUuid(uuid); } + @Override + public HubEntity valdateHub(Long hubId) { + return hubDao.validateHub(hubId); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailTemplatesServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailTemplatesServiceImpl.java index 802f2580..34885c5b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailTemplatesServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailTemplatesServiceImpl.java @@ -6,7 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import net.gepafin.tendermanagement.dao.SystemEmailTemplatesDao; -import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; import net.gepafin.tendermanagement.model.response.SystemEmailTemplateResponse; import net.gepafin.tendermanagement.service.SystemEmailTemplatesService; @@ -19,8 +19,8 @@ public class SystemEmailTemplatesServiceImpl implements SystemEmailTemplatesServ @Override - public SystemEmailTemplateResponse retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum type, CallEntity call, Locale language) { - return systemEmailTemplatesDao.retrieveTemplate(type, call, language); + public SystemEmailTemplateResponse retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum type, HubEntity hub, Locale language) { + return systemEmailTemplatesDao.retrieveTemplate(type, hub, language); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a870b853..51a9199a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -61,4 +61,5 @@ apiKey=xkeysib-d15439fedd7ff36d86676ac248153fc2c496ed9b879ca9dc8cee9a27fa309087- #senderEmail=mailer@bflows.net application.amendment.expiration.days=30 +default.email.signature=Gepafin S.p.a 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 683246e4..251314c8 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 @@ -1652,6 +1652,28 @@ + + + + + + + + + + + + + + + UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs' + + + + UNIQUE_UUID = 't7jh5wfg9QXylNaTZkPoE' + + diff --git a/src/main/resources/db/dump/updated_system_email_template_for_application_submition_30-10-2024.sql b/src/main/resources/db/dump/updated_system_email_template_for_application_submition_30-10-2024.sql new file mode 100644 index 00000000..035a64cf --- /dev/null +++ b/src/main/resources/db/dump/updated_system_email_template_for_application_submition_30-10-2024.sql @@ -0,0 +1,37 @@ +UPDATE gepafin_schema.system_email_template SET html_content=' + +
+

Buongiorno,

+

+ Si comunica che, in riferimento alla domanda di concessione di + Finanziamento agevolato a valere sul Fondo prestiti + {{call_name}} di cui all''oggetto, la stessa è stata + regolarmente acquisita ed è stata registrata con Protocollo n. + {{protocol_number}} del {{date}} alle + {{time}}. +

+

Distinti Saluti,

+

+ {{email_signature}} +

+
+ +' WHERE "type"='APPLICATION_SUBMISSION_TO_USER_AND_COMPANY' AND "system"=true ; + + +UPDATE gepafin_schema.system_email_template SET html_content=' + +
+

+ In riferimento alla domanda di concessione di Finanziamento agevolato a valere sul Fondo prestiti + {{call_name}} di cui all’oggetto, la stessa è stata regolarmente acquisita ed è stata + registrata con Protocollo n. {{protocol_number}} del {{date}} alle {{time}}. +

+

Distinti Saluti,

+

+ {{email_signature}} +

+
+ +' WHERE "type"='APPLICATION_SUBMISSION_TO_GEPAFIN' AND "system"=true; + From ab6452308f259570631848287a384ce6ed9dae3a Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 30 Oct 2024 16:47:36 +0530 Subject: [PATCH 40/76] Updated cofe for logo --- .../gepafin/tendermanagement/dao/PdfDao.java | 22 +++++++++++++++++-- .../tendermanagement/entities/HubEntity.java | 3 +++ src/main/resources/application.properties | 4 +++- .../db/changelog/db.changelog-1.0.0.xml | 14 +++++++++++- 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 6a2c2b8c..7fe594f3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -13,6 +13,7 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.model.request.FieldLabelValuePairRequest; import net.gepafin.tendermanagement.model.response.*; +import net.gepafin.tendermanagement.repositories.HubRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.PdfUtils; import net.gepafin.tendermanagement.util.Utils; @@ -21,6 +22,7 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; //import com.itextpdf.layout.element. @@ -29,11 +31,13 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.*; import java.util.List; -import java.util.stream.Collectors; @Component public class PdfDao { + @Value("${default.hub.pdf.banner}") + private String defaultLogoUrl; + @Autowired private CallService callService; @@ -43,6 +47,9 @@ public class PdfDao { @Autowired private Validator validator; + @Autowired + private HubRepository hubRepository; + public static final Logger log = LoggerFactory.getLogger(PdfDao.class); public byte[] generatePdf(HttpServletRequest request,Long applicationId) { @@ -61,9 +68,20 @@ public class PdfDao { // CustomPageEvent pageEvent = new CustomPageEvent(call.getName(), 0); // writer.setPageEvent(pageEvent); document.open(); + String logoUrl=defaultLogoUrl; + + Optional hubEntity=hubRepository.findById(applicationEntity.getHubId()); + if(hubEntity.isPresent()) { + if (hubEntity.get().getUniqueUuid().equals("p4lk3bcx1RStqTaIVVbXs")) { + defaultLogoUrl = hubEntity.get().getPdfBanner(); + } + if (hubEntity.get().getUniqueUuid().equals("t7jh5wfg9QXylNaTZkPoE")) { + defaultLogoUrl = hubEntity.get().getPdfBanner(); + } + } // pageEvent.setTotalPages(writer.getPageNumber()); // addLogo(document, "logo.jpg"); // Add your image path here the migration code after cherry-pick - addLogo(document, "https://mementoresources.s3.eu-west-1.amazonaws.com/gepafin/logo.jpg"); + addLogo(document, logoUrl); BaseColor customColor = new BaseColor(0, 128, 0); // Adjust RGB values as needed diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java index 1b03f913..032776f8 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java @@ -42,4 +42,7 @@ public class HubEntity extends BaseEntity{ @Column(name = "UNIQUE_UUID") private String uniqueUuid; + + @Column(name="PDF_BANNER") + private String pdfBanner; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a971dc04..7fbed30a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,7 +4,7 @@ spring.application.name=tendermanagement spring.servlet.multipart.max-file-size=300MB spring.servlet.multipart.max-request-size=300MB -spring.profiles.active=local +spring.profiles.active=testing # JPA Configuration @@ -62,3 +62,5 @@ apiKey=xkeysib-d15439fedd7ff36d86676ac248153fc2c496ed9b879ca9dc8cee9a27fa309087- application.amendment.expiration.days=30 +default.hub.pdf.banner=https://mementoresources.s3.amazonaws.com/gepafin/staging/template/gepafin-logo.jpg + 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 683246e4..1a5ee904 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 @@ -1652,7 +1652,19 @@ - + + + + + + + UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs' + + + + UNIQUE_UUID = 't7jh5wfg9QXylNaTZkPoE' + + From 51e4b7a08ca2b8afc8843ee956eb0334c883a422 Mon Sep 17 00:00:00 2001 From: piyuskag Date: Wed, 30 Oct 2024 17:39:42 +0530 Subject: [PATCH 41/76] Email integration with PEC and MAILGUN services using api call. --- .../constants/GepafinConstant.java | 2 + .../tendermanagement/dao/ApplicationDao.java | 19 +- .../dao/ApplicationEvaluationDao.java | 2 +- .../dao/EmailNotificationDao.java | 203 ++++++++++-------- .../tendermanagement/entities/HubEntity.java | 5 + .../entities/SystemEmailTemplatesEntity.java | 2 +- .../model/request/EmailConfig.java | 18 ++ .../model/request/PecEmailRequest.java | 15 ++ .../scheduler/NotificationScheduler.java | 2 +- .../feignClient/MailgunFeignClient.java | 24 +++ .../service/feignClient/PecFeignClient.java | 17 ++ .../service/impl/EmailService.java | 11 + .../service/impl/EmailServiceFactory.java | 24 +++ .../service/impl/MailgunEmailService.java | 33 +++ .../service/impl/PecEmailService.java | 42 ++++ .../gepafin/tendermanagement/util/Utils.java | 48 +++++ src/main/resources/application.properties | 1 + .../db/changelog/db.changelog-1.0.0.xml | 16 +- ...late_for_notification_mail_31_10_2024.sql} | 22 +- 19 files changed, 394 insertions(+), 112 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/EmailConfig.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/PecEmailRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/EmailService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/EmailServiceFactory.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java rename src/main/resources/db/dump/{insert_system_email_template_for_notification_mail_27_10_2024.sql => insert_system_email_template_for_notification_mail_31_10_2024.sql} (88%) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 57555c3f..23b14cf0 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -288,5 +288,7 @@ public class GepafinConstant { 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"; + public static final String ENCRYPT_INIT_VECTOR = "IG8*(*@&)*#biVVD"; + public static final String ENCRYPT_KEY = "U2VjdXJlRW5jcnlwdEtleQ=="; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index f8334632..71d08f08 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -131,6 +131,8 @@ public class ApplicationDao { @Autowired private HubService hubService; + @Autowired + private EmailNotificationDao emailNotificationDao; public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { FormEntity formEntity = formService.validateForm(formId); @@ -728,9 +730,8 @@ public class ApplicationDao { 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); - + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email)); + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(applicationEntity.getCompany().getEmail())); } private void sendMailTodefaultSystemAndGepafin(UserEntity userEntity, ApplicationEntity applicationEntity) { @@ -759,12 +760,16 @@ public class ApplicationDao { String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); - mailUtil.sendByMailGun(subject, body, List.of(defaultSystemReceiverEmail), null); - mailUtil.sendByMailGun(subject, body, List.of(gepafinEmail), null); - mailUtil.sendByMailGun(subject, body, List.of(rinaldoEmail), null); +// mailUtil.sendByMailGun(subject, body, List.of(defaultSystemReceiverEmail), null); +// mailUtil.sendByMailGun(subject, body, List.of(gepafinEmail), null); +// mailUtil.sendByMailGun(subject, body, List.of(rinaldoEmail), null); if(validator.isProductionProfileActivated()) { - mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null); +// mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null); + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(carloEmail)); } + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(gepafinEmail)); + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(defaultSystemReceiverEmail)); + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(rinaldoEmail)); } public ApplicationSignedDocumentResponse uploadSignedDocument(HttpServletRequest request, Long applicationId, diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 729f2e17..cd1654bb 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -896,7 +896,7 @@ public class ApplicationEvaluationDao { entity = applicationEvaluationRepository.save(existingEntity); assignedApplicationsRepository.save(assignedApplicationsEntity); - ApplicationAmendmentRequestEntity amendmentRequest = applicationAmendmentRequestRepository.findByApplicationEvaluationIdAndIsDeletedFalse(existingEntity.getId()); + ApplicationAmendmentRequestEntity amendmentRequest = applicationAmendmentRequestRepository.findByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.APPROVED.getValue())))) { emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(amendmentRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 75b5dbf6..f75e5796 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -1,22 +1,33 @@ package net.gepafin.tendermanagement.dao; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.EmailConfig; import net.gepafin.tendermanagement.model.response.SystemEmailTemplateResponse; +import net.gepafin.tendermanagement.repositories.CallRepository; +import net.gepafin.tendermanagement.repositories.HubRepository; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.HubService; import net.gepafin.tendermanagement.service.SystemEmailTemplatesService; import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.service.impl.EmailService; +import net.gepafin.tendermanagement.service.impl.EmailServiceFactory; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.MailUtil; import net.gepafin.tendermanagement.util.Utils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -24,6 +35,8 @@ import java.util.Map; @Component public class EmailNotificationDao { + private static final Logger log = LoggerFactory.getLogger(EmailNotificationDao.class); + @Autowired private MailUtil mailUtil; @@ -39,126 +52,140 @@ public class EmailNotificationDao { @Autowired private HubService hubService; - public void sendMailToNotifyBeneficiaryRegardingNewAmendment(ApplicationAmendmentRequestEntity applicationAmendmentRequest) { + @Autowired + EmailServiceFactory emailServiceFactory; - ApplicationEntity applicationEntity = applicationService.validateApplication(applicationAmendmentRequest.getApplicationId()); - HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); - SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( - SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, hub, null); + @Autowired + HubRepository hubRepository; - // Create the map for subject placeholders + + private void sendEmail(ApplicationAmendmentRequestEntity amendmentRequest, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum templateType, + Map bodyPlaceholders, List additionalRecipients) { + + ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); + HubEntity hubEntity = hubService.valdateHub(applicationEntity.getHubId()); + String service = determineService(applicationEntity.getHubId()); + String legalMail = service.equals("Gepafin S.p.a.") ? "bandi.gepafin@legalmail.it" : "bandi.sviluppumbria@legalmail.it"; + + SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall(templateType, hubEntity, null); Map subjectPlaceholders = new HashMap<>(); subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); - - // Create the map for body placeholders - Map bodyPlaceholders = new HashMap<>(); - bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); - bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatLocalDateTime(applicationAmendmentRequest.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY)); - bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationAmendmentRequest.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); - bodyPlaceholders.put("{{form_dataInput}}", ""); - - // Replace placeholders in the subject and body + bodyPlaceholders.put("{{legal_mail}}", legalMail); String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); - mailUtil.sendByMailGun(subject, body, List.of(userEntity.getBeneficiary().getEmail()), null); + List recipientEmails = new ArrayList<>(); + if (applicationEntity.getCompany().getEmail() != null) { + recipientEmails.add(applicationEntity.getCompany().getEmail()); + } + if (userEntity.getBeneficiary().getEmail() != null) { + recipientEmails.add(userEntity.getBeneficiary().getEmail()); + } + if (additionalRecipients != null) { + recipientEmails.addAll(additionalRecipients); + } + sendMail(applicationEntity.getHubId(), subject, body, recipientEmails); + } + + private String determineService(Long hubId) { + + HubEntity hub = hubRepository.findById(hubId).orElseThrow(() -> new IllegalArgumentException("Invalid Hub ID: " + hubId)); + return hub.getEmailServiceType().equalsIgnoreCase("MAILGUN_SERVICE") ? "Gepafin S.p.a." : "Sviluppumbria"; + } + + public void sendMailToNotifyBeneficiaryRegardingNewAmendment(ApplicationAmendmentRequestEntity applicationAmendmentRequest) { + + ApplicationEntity applicationEntity = applicationService.validateApplication(applicationAmendmentRequest.getApplicationId()); + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + bodyPlaceholders.put("{{protocol_number}}", applicationAmendmentRequest.getProtocol().getProtocolNumber().toString()); + bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatLocalDateTime(applicationAmendmentRequest.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY)); + bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationAmendmentRequest.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); + String formFieldsJson = applicationAmendmentRequest.getFormFields(); + ObjectMapper objectMapper = new ObjectMapper(); + + try { + List> formFields = objectMapper.readValue(formFieldsJson, new TypeReference>>() { + }); + //• + StringBuilder bulletPoints = new StringBuilder(); + for (Map field : formFields) { + String label = (String) field.get("label"); + boolean selected = (boolean) field.get("selected"); + if (!selected) { + bulletPoints.append("• ").append(label).append("\n"); + } + } + bodyPlaceholders.put("{{form_dataInput}}", bulletPoints.toString()); + } catch (Exception e) { + log.error("Failed to parse form fields JSON: ", e); + } + bodyPlaceholders.put("{{note}}", applicationAmendmentRequest.getNote()); + sendEmail(applicationAmendmentRequest, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, bodyPlaceholders, null); } public void sendApplicationFailureNotificationEmail(ApplicationAmendmentRequestEntity amendmentRequest) { ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); - HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); - SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( - SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, hub, null); - - // Create the map for subject placeholders - Map subjectPlaceholders = new HashMap<>(); - subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); - - // Create the map for body placeholders Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); bodyPlaceholders.put("{{date_time_emailSend}}", DateTimeUtil.formatLocalDateTime(amendmentRequest.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); - UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); - if (userEntity.getBeneficiary().getEmail() != null) { - mailUtil.sendByMailGun(subject, body, List.of(userEntity.getBeneficiary().getEmail()), null); - } + sendEmail(amendmentRequest, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, bodyPlaceholders, null); } public void sendAdmissibilityNotificationEmailForApprovedApplication(ApplicationAmendmentRequestEntity amendmentRequest) { ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); - HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); - SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( - SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, hub, null); - - // Create the map for subject placeholders - Map subjectPlaceholders = new HashMap<>(); - subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); - - // Create the map for body placeholders Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); - bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); - bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); + bodyPlaceholders.put("{{protocol_number}}", amendmentRequest.getProtocol().getProtocolNumber().toString()); + bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(amendmentRequest.getProtocol().getCreatedDate())); + bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(amendmentRequest.getProtocol().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); - - UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); - String userEmail; - String companyEmail; - if (userEntity.getBeneficiary().getEmail() != null && applicationEntity.getCompany().getEmail() != null) { - userEmail = userEntity.getBeneficiary().getEmail(); - companyEmail = applicationEntity.getCompany().getEmail(); - mailUtil.sendByMailGun(subject, body, List.of(userEmail), null); - mailUtil.sendByMailGun(subject, body, List.of(companyEmail), null); - } + sendEmail(amendmentRequest, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, bodyPlaceholders, null); } public void sendInadmissibilityEmailForRejectedApplication(ApplicationAmendmentRequestEntity amendmentRequest) { ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); - HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); - SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( - SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, hub, null); - - // Create the map for subject placeholders - Map subjectPlaceholders = new HashMap<>(); - subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); - - // Create the map for body placeholders Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); - bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); - bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); - bodyPlaceholders.put("{{form_text}}", ""); + bodyPlaceholders.put("{{protocol_number}}", amendmentRequest.getProtocol().getProtocolNumber().toString()); + bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(amendmentRequest.getProtocol().getCreatedDate())); + bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(amendmentRequest.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); + bodyPlaceholders.put("{{form_text}}", amendmentRequest.getNote()); - // Replace placeholders in the subject and body - String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); - String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); - - UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); - String userEmail; - String companyEmail; - if (userEntity.getBeneficiary().getEmail() != null && applicationEntity.getCompany().getEmail() != null) { - userEmail = userEntity.getBeneficiary().getEmail(); - companyEmail = applicationEntity.getCompany().getEmail(); - mailUtil.sendByMailGun(subject, body, List.of(userEmail), null); - mailUtil.sendByMailGun(subject, body, List.of(companyEmail), null); - } + sendEmail(amendmentRequest, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, bodyPlaceholders, null); } -} + public void sendMail(Long hubId, String subject, String body, List recipientEmails) { + + EmailConfig emailConfig = retrieveEmailConfig(hubId); + EmailService emailService = emailServiceFactory.getEmailService(emailConfig.getEmailServiceType()); + emailService.sendEmail(subject, body, recipientEmails, emailConfig); + } + + public EmailConfig retrieveEmailConfig(Long hubId) { + + HubEntity hubEntity = hubRepository.findById(hubId).orElseThrow(() -> new IllegalArgumentException("Invalid Hub ID: " + hubId)); + String emailServiceType = hubEntity.getEmailServiceType(); + String encryptedConfigJson = hubEntity.getEmailServiceConfig(); + String decryptedConfigJson = Utils.decryptCredential(encryptedConfigJson); + EmailConfig emailConfig = parseEmailConfig(decryptedConfigJson); + emailConfig.setEmailServiceType(emailServiceType); + return emailConfig; + } + + private EmailConfig parseEmailConfig(String configJson) { + + ObjectMapper objectMapper = new ObjectMapper(); + try { + return objectMapper.readValue(configJson, EmailConfig.class); + } catch (JsonProcessingException e) { + throw new IllegalArgumentException("Failed to parse email configuration JSON", e); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java index 9de3f31d..2e219acf 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java @@ -49,4 +49,9 @@ public class HubEntity extends BaseEntity{ @Column(name = "EMAIL_SIGNATURE") private String emailSignature; + @Column(name = "EMAIL_SERVICE_TYPE") + private String emailServiceType; + + @Column(name = "EMAIL_SERVICE_CONFIG") + private String emailServiceConfig; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java index 29e33277..6d8ff6de 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java @@ -43,7 +43,7 @@ public class SystemEmailTemplatesEntity extends BaseEntity { 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"); + INADMISSIBILITY_TEMPLATE("INADMISSIBILITY_NOTIFICATION"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EmailConfig.java b/src/main/java/net/gepafin/tendermanagement/model/request/EmailConfig.java new file mode 100644 index 00000000..5a94b325 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EmailConfig.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class EmailConfig { + private String emailServiceType; + private String authToken; + private String apiKey; + private String username; + private String password; + private String sender; + private String domain; + private String mailgunApiUrl; + private String pecApiUrl; +} + + diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/PecEmailRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/PecEmailRequest.java new file mode 100644 index 00000000..a066dce0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/PecEmailRequest.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +import java.util.List; + +@Data +public class PecEmailRequest { + private String sender; + private List recipient; + private String subject; + private String body; + private String username; + private String password; +} diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java index f83af795..5fcb3bc2 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java @@ -29,7 +29,7 @@ public class NotificationScheduler { @Autowired EmailNotificationDao emailNotificationDao; - @Scheduled(cron = "0 0/1 * * * ?") +// @Scheduled(cron = "0 0/1 * * * ?") void sendNotificationForRejectedApplicationToBeneficiary() { List applicationsList = applicationRepository.findByIsDeletedFalse(); diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java new file mode 100644 index 00000000..eb9c50d1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/MailgunFeignClient.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.service.feignClient; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@FeignClient(name = "mailgunClient", url = "${mailGun_base_url}") +public interface MailgunFeignClient { + @PostMapping("/v3/{domain}/messages") + ResponseEntity sendEmail( + @PathVariable("domain") String domain, + @RequestParam("from") String from, + @RequestParam("to") List to, + @RequestParam("subject") String subject, + @RequestParam("html") String htmlBody, + @RequestHeader("Authorization") String authorizationHeader); +} + + diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java new file mode 100644 index 00000000..d251e644 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/PecFeignClient.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.service.feignClient; + +import feign.Headers; +import net.gepafin.tendermanagement.model.request.PecEmailRequest; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; + +@FeignClient(name = "pecClient", url = "${api.pecUrl}") +public interface PecFeignClient { + @PostMapping("/send") + ResponseEntity sendEmail(@RequestHeader("Authorization") String token, + @RequestBody PecEmailRequest emailRequest); +} + diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/EmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/EmailService.java new file mode 100644 index 00000000..6b7b91cc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/EmailService.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.service.impl; + +import net.gepafin.tendermanagement.model.request.EmailConfig; + +import java.util.List; + +public interface EmailService { + void sendEmail(String subject, String body, List recipientEmails, EmailConfig emailConfig); +} + + diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/EmailServiceFactory.java b/src/main/java/net/gepafin/tendermanagement/service/impl/EmailServiceFactory.java new file mode 100644 index 00000000..6ab6b270 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/EmailServiceFactory.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class EmailServiceFactory { + + @Autowired + private PecEmailService pecEmailService; + + @Autowired + private MailgunEmailService mailgunEmailService; + + public EmailService getEmailService(String serviceType) { + if ("MAILGUN_SERVICE".equals(serviceType)) { + return mailgunEmailService; + } else if ("PEC_SERVICE".equals(serviceType)) { + return pecEmailService; + } else { + throw new IllegalArgumentException("Invalid email service type: " + serviceType); + } + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java new file mode 100644 index 00000000..9dd965e7 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java @@ -0,0 +1,33 @@ +package net.gepafin.tendermanagement.service.impl; + +import net.gepafin.tendermanagement.model.request.EmailConfig; +import net.gepafin.tendermanagement.service.feignClient.MailgunFeignClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.util.Base64; +import java.util.List; + +@Service +public class MailgunEmailService implements EmailService { + + @Autowired + private MailgunFeignClient mailgunFeignClient; + + @Override + public void sendEmail(String subject, String body, List recipientEmails, EmailConfig emailConfig) { + String domain = emailConfig.getDomain(); + String from = emailConfig.getSender(); + String apiKey = emailConfig.getApiKey(); + String authHeader = "Basic " + Base64.getEncoder().encodeToString(("api:" + apiKey).getBytes()); + + // Send email via Mailgun API + ResponseEntity response = mailgunFeignClient.sendEmail(domain, from, recipientEmails, subject, body, authHeader); + if (!response.getStatusCode().is2xxSuccessful()) { + throw new RuntimeException("Failed to send email via Mailgun: " + response.getStatusCode()); + } + } +} + + diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java new file mode 100644 index 00000000..f2cdc613 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java @@ -0,0 +1,42 @@ +package net.gepafin.tendermanagement.service.impl; + +import lombok.extern.slf4j.Slf4j; +import net.gepafin.tendermanagement.model.request.EmailConfig; +import net.gepafin.tendermanagement.model.request.PecEmailRequest; +import net.gepafin.tendermanagement.service.feignClient.PecFeignClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Slf4j +@Service +public class PecEmailService implements EmailService { + private final PecFeignClient pecFeignClient; + + public PecEmailService(PecFeignClient pecFeignClient) { + + this.pecFeignClient = pecFeignClient; + } + + @Override + public void sendEmail(String subject, String body, List recipientEmails, EmailConfig emailConfig) { + PecEmailRequest emailRequest = new PecEmailRequest(); + emailRequest.setSender(emailConfig.getSender()); + emailRequest.setRecipient(recipientEmails); + emailRequest.setSubject(subject); + emailRequest.setBody(body); + emailRequest.setUsername(emailConfig.getUsername()); + emailRequest.setPassword(emailConfig.getPassword()); + + String authToken = emailConfig.getAuthToken(); + ResponseEntity response = pecFeignClient.sendEmail("Bearer " + authToken, emailRequest); + log.info("Mail response status: {}, headers: {}, body: {}", response.getStatusCode(), response.getHeaders(), response.getBody()); + if (!response.getStatusCode().is2xxSuccessful()) { + throw new RuntimeException("Failed to send email via PEC: " + response.getStatusCode()); + } + } +} + + diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 3bd7041e..26f049ef 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -20,6 +20,7 @@ import java.util.stream.Collectors; import com.itextpdf.styledxmlparser.jsoup.Jsoup; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.constants.GepafinConstant; import org.apache.commons.collections4.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,6 +41,10 @@ import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientNotFoundExcep import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientUnauthorizedException; import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientValidationException; +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + import static org.apache.commons.lang3.StringUtils.isEmpty; @@ -467,4 +472,47 @@ public class Utils { return sanitizedInput.matches(wholeNumberPattern); } + + public static String encryptCredential(String value) { + try { + if(Boolean.FALSE.equals(isEmpty(value))) { + + IvParameterSpec iv = new IvParameterSpec(GepafinConstant.ENCRYPT_INIT_VECTOR.getBytes("UTF-8")); + SecretKeySpec skeySpec = new SecretKeySpec(Base64.getDecoder().decode(GepafinConstant.ENCRYPT_KEY), "AES"); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); + + byte[] encrypted = cipher.doFinal(value.getBytes()); + + return Base64.getEncoder().encodeToString(encrypted); + } + + } catch (Exception ex) { + log.error("Exception occured while encrypt credential :- {0}", ex); + } + return null; + } + + public static String decryptCredential(String encrypted) { + try { + if(Boolean.FALSE.equals(isEmpty(encrypted))) { + + IvParameterSpec iv = new IvParameterSpec(GepafinConstant.ENCRYPT_INIT_VECTOR.getBytes("UTF-8")); + SecretKeySpec skeySpec = new SecretKeySpec(Base64.getDecoder().decode(GepafinConstant.ENCRYPT_KEY), "AES"); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); + + cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); + + byte[] original = cipher.doFinal(Base64.getDecoder().decode(encrypted)); + + return new String(original); + } + } catch (Exception ex) { + // log.error("Exception occured while decrypt credential :- {0}", ex); + return encrypted; + } + return null; + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6ead5502..d6198fd7 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -58,6 +58,7 @@ mailGun_domainName=paghiamoci.ai mailGun_base_url=https://api.eu.mailgun.net/ # SendinBlue API key apiKey=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 +api.pecUrl=https://ws.pecmassiva.com #senderEmail=mailer@bflows.net application.amendment.expiration.days=30 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 551833a0..4156ccf4 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 @@ -1627,11 +1627,6 @@ constraintName="fk_communication_application_amendment_request"/> - - - - @@ -1689,5 +1684,16 @@ + + + + + + + + + + diff --git a/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_27_10_2024.sql b/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_31_10_2024.sql similarity index 88% rename from src/main/resources/db/dump/insert_system_email_template_for_notification_mail_27_10_2024.sql rename to src/main/resources/db/dump/insert_system_email_template_for_notification_mail_31_10_2024.sql index 360bdd30..d42b1b40 100644 --- a/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_27_10_2024.sql +++ b/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_31_10_2024.sql @@ -20,14 +20,15 @@ VALUES
  • {{form_dataInput}}
+

{{note}}

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, + online {{platform_link}} che inviandola a mezzo PEC all’indirizzo + {{legal_mail}} 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.

+

{{email_signature}}

', @@ -38,6 +39,7 @@ VALUES '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", @@ -57,9 +59,9 @@ VALUES 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.

+ {{platform_link}} entro 10 giorni dalla ricezione di questa comunicazione.

Distinti Saluti,

-

Gepafin S.p.a.

+

{{email_signature}}

', @@ -70,6 +72,7 @@ VALUES '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", @@ -89,7 +92,7 @@ VALUES è 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.

+

{{email_signature}}

', @@ -100,6 +103,7 @@ VALUES '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", @@ -119,9 +123,9 @@ VALUES 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.

+ {{platform_link}} entro 10 giorni dalla ricezione di questa comunicazione.

Distinti Saluti,

-

Gepafin S.p.a.

+

{{email_signature}}

', @@ -131,4 +135,4 @@ VALUES false, '2024-10-26 20:00:00', '2024-10-26 20:00:00' -); +); \ No newline at end of file From f227a64ee7294c860f960c41cf32f72d3ac856cb Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 30 Oct 2024 18:18:24 +0530 Subject: [PATCH 42/76] updated liquibase changes --- ...plate_for_notification_mail_31_10_2024.sql | 92 ++++--------------- 1 file changed, 16 insertions(+), 76 deletions(-) diff --git a/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_31_10_2024.sql b/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_31_10_2024.sql index d42b1b40..fbb2c1c1 100644 --- a/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_31_10_2024.sql +++ b/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_31_10_2024.sql @@ -1,14 +1,5 @@ -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', - ' +UPDATE gepafin_schema.system_email_template +SET html_content = '

RICHIESTA INTEGRAZIONE DOCUMENTALE

@@ -31,26 +22,11 @@ VALUES

{{email_signature}}

- ', - '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' -); + ' +WHERE "type" = 'DOCUMENTATION_INTEGRATION_REQUEST' AND "system" = true; -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_DUE_TO_FAILURE', - ' +UPDATE gepafin_schema.system_email_template +SET html_content = '

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

@@ -64,26 +40,11 @@ VALUES

{{email_signature}}

- ', - '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' -); + ' +WHERE "type" = 'INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE' AND "system" = true; -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', - ' +UPDATE gepafin_schema.system_email_template +SET html_content = '

Buongiorno,

@@ -95,26 +56,11 @@ VALUES

{{email_signature}}

- ', - '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' -); + ' +WHERE "type" = 'ADMISSIBILITY_NOTIFICATION' AND "system" = true; -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', - ' +UPDATE gepafin_schema.system_email_template +SET html_content = '

Buongiorno,

@@ -128,11 +74,5 @@ VALUES

{{email_signature}}

- ', - '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' -); \ No newline at end of file + ' +WHERE "type" = 'INADMISSIBILITY_NOTIFICATION' AND "system" = true; From 7610cc8bd664efb03ee41e616f4bd40802bc3d25 Mon Sep 17 00:00:00 2001 From: piyuskag Date: Wed, 30 Oct 2024 18:52:05 +0530 Subject: [PATCH 43/76] Updated cron. --- .../tendermanagement/scheduler/NotificationScheduler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java index 5fcb3bc2..f83af795 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java @@ -29,7 +29,7 @@ public class NotificationScheduler { @Autowired EmailNotificationDao emailNotificationDao; -// @Scheduled(cron = "0 0/1 * * * ?") + @Scheduled(cron = "0 0/1 * * * ?") void sendNotificationForRejectedApplicationToBeneficiary() { List applicationsList = applicationRepository.findByIsDeletedFalse(); From f23dafff283365e8ca9c8b3d4404c81a6497968e Mon Sep 17 00:00:00 2001 From: piyuskag Date: Wed, 30 Oct 2024 18:53:25 +0530 Subject: [PATCH 44/76] Updated cron. --- .../tendermanagement/scheduler/NotificationScheduler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java index f83af795..aed9d142 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java @@ -29,7 +29,7 @@ public class NotificationScheduler { @Autowired EmailNotificationDao emailNotificationDao; - @Scheduled(cron = "0 0/1 * * * ?") + @Scheduled(cron = "0 0 1 * * ?") void sendNotificationForRejectedApplicationToBeneficiary() { List applicationsList = applicationRepository.findByIsDeletedFalse(); From 7f0f447c8c88d0c1460a3333fa5ee1f4716464a4 Mon Sep 17 00:00:00 2001 From: piyuskag Date: Wed, 30 Oct 2024 19:00:34 +0530 Subject: [PATCH 45/76] Updated code for updating status on auto rejection after given time and updated cron. --- .../scheduler/NotificationScheduler.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java index aed9d142..93d41c98 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java @@ -42,16 +42,12 @@ public class NotificationScheduler { if (amendmentRequest != null) { LocalDateTime requestDate = amendmentRequest.getCreatedDate(); - - // Eg :- Check if requestDate + 7 days is less than or equal to today if (requestDate.plusDays(amendmentRequest.getResponseDays()).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("CLOSE"); - // applicationAmendmentRepository.save(amendmentRequest); // Save updated amendment request + applicationRepository.save(application); + amendmentRequest.setStatus("CLOSE"); + applicationAmendmentRepository.save(amendmentRequest); emailNotificationDao.sendApplicationFailureNotificationEmail(amendmentRequest); } } From eeb8bbc7e2de53f3e28c6c9507d75c9d78d1d223 Mon Sep 17 00:00:00 2001 From: piyuskag Date: Thu, 31 Oct 2024 14:03:55 +0530 Subject: [PATCH 46/76] Updated code. --- .../db/changelog/db.changelog-1.0.0.xml | 79 ++++++++++--------- ..._for_email_service_config_31_10_2024_1.sql | 9 +++ 2 files changed, 52 insertions(+), 36 deletions(-) create mode 100644 src/main/resources/db/dump/update_hub_data_for_email_service_config_31_10_2024_1.sql 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 4156ccf4..caeae0ed 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 @@ -1647,42 +1647,6 @@ - - - - - - - UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs' - - - - UNIQUE_UUID = 't7jh5wfg9QXylNaTZkPoE' - - - - - - - - - - - - - - - - - UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs' - - - - UNIQUE_UUID = 't7jh5wfg9QXylNaTZkPoE' - - - @@ -1696,4 +1660,47 @@ path="db/dump/insert_system_email_template_for_notification_mail_31_10_2024.sql"/> + + + + + + + UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs' + + + + UNIQUE_UUID = 't7jh5wfg9QXylNaTZkPoE' + + + + + + + + + + + + + + + + + + + + + UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs' + + + + UNIQUE_UUID = 't7jh5wfg9QXylNaTZkPoE' + + + diff --git a/src/main/resources/db/dump/update_hub_data_for_email_service_config_31_10_2024_1.sql b/src/main/resources/db/dump/update_hub_data_for_email_service_config_31_10_2024_1.sql new file mode 100644 index 00000000..e5a8da72 --- /dev/null +++ b/src/main/resources/db/dump/update_hub_data_for_email_service_config_31_10_2024_1.sql @@ -0,0 +1,9 @@ +UPDATE hub +SET email_service_type = 'PEC_SERVICE', + email_service_config = 'JkFbBfuVvq7VWwp5LcWIi+hAa1RJ1ekI0jq3w7gLTXETZiTaN8zC4OBWD53x8FtbfFTh3L/5805CIYTH1BQGa3X9q16q9SDzMy7DKHdmJzOnLKhn74C5akoXKaeXUCGnzp0cSk2c01FV6lwefC29IshijFSumCHtVlgWNeZigBx51GL2Coh8nF1Mu7/KIcny' +WHERE UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs'; + +UPDATE hub +SET email_service_type = 'MAILGUN_SERVICE', + email_service_config = 'mhyP0kKQCrsbhGv3PGx4yob4dPSNBOd2xFnAPkikJE7VHkydklfUSVWAdYjhXwOz8rglH2YYEC/xGZdrEgSnkS9Ed56/qzmaU1667GGf+kc5mciOiECW5/sVmhtbVClEnu1FGZMzlsJSqYKlTmqfCYD0lTAlak1Lu2n030tj6nhMDvUxP9CbeTwkzALMtmgt' +WHERE UNIQUE_UUID = 't7jh5wfg9QXylNaTZkPoE'; \ No newline at end of file From c0bd9bb928ead7e5c644782dbb1727e1d808a2a9 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 31 Oct 2024 14:16:26 +0530 Subject: [PATCH 47/76] Reminder mail to beneficiary --- .../constants/GepafinConstant.java | 4 +- .../dao/ApplicationAmendmentRequestDao.java | 65 +++++++++++++++++++ .../entities/SystemEmailTemplatesEntity.java | 1 + .../ApplicationAmendmentRequestService.java | 2 +- ...pplicationAmendmentRequestServiceImpl.java | 24 +++++++ .../api/ApplicationAmendmentRequestApi.java | 15 +++++ ...ApplicationAmendmentRequestController.java | 12 ++++ .../db/changelog/db.changelog-1.0.0.xml | 9 +++ ...mail_template_for_sollecito_30_10_2024.sql | 29 +++++++++ src/main/resources/message_en.properties | 2 + src/main/resources/message_it.properties | 2 + 11 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/db/dump/insert_system_email_template_for_sollecito_30_10_2024.sql diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 23b14cf0..3a160d09 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -259,7 +259,7 @@ public class GepafinConstant { public static final String EVALUATIONCRITERIA_INVALID = "evaluationCriteria.invalid"; 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 BENEFICIARY_EMAIL_NOT_FOUND_MSG = "beneficiary.email.not.found.msg"; public static final String ADDED_S3_PATH_STRUCTURE ="added.s3.path.structure"; public static final String S3_PATH_STRUCTURE_BY_TYPE ="fetched.s3.path.structure.by.type.successfully"; public static final String S3_PATH_STRUCTURE_NOT_FOUND_BY_TYPE_MSG ="s3.path.not.found.by.type"; @@ -287,7 +287,7 @@ public class GepafinConstant { 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"; - + public static final String REMINDER_EMAIL_SENT_SUCCESS_MSG = "reminder.email.sent.success.msg"; public static final String ENCRYPT_INIT_VECTOR = "IG8*(*@&)*#biVVD"; public static final String ENCRYPT_KEY = "U2VjdXJlRW5jcnlwdEtleQ=="; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index b5d36dac..1f39459b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -18,9 +18,14 @@ import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBea import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; import net.gepafin.tendermanagement.model.response.AmendmentFormFieldResponse; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; +import net.gepafin.tendermanagement.model.response.SystemEmailTemplateResponse; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.*; import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; +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.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; @@ -83,6 +88,13 @@ public class ApplicationAmendmentRequestDao { @Autowired private AssignedApplicationsRepository assignedApplicationsRepository; + @Autowired + private SystemEmailTemplatesService systemEmailTemplatesService; + + @Autowired + private HubService hubService; +// @Autowired +// private MailUtil mailUtil; public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(HttpServletRequest request, Long applicationEvaluationId) { log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); @@ -481,4 +493,57 @@ public class ApplicationAmendmentRequestDao { log.info("Amendment status updated successfully: {}", response); return response; } + public void sendReminderEmail(Long amendmentId) { + ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(amendmentId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); + + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(amendment.getApplicationEvaluationEntity().getId()); + if (entityOptional.isPresent()) { + ApplicationEntity applicationEntity = applicationService.validateApplication(entityOptional.get().getApplicationId()); + UserEntity beneficiaryUser = userService.validateUser(applicationEntity.getUserId()); + HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); + SystemEmailTemplateResponse emailTemplate = systemEmailTemplatesService + .retrieveTemplateByTypeAndCall(SystemEmailTemplatesEntityTypeEnum.AMENDMENT_REMINDER, hub, null); + String subject = prepareSubject(emailTemplate, amendment, beneficiaryUser); + String body = prepareBody(emailTemplate, amendment, beneficiaryUser); + String email = beneficiaryUser.getEmail(); + if (Boolean.TRUE.equals(amendment.getIsEmail())&&email != null && !email.isEmpty()) { + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email)); +// mailUtil.sendByMailGun(subject,body,List.of("harish.bagora1@gmail.com"),null); + } else { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.BENEFICIARY_EMAIL_NOT_FOUND_MSG)); + } + } + } + + private String prepareSubject(SystemEmailTemplateResponse template, ApplicationAmendmentRequestEntity amendment, UserEntity beneficiary) { + Map subjectPlaceholders = new HashMap<>(); + String firstName = beneficiary.getFirstName() != null ? beneficiary.getFirstName() : ""; + String lastName = beneficiary.getLastName() != null ? beneficiary.getLastName() : ""; + String beneficiaryName = String.join(" ", firstName, lastName).trim(); + + subjectPlaceholders.put("{{amendment_id}}", amendment.getId().toString()); + subjectPlaceholders.put("{{beneficiary_name}}", beneficiaryName); + + return Utils.replacePlaceholders(template.getSubject(), subjectPlaceholders); + } + + private String prepareBody(SystemEmailTemplateResponse template, ApplicationAmendmentRequestEntity amendment, UserEntity beneficiary) { + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{amendment_id}}", amendment.getId().toString()); + + if (amendment.getStartDate() != null && amendment.getResponseDays() != null) { + + LocalDateTime dueDate = amendment.getStartDate().plusDays(amendment.getResponseDays()); + bodyPlaceholders.put("{{amendment_due_date}}", DateTimeUtil.formatLocalDateTime(dueDate, GepafinConstant.DD_MM_YYYY)); + } else { + + bodyPlaceholders.put("{{amendment_due_date}}", "Not available"); + } + + return Utils.replacePlaceholders(template.getHtmlContent(), bodyPlaceholders); + } + + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java index 6d8ff6de..1440e00d 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java @@ -43,6 +43,7 @@ public class SystemEmailTemplatesEntity extends BaseEntity { DOCUMENTATION_INTEGRATION_REQUEST("DOCUMENTATION_INTEGRATION_REQUEST"), INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE("INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE"), ADMISSIBILITY_NOTIFICATION("ADMISSIBILITY_NOTIFICATION"), + AMENDMENT_REMINDER("AMENDMENT_REMINDER"), INADMISSIBILITY_TEMPLATE("INADMISSIBILITY_NOTIFICATION"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java index 318e48c1..a6112bf0 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java @@ -25,5 +25,5 @@ public interface ApplicationAmendmentRequestService { public ApplicationAmendmentRequestResponse getAmendmentByApplicationId(HttpServletRequest request,Long applicationId); public ApplicationAmendmentRequestResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationAmendmentRequestEnum status); - + void sendReminderEmail(HttpServletRequest request,Long amendmentId); } 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 d8a93d36..2d45bddd 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.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.ApplicationAmendmentRequestDao; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; @@ -10,12 +13,17 @@ import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; +import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; +import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; import net.gepafin.tendermanagement.util.Validator; +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 java.util.List; +import java.util.Optional; @Service public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendmentRequestService { @@ -25,6 +33,10 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm @Autowired private ApplicationAmendmentRequestDao applicationAmendmentRequestDao; + @Autowired + private ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository; + @Autowired + private ApplicationEvaluationRepository applicationEvaluationRepository; @Override public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(HttpServletRequest request, Long applicationEvaluationId) { @@ -88,5 +100,17 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm return applicationAmendmentRequestDao.updateApplicationAmendmentStatus(applicationId, status); } + @Override + public void sendReminderEmail(HttpServletRequest request,Long amendmentId) { + ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(amendmentId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(amendment.getApplicationEvaluationEntity().getId()); + if (entityOptional.isPresent()) { + UserEntity user = validator.validatePreInstructor(request, entityOptional.get().getUserId()); + + applicationAmendmentRequestDao.sendReminderEmail(amendmentId); + } + } } 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 2438eae6..42977539 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 @@ -171,4 +171,19 @@ public interface ApplicationAmendmentRequestApi { @Parameter(description = "The application amendment id", required = true) @PathVariable("applicationAmendmentId") Long applicationAmendmentId, @Parameter(description = "status", required = true)@RequestParam(value = "status", required = true) ApplicationAmendmentRequestEnum status); + @Operation(summary = "Send reminder email for the specified amendment", + responses = { + @ApiResponse(responseCode = "200", description = "Email sent successfully"), + @ApiResponse(responseCode = "404", description = "Amendment 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) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) + }) + @PostMapping(value = "sendReminderEmail/{amendmentId}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> sendReminderEmail(HttpServletRequest request, + @Parameter( required = true) + @PathVariable(value = "amendmentId") Long amendmentId); + } 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 de74ac06..9a75fe23 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 @@ -117,4 +117,16 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_STATUS_UPDATED_SUCCESSFULLY))); } + @Override + public ResponseEntity> sendReminderEmail( + HttpServletRequest request, + Long amendmentId) { + + log.info("Sending reminder email for Amendment ID: {}", amendmentId); + applicationAmendmentRequestService.sendReminderEmail(request,amendmentId); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.REMINDER_EMAIL_SENT_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 4156ccf4..5eb2f8b6 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 @@ -1695,5 +1695,14 @@ + + select + setval('gepafin_schema.system_email_template_id_seq', (select + max(id)+1 + from gepafin_schema.system_email_template), false) + + + diff --git a/src/main/resources/db/dump/insert_system_email_template_for_sollecito_30_10_2024.sql b/src/main/resources/db/dump/insert_system_email_template_for_sollecito_30_10_2024.sql new file mode 100644 index 00000000..435cf965 --- /dev/null +++ b/src/main/resources/db/dump/insert_system_email_template_for_sollecito_30_10_2024.sql @@ -0,0 +1,29 @@ +-- SQL Dump to insert system email template for amendment reminder email with calculated due date +INSERT INTO gepafin_schema.system_email_template +(template_name, "type", html_content, subject, "json", "system", is_deleted, created_date, updated_date) +VALUES +( + 'Amendment Reminder Email', + 'AMENDMENT_REMINDER', + ' + +
+

PROMEMORIA PER LA PRESENTAZIONE DELL''EMENDAMENTO

+

Buongiorno,

+

Questo è un promemoria per completare la presentazione dell''emendamento entro il termine specificato. Di seguito i dettagli:

+
    +
  • Amendment ID: {{amendment_id}}
  • +
  • Data di Scadenza: {{amendment_due_date}}
  • +
+

Si prega di assicurarsi che l''emendamento venga presentato entro la data di scadenza per evitare ritardi. Inviare l''emendamento tramite la piattaforma online {{platform_link}}

+

Distinti saluti,

+

{{email_signature}}

+
+ + ', + 'Reminder: Pending Amendment Submission - ID {{amendment_id}}', + NULL, + true, + false, +CURRENT_TIMESTAMP, + CURRENT_TIMESTAMP); diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 2d547b8c..220d4654 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -101,6 +101,7 @@ success.password.changed=Password changed successfully. logout.successful.msg=Logout successful. You have been logged out successfully. #Update user Active or Deactive status update.user.status.success=User status has been successfully updated. +beneficiary.email.not.found.msg=The email address for the beneficiary could not be found. Please ensure that the beneficiary has a valid email address. #Form-field-related messages @@ -295,6 +296,7 @@ application.amendment.get.success = Application Amendment details fetched succes application.amendment.update.successfully = Application Amendment Updated Successfully. application.amendment.closed.successfully = Application Amendment Closed Successfully. response.days.extended.success=Response days extended successfully. +reminder.email.sent.success.msg=Reminder email sent successfully! added.comment.to.amendment.request.success = Application Amendment Comment Added Successfully. comment.not.found = Comment Not Found. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 544ff70b..ea702497 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -299,3 +299,5 @@ amendment.found.success = Richiesta di emendamento trovata con successo. invalid.amendment.for.comment = Richiesta di emendamento non valida per il commento fornito. DD_MM_YYYY_HH_MM = dd_MM_yyyy HH:mm create.application.data.amendment.msg =Emendamento alla domanda inviato con successo +beneficiary.email.not.found.msg=L'indirizzo email per il beneficiario non è stato trovato. Si prega di assicurarsi che il beneficiario abbia un indirizzo email valido. +reminder.email.sent.success.msg=Email di promemoria inviata con successo! From 838905cbc270d7d1a125531e82d2bf35aff48de1 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 31 Oct 2024 15:00:31 +0530 Subject: [PATCH 48/76] Updated code --- .../tendermanagement/dao/ApplicationAmendmentRequestDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 1f39459b..63ecc6c7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -510,7 +510,7 @@ public class ApplicationAmendmentRequestDao { String email = beneficiaryUser.getEmail(); if (Boolean.TRUE.equals(amendment.getIsEmail())&&email != null && !email.isEmpty()) { emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email)); -// mailUtil.sendByMailGun(subject,body,List.of("harish.bagora1@gmail.com"),null); +// mailUtil.sendByMailGun(subject,body,List.of(email),null); } else { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.BENEFICIARY_EMAIL_NOT_FOUND_MSG)); } From 18236132282c50d48b418710961c0ac720095911 Mon Sep 17 00:00:00 2001 From: piyuskag Date: Mon, 4 Nov 2024 13:56:19 +0530 Subject: [PATCH 49/76] Fixed application count issue on admin dashboard. --- .../repositories/ApplicationRepository.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 158c43fd..38d73e8d 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -29,15 +29,15 @@ public interface ApplicationRepository extends JpaRepository findByIdAndUserIdAndCallIdAndIsDeletedFalse(Long applicationId, Long userId, Long callId); - @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.userId = :userId AND a.company.id = :companyId AND a.status = 'SUBMIT' ") + @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.userId = :userId AND a.company.id = :companyId AND a.status = 'SUBMIT' AND a.isDeleted = false") Long countSubmittedApplicationsByUserId(@Param("userId") Long userId, @Param("companyId") Long companyId); List findByCompanyIdAndUserIdAndIsDeletedFalse(Long companyId,Long userId); - @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.status = 'SUBMIT' And a.hubId = :hubId") + @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.status = 'SUBMIT' And a.hubId = :hubId AND a.isDeleted = false") public Long countSubmittedApplicationsByHubId(@Param("hubId") Long hubId); - @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.status = 'DRAFT' And a.hubId = :hubId") + @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.status = 'DRAFT' And a.hubId = :hubId AND a.isDeleted = false") public Long countDraftApplicationsByHubId(@Param("hubId") Long hubId); @Query("SELECT a.call.id FROM ApplicationEntity a WHERE a.id = :id") From 4ebb7705ff765063d0787d7730e4f3c85d9beea0 Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 4 Nov 2024 16:56:21 +0530 Subject: [PATCH 50/76] Rename 'updatedFormFields' to 'applicationFormFields' in request and also fix the bug --- .../dao/ApplicationAmendmentRequestDao.java | 74 ++++++++++++++----- .../ApplicationAmendmentRequestBean.java | 2 +- ...pplicationAmendmentRequestServiceImpl.java | 3 +- 3 files changed, 57 insertions(+), 22 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index b5d36dac..921990a7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -21,6 +21,8 @@ import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestRe import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.*; import net.gepafin.tendermanagement.util.DateTimeUtil; +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; @@ -28,7 +30,6 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; -import java.time.ZoneId; import java.time.temporal.ChronoUnit; @@ -84,6 +85,9 @@ public class ApplicationAmendmentRequestDao { @Autowired private AssignedApplicationsRepository assignedApplicationsRepository; + @Autowired + private Validator validator; + public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(HttpServletRequest request, Long applicationEvaluationId) { log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); @@ -326,7 +330,14 @@ public class ApplicationAmendmentRequestDao { return response; } - public List getAllApplicationAmendmentRequest(Long userId) { + public List getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId) { + UserEntity user = validator.validateUser(request); + if(validator.checkIsPreInstructor() && userId == null) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.USER_ID_NOT_NULL_MSG)); + } + if(userId != null) { + validator.validatePreInstructor(request, userId); + } Specification spec = search(userId); List applicationAmendmentRequestEntities = applicationAmendmentRequestRepository.findAll(spec); @@ -357,8 +368,8 @@ public class ApplicationAmendmentRequestDao { ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); setIfUpdated(existingApplicationAmendment::getNote, existingApplicationAmendment::setNote, updateRequest.getNote()); - if (updateRequest.getUpdatedFormFields() != null) { - updateApplicationFormFields(existingApplicationAmendment, updateRequest.getUpdatedFormFields()); + if (updateRequest.getApplicationFormFields() != null) { + updateApplicationFormFields(existingApplicationAmendment, updateRequest.getApplicationFormFields()); } existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); @@ -368,27 +379,52 @@ public class ApplicationAmendmentRequestDao { return response; } - private void updateApplicationFormFields(ApplicationAmendmentRequestEntity applicationAmendment, ApplicationFormFieldRequestBean updatedFormField) { + if (updatedFormField.getFieldValue() == null || "".equals(updatedFormField.getFieldValue().toString().trim())) { + List applicationForms = applicationFormRepository.findByApplicationId(applicationAmendment.getApplicationId()); + + boolean fieldUpdated = false; + + for (ApplicationFormEntity applicationForm : applicationForms) { + Optional formFieldEntityOptional = applicationFormFieldRepository + .findByApplicationFormIdAndFieldId(applicationForm.getId(), updatedFormField.getFieldId()); + + if (formFieldEntityOptional.isPresent()) { + ApplicationFormFieldEntity formEntity = formFieldEntityOptional.get(); + formEntity.setFieldValue(null); // Set field value to null + applicationFormFieldRepository.save(formEntity); + log.info("Set field value to null for application ID {} and field ID {}", applicationAmendment.getApplicationId(), updatedFormField.getFieldId()); + fieldUpdated = true; + break; + } + } + + if (!fieldUpdated) { + throw new CustomValidationException(Status.NOT_FOUND, "No ApplicationFormField found for application ID " + applicationAmendment.getApplicationId() + " and field ID " + updatedFormField.getFieldId()); + } + return; + } + List documentIds; - // Check if fieldValue is an array - if (updatedFormField.getFieldValue() instanceof List) { - documentIds = ((List) updatedFormField.getFieldValue()).stream() - .map(Object::toString) - .collect(Collectors.toList()); + if (updatedFormField.getFieldValue() instanceof String && updatedFormField.getFieldValue() != null) { + documentIds = Arrays.asList(((String) updatedFormField.getFieldValue()).split(",")); } else { - log.warn("Expected fieldValue as a list but got: {}", updatedFormField.getFieldValue()); + log.warn("Expected fieldValue as a comma-separated String but got: {}", updatedFormField.getFieldValue()); return; } List validDocumentIds = new ArrayList<>(); for (String documentId : documentIds) { - 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); + try { + DocumentEntity documentEntity = documentService.validateDocument(Long.parseLong(documentId.trim())); + if (documentEntity != null) { + validDocumentIds.add(documentId.trim()); + } else { + log.warn("Document with ID {} does not exist. Skipping this ID.", documentId); + } + } catch (NumberFormatException e) { + log.error("Invalid document ID format: {}. Error: {}", documentId, e.getMessage()); } } @@ -413,8 +449,7 @@ public class ApplicationAmendmentRequestDao { } if (!fieldUpdated) { - log.warn("No ApplicationFormFieldEntity found for application ID {} and field ID {}. Skipping update.", - applicationAmendment.getApplicationId(), updatedFormField.getFieldId()); + throw new CustomValidationException(Status.NOT_FOUND,"No ApplicationFormField found for application ID {} and field ID {}. Skipping update."); } } else { log.warn("No valid document IDs found for update. Skipping field ID {}", updatedFormField.getFieldId()); @@ -422,8 +457,9 @@ public class ApplicationAmendmentRequestDao { } - public List getAllAmendmentRequestByBeneficiaryId(Long beneficiaryId) { + public List getAllAmendmentRequestByBeneficiaryId(Long beneficiaryId) { + UserEntity userEntity = userService.validateUser(beneficiaryId); List entities = applicationAmendmentRequestRepository.findByUserId(beneficiaryId); diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java index b845fe0e..c3c5aeb5 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java @@ -5,5 +5,5 @@ import lombok.Data; @Data public class ApplicationAmendmentRequestBean { private String note; - private ApplicationFormFieldRequestBean updatedFormFields; + private ApplicationFormFieldRequestBean applicationFormFields; } 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 d8a93d36..d00f244a 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -5,7 +5,6 @@ import net.gepafin.tendermanagement.dao.ApplicationAmendmentRequestDao; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; -import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; import net.gepafin.tendermanagement.model.request.CloseAmendmentRequest; @@ -50,7 +49,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm @Override public List getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId) { - return applicationAmendmentRequestDao.getAllApplicationAmendmentRequest(userId); + return applicationAmendmentRequestDao.getAllApplicationAmendmentRequest(request,userId); } @Override From 84d2d778b56a38743dd57fb7467dddad9c0f985e Mon Sep 17 00:00:00 2001 From: piyuskag Date: Mon, 4 Nov 2024 17:21:06 +0530 Subject: [PATCH 51/76] Updated Code. --- .../db/changelog/db.changelog-1.0.0.xml | 9 +- ...plate_for_notification_mail_31_10_2024.sql | 95 +++++++++++++++---- ...ate_for_notification_mail_04_11_2024_1.sql | 78 +++++++++++++++ 3 files changed, 164 insertions(+), 18 deletions(-) create mode 100644 src/main/resources/db/dump/update_system_email_template_for_notification_mail_04_11_2024_1.sql 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 52a0910f..37b87d81 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 @@ -1702,7 +1702,7 @@ UNIQUE_UUID = 't7jh5wfg9QXylNaTZkPoE' - + select setval('gepafin_schema.system_email_template_id_seq', (select max(id)+1 @@ -1710,5 +1710,10 @@ - + + + + + diff --git a/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_31_10_2024.sql b/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_31_10_2024.sql index fbb2c1c1..83cfc6c3 100644 --- a/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_31_10_2024.sql +++ b/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_31_10_2024.sql @@ -1,5 +1,14 @@ -UPDATE gepafin_schema.system_email_template -SET html_content = ' +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

@@ -22,11 +31,27 @@ SET html_content = '

{{email_signature}}

- ' -WHERE "type" = 'DOCUMENTATION_INTEGRATION_REQUEST' AND "system" = true; + ', + 'RICHIESTA INTEGRAZIONE DOCUMENTALE - {{call_name}}', + NULL, + true, + false, + '2024-10-26 20:00:00', + '2024-10-26 20:00:00' +); -UPDATE gepafin_schema.system_email_template -SET html_content = ' +-- Insert for INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE +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_DUE_TO_FAILURE', + '

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

@@ -40,11 +65,27 @@ SET html_content = '

{{email_signature}}

- ' -WHERE "type" = 'INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE' AND "system" = true; + ', + 'BANDO {{call_name}} - Domanda di finanziamento non ammessa {{company_name}}', + NULL, + true, + false, + '2024-10-26 20:00:00', + '2024-10-26 20:00:00' +); -UPDATE gepafin_schema.system_email_template -SET html_content = ' +-- Insert for ADMISSIBILITY_NOTIFICATION +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,

@@ -56,11 +97,27 @@ SET html_content = '

{{email_signature}}

- ' -WHERE "type" = 'ADMISSIBILITY_NOTIFICATION' AND "system" = true; + ', + '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' +); -UPDATE gepafin_schema.system_email_template -SET html_content = ' +-- Insert for INADMISSIBILITY_NOTIFICATION +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,

@@ -74,5 +131,11 @@ SET html_content = '

{{email_signature}}

- ' -WHERE "type" = 'INADMISSIBILITY_NOTIFICATION' AND "system" = true; + ', + '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' +); \ No newline at end of file diff --git a/src/main/resources/db/dump/update_system_email_template_for_notification_mail_04_11_2024_1.sql b/src/main/resources/db/dump/update_system_email_template_for_notification_mail_04_11_2024_1.sql new file mode 100644 index 00000000..fbb2c1c1 --- /dev/null +++ b/src/main/resources/db/dump/update_system_email_template_for_notification_mail_04_11_2024_1.sql @@ -0,0 +1,78 @@ +UPDATE gepafin_schema.system_email_template +SET html_content = ' + +
+

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}}
  • +
+

{{note}}

+

Vi invitiamo a fornire quanto sopra richiesto integrando la documentazione sia caricandola all’interno dello sportello + online {{platform_link}} che inviandola a mezzo PEC all’indirizzo + {{legal_mail}} 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,

+

{{email_signature}}

+
+ + ' +WHERE "type" = 'DOCUMENTATION_INTEGRATION_REQUEST' AND "system" = true; + +UPDATE gepafin_schema.system_email_template +SET html_content = ' + +
+

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 + {{platform_link}} entro 10 giorni dalla ricezione di questa comunicazione.

+

Distinti Saluti,

+

{{email_signature}}

+
+ + ' +WHERE "type" = 'INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE' AND "system" = true; + +UPDATE gepafin_schema.system_email_template +SET html_content = ' + +
+

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,

+

{{email_signature}}

+
+ + ' +WHERE "type" = 'ADMISSIBILITY_NOTIFICATION' AND "system" = true; + +UPDATE gepafin_schema.system_email_template +SET html_content = ' + +
+

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 + {{platform_link}} entro 10 giorni dalla ricezione di questa comunicazione.

+

Distinti Saluti,

+

{{email_signature}}

+
+ + ' +WHERE "type" = 'INADMISSIBILITY_NOTIFICATION' AND "system" = true; From f51379bd4dfe9dc38d12fa402681f9258841035a Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 5 Nov 2024 12:15:06 +0530 Subject: [PATCH 52/76] Updated code for reminder endpoint --- .../tendermanagement/dao/ApplicationAmendmentRequestDao.java | 4 +++- .../web/rest/api/ApplicationAmendmentRequestApi.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 63ecc6c7..0652edaf 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -508,8 +508,10 @@ public class ApplicationAmendmentRequestDao { String subject = prepareSubject(emailTemplate, amendment, beneficiaryUser); String body = prepareBody(emailTemplate, amendment, beneficiaryUser); String email = beneficiaryUser.getEmail(); - if (Boolean.TRUE.equals(amendment.getIsEmail())&&email != null && !email.isEmpty()) { + String companyEmail = applicationEntity.getCompany().getEmail(); + if (Boolean.TRUE.equals(amendment.getIsEmail())&&email != null && !email.isEmpty() && companyEmail != null && !companyEmail.isEmpty()) { emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email)); + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(companyEmail)); // mailUtil.sendByMailGun(subject,body,List.of(email),null); } else { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.BENEFICIARY_EMAIL_NOT_FOUND_MSG)); 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 42977539..10c3128b 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 @@ -181,7 +181,7 @@ public interface ApplicationAmendmentRequestApi { @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) }) - @PostMapping(value = "sendReminderEmail/{amendmentId}", produces = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = "/{amendmentId}/reminder", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> sendReminderEmail(HttpServletRequest request, @Parameter( required = true) @PathVariable(value = "amendmentId") Long amendmentId); From 8ad0de32d44d80e235860db6d7e7b17859086edd Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 5 Nov 2024 15:03:02 +0530 Subject: [PATCH 53/76] Updated code for adding list of document --- .../gepafin/tendermanagement/dao/PdfDao.java | 46 +++++++++++++++---- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 7fe594f3..550bd240 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -31,6 +31,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.*; import java.util.List; +import java.util.stream.Collectors; @Component public class PdfDao { @@ -476,7 +477,7 @@ public class PdfDao { String contentId = content.getId(); // Content ID String label = content.getLabel(); // Content label String name = content.getName(); // Content name - Object fieldValue = null; + Object fieldValue = ""; String contentLabel = content.getSettings().stream() .filter(setting -> "label".equals(setting.getName())) // Filter settings by name @@ -485,6 +486,32 @@ public class PdfDao { .findFirst() // Get the first matching value .orElse(null); // If no match is found, set label to null // Find the form field in the response that matches the contentId + if (name.equals("paragraph")){ + String paragraph = content.getSettings().stream() + .filter(setting -> "text".equals(setting.getName())) // Filter settings by name + .map(SettingResponseBean::getValue) // Extract the value from the matching setting + .map(Object::toString) // Convert the value to a string + .findFirst() // Get the first matching value + .orElse(null); + Paragraph labelParagraph = new Paragraph(); + PdfPCell labelCell = new PdfPCell(PdfUtils.htmlToPdfPCell(paragraph,labelFont)); + labelCell.setBorder(Rectangle.NO_BORDER); + labelCell.setGrayFill(7); + labelCell.setPadding(5); + + // Create a PdfPTable with 1 column and add the PdfPCell to it + PdfPTable table = new PdfPTable(1); + table.setWidthPercentage(100); + table.addCell(labelCell); + labelParagraph.add(table); + try { + document.add(labelParagraph); + document.add(new Paragraph(" ")); + + } catch (DocumentException e) { + throw new RuntimeException(e); + } + } Optional matchingFormField = formFields.stream() .filter(formField -> formField.getFieldId().equals(contentId)) .findFirst(); @@ -501,7 +528,13 @@ public class PdfDao { // Process 'fileupload' and 'checkboxes' cases as in the original logic if (name.equals("fileupload")) { - continue; + if (fieldValue instanceof List && ((List) fieldValue).stream().allMatch(item -> item instanceof DocumentResponseBean)) { + List documentList = (List) fieldValue; + List names = documentList.stream() + .map(DocumentResponseBean::getName) + .collect(Collectors.toList()); + fieldValue = names; + } } else if (name.equals("checkboxes") && fieldValue instanceof List) { List check = (List) fieldValue; List settingResponseBeans = content.getSettings(); @@ -529,15 +562,12 @@ public class PdfDao { // Further processing of field value (e.g., finding labels in options) fieldValue = findLabelInOptions(content.getSettings(), fieldValue); - } else { - // If no matching form field is found, store contentId with an empty string - fieldValue = ""; } - try { - if((contentLabel!=null && Boolean.FALSE.equals(contentLabel.isEmpty())) || (fieldValue!=null && !StringUtils.isEmpty((CharSequence) fieldValue))) { - addLabelValuePair(writer, document, contentLabel, fieldValue, labelFont, valueFont, content); + if((contentLabel==null || StringUtils.isEmpty(contentLabel)) && (fieldValue==null || StringUtils.isEmpty(fieldValue.toString()))) { + continue; } + addLabelValuePair(writer, document, contentLabel, fieldValue, labelFont, valueFont, content); } catch (DocumentException e) { log.error("Error checking object: " + e.getMessage(), e); From 472237246c0cd241600fa2ab053c0bc609c40a0f Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 5 Nov 2024 18:47:43 +0530 Subject: [PATCH 54/76] Added validation in amendment and change email content --- .../dao/ApplicationAmendmentRequestDao.java | 3 +- .../dao/ApplicationEvaluationDao.java | 3 +- .../dao/EmailNotificationDao.java | 10 ++- ...pplicationAmendmentRequestServiceImpl.java | 67 ++++++++++++++++--- .../db/changelog/db.changelog-1.0.0.xml | 4 ++ ...ate_for_notification_mail_05_11_2024_4.sql | 16 +++++ 6 files changed, 87 insertions(+), 16 deletions(-) create mode 100644 src/main/resources/db/dump/update_system_email_template_for_notification_mail_05_11_2024_4.sql diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 03ebcbd6..4af092dc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -98,7 +98,7 @@ public class ApplicationAmendmentRequestDao { @Autowired private Validator validator; - public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(HttpServletRequest request, Long applicationEvaluationId) { + public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(Long applicationEvaluationId) { log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); Long applicationId = applicationEvaluationEntity.getApplicationId(); @@ -341,7 +341,6 @@ public class ApplicationAmendmentRequestDao { } public List getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId) { - UserEntity user = validator.validateUser(request); if(validator.checkIsPreInstructor() && userId == null) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.USER_ID_NOT_NULL_MSG)); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index cd1654bb..75e6bcc4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -897,12 +897,13 @@ public class ApplicationEvaluationDao { assignedApplicationsRepository.save(assignedApplicationsEntity); ApplicationAmendmentRequestEntity amendmentRequest = applicationAmendmentRequestRepository.findByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); + if(amendmentRequest!=null){ if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.APPROVED.getValue())))) { emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(amendmentRequest); } if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.REJECTED.getValue())))) { emailNotificationDao.sendInadmissibilityEmailForRejectedApplication(amendmentRequest); - } + }} return convertToResponse(entity); } return null; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index f75e5796..43f3b4e4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -77,9 +77,15 @@ public class EmailNotificationDao { UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); List recipientEmails = new ArrayList<>(); - if (applicationEntity.getCompany().getEmail() != null) { - recipientEmails.add(applicationEntity.getCompany().getEmail()); + String companyEmail = applicationEntity.getCompany().getEmail(); + String contactEmail = applicationEntity.getCompany().getContactEmail(); + if (companyEmail != null && !companyEmail.isEmpty()) { + recipientEmails.add(companyEmail); } + if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { + recipientEmails.add(contactEmail); + } + if (userEntity.getBeneficiary().getEmail() != null) { recipientEmails.add(userEntity.getBeneficiary().getEmail()); } 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 4d212377..fa059d57 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -39,60 +39,105 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm @Override public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(HttpServletRequest request, Long applicationEvaluationId) { - UserEntity user= validator.validateUser(request); - return applicationAmendmentRequestDao.getApplicationDataForAmendment(request,applicationEvaluationId); + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(applicationEvaluationId); + entityOptional.ifPresent(applicationEvaluationEntity -> validator.validatePreInstructor(request, applicationEvaluationEntity.getUserId())); + return applicationAmendmentRequestDao.getApplicationDataForAmendment(applicationEvaluationId); } @Override public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(HttpServletRequest request, Long applicationEvaluationId , ApplicationAmendmentRequest applicationAmendmentRequest) { - UserEntity user= validator.validateUser(request); + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(applicationEvaluationId); + entityOptional.ifPresent(applicationEvaluationEntity -> validator.validatePreInstructor(request, applicationEvaluationEntity.getUserId())); return applicationAmendmentRequestDao.createApplicationAmendmentRequest(applicationEvaluationId,applicationAmendmentRequest); } @Override public void deleteApplicationAmendmentRequest(HttpServletRequest request, Long id) { - applicationAmendmentRequestDao.deleteById(id); + ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); + + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(amendment.getApplicationEvaluationEntity().getId()); + if (entityOptional.isPresent()) { + UserEntity user = validator.validatePreInstructor(request, entityOptional.get().getUserId()); + + applicationAmendmentRequestDao.deleteById(id); + } } @Override public ApplicationAmendmentRequestResponse getApplicationAmendmentRequestById(HttpServletRequest request,Long id) { - return applicationAmendmentRequestDao.getApplicationAmendmentRequestById(id); + ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); + + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(amendment.getApplicationEvaluationEntity().getId()); + if (entityOptional.isPresent()) { + UserEntity user = validator.validatePreInstructor(request, entityOptional.get().getUserId()); + } + return applicationAmendmentRequestDao.getApplicationAmendmentRequestById(id); + } @Override public List getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId) { + UserEntity user = validator.validatePreInstructor(request, userId); return applicationAmendmentRequestDao.getAllApplicationAmendmentRequest(request,userId); } @Override public ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean) { - UserEntity updatedByUser= validator.validateUser(request); - return applicationAmendmentRequestDao.updateApplicationAmendment(id,applicationAmendmentRequestBean); + ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); + + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(amendment.getApplicationEvaluationEntity().getId()); + if (entityOptional.isPresent()) { + UserEntity user = validator.validatePreInstructor(request, entityOptional.get().getUserId()); + } + return applicationAmendmentRequestDao.updateApplicationAmendment(id,applicationAmendmentRequestBean); } @Override public ApplicationAmendmentRequestEntity validateApplicationAmendmentRequest(Long applicationAmendmentId) { + return applicationAmendmentRequestDao.validateApplicationAmendmentRequest(applicationAmendmentId); } @Override public List getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, Long beneficiaryId) { + UserEntity user= validator.validateUser(request); return applicationAmendmentRequestDao.getAllAmendmentRequestByBeneficiaryId(beneficiaryId); } @Override public ApplicationAmendmentRequestResponse closeAmendmentRequest(HttpServletRequest request, Long id, CloseAmendmentRequest closeAmendmentRequest) { - return applicationAmendmentRequestDao.closeAmendmentRequest(id,closeAmendmentRequest); + ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); + + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(amendment.getApplicationEvaluationEntity().getId()); + if (entityOptional.isPresent()) { + UserEntity user = validator.validatePreInstructor(request, entityOptional.get().getUserId()); + } + return applicationAmendmentRequestDao.closeAmendmentRequest(id,closeAmendmentRequest); } @Override public ApplicationAmendmentRequestResponse extendResponseDays(HttpServletRequest request, Long id, Long addedDays) { - return applicationAmendmentRequestDao.extendResponseDays(id, addedDays); + UserEntity user= validator.validateUser(request); + return applicationAmendmentRequestDao.extendResponseDays(id, addedDays); } public ApplicationAmendmentRequestResponse getAmendmentByApplicationId(HttpServletRequest request, Long applicationId) { - UserEntity user= validator.validateUser(request); - return applicationAmendmentRequestDao.getAmendmentByApplicationId(request,applicationId); + ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByApplicationIdAndIsDeletedFalse(applicationId); + if(amendment!=null) { + + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(amendment.getApplicationEvaluationEntity().getId()); + if (entityOptional.isPresent()) { + UserEntity user = validator.validatePreInstructor(request, entityOptional.get().getUserId()); + }} + return applicationAmendmentRequestDao.getAmendmentByApplicationId(request,applicationId); } @Override public ApplicationAmendmentRequestResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationAmendmentRequestEnum status) { 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 37b87d81..9aa2ec42 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 @@ -1716,4 +1716,8 @@ + + + diff --git a/src/main/resources/db/dump/update_system_email_template_for_notification_mail_05_11_2024_4.sql b/src/main/resources/db/dump/update_system_email_template_for_notification_mail_05_11_2024_4.sql new file mode 100644 index 00000000..1b43db33 --- /dev/null +++ b/src/main/resources/db/dump/update_system_email_template_for_notification_mail_05_11_2024_4.sql @@ -0,0 +1,16 @@ +UPDATE gepafin_schema.system_email_template +SET + subject = 'BANDO {{call_name}}- Domanda di concessione di finanziamento agevolato {{company_name}}', + html_content = ' + +
+

In riferimento alla domanda di concessione di Finanziamento agevolato a valere sul Fondo prestiti + {{call_name}} di cui all’oggetto, la stessa è stata regolarmente acquisita ed è stata + registrata con Protocollo n. {{protocol_number}} del {{protocol_date}} + alle {{protocol_time}}.

+

Distinti Saluti,

+

{{email_signature}}

+
+ + ' +WHERE "type" = 'DOCUMENTATION_INTEGRATION_REQUEST' AND "system" = true; From daef61f4c9c0b31ad39fb3de6bb9a32f55a7e812 Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 5 Nov 2024 19:50:49 +0530 Subject: [PATCH 55/76] Updated code --- .../tendermanagement/dao/ApplicationAmendmentRequestDao.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 4af092dc..9a369047 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -228,8 +228,6 @@ public class ApplicationAmendmentRequestDao { applicationEvaluationEntity.getAssignedApplicationsEntity().getApplication(), protocolNumber, userEntity.getHub().getId()); applicationAmendmentRequestEntity.setProtocol(protocolEntity); - applicationAmendmentRequestEntity.setIsEmail(false); - applicationAmendmentRequestEntity.setIsNotification(false); ApplicationAmendmentRequestEntity applicationAmendment = saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity); //Set Status From ed07c42787df8e373ad52a1833a3d8ed3e733e51 Mon Sep 17 00:00:00 2001 From: piyuskag Date: Tue, 5 Nov 2024 20:47:06 +0530 Subject: [PATCH 56/76] Added call_id property for file upload type validation specific to call_id. --- .../tendermanagement/dao/ApplicationDao.java | 16 +++++++++++++++- src/main/resources/application.properties | 2 ++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 71d08f08..8aca183b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -32,6 +32,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -110,6 +111,9 @@ public class ApplicationDao { @Value("${carlo_email}") private String carloEmail; + @Value("${call.id}") + private String callId; + @Autowired private AmazonS3Service amazonS3Service; @@ -776,7 +780,7 @@ public class ApplicationDao { MultipartFile file) { ApplicationEntity applicationEntity = validateApplication(applicationId); validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); - validateFileType(file); + validateFileTypeForCall(file, applicationEntity); ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); if (applicationSignedDocument != null) { @@ -796,6 +800,16 @@ public class ApplicationDao { applicationRepository.save(applicationEntity); return convertApplicationSignedDocumentToApplicationSignedDocumentResponse(applicationSignedDocument); } + + private void validateFileTypeForCall(MultipartFile file, ApplicationEntity applicationEntity) { + List validCallIds = Arrays.asList(callId.split(",")); + if (applicationEntity != null && validCallIds.contains(applicationEntity.getCall().getId().toString())) { + return; + } + validateFileType(file); + } + + private UploadFileOnAmazonS3Response uploadFileOnAmazonS3ForUserSignedDocument(MultipartFile file, Long callId, Long applicationId) { try { String s3Path = generateS3PathForDelegation(callId, applicationId); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d6198fd7..d2a1e3fb 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -23,6 +23,8 @@ spring.liquibase.enabled=true springdoc.api-docs.path=/v1/api-docs springdoc.swagger-ui.tagsSorter=alpha +#signed_document_callIds for more file type upload feature. +call.id=10 #aws configuration aws.access.key.id=AKIAVWDQWCUEOSUN4LUW From 82a879cf2db23245e9d00496bf01b737750fa330 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 6 Nov 2024 11:17:06 +0530 Subject: [PATCH 57/76] Fixed bug of login attempt --- .../dao/ApplicationAmendmentRequestDao.java | 5 +-- .../gepafin/tendermanagement/dao/UserDao.java | 20 +++++++---- .../ApplicationAmendmentRequestEnum.java | 2 +- .../ApplicationAmendmentRequestService.java | 2 +- ...pplicationAmendmentRequestServiceImpl.java | 4 +-- .../service/impl/AuthenticationService.java | 33 +++++++++++++++---- .../service/impl/UserServiceImpl.java | 2 +- ...ApplicationAmendmentRequestController.java | 6 ++-- 8 files changed, 52 insertions(+), 22 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 3c74fbf2..6524900b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -207,7 +207,7 @@ public class ApplicationAmendmentRequestDao { applicationAmendmentRequestEntity.setIsEmail(applicationAmendmentRequest.getIsSendEmail()); applicationAmendmentRequestEntity.setIsNotification(applicationAmendmentRequest.getIsSendNotification()); applicationAmendmentRequestEntity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - applicationAmendmentRequestEntity.setStatus(ApplicationAmendmentRequestEnum.AWATING.getValue()); + applicationAmendmentRequestEntity.setStatus(ApplicationAmendmentRequestEnum.AWAITING.getValue()); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); applicationAmendmentRequestEntity.setApplicationEvaluationEntity(applicationEvaluationEntity); @@ -519,8 +519,9 @@ public class ApplicationAmendmentRequestDao { log.info("Updating application amendement with status: {}", id); ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); - if(Boolean.TRUE.equals(existingApplicationAmendment.getStatus().equals(ApplicationAmendmentRequestEnum.AWATING.getValue())) && Boolean.TRUE.equals(statusTypeEnum.equals(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED))){ + if(Boolean.TRUE.equals(existingApplicationAmendment.getStatus().equals(ApplicationAmendmentRequestEnum.AWAITING.getValue())) && Boolean.TRUE.equals(statusTypeEnum.equals(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED))){ existingApplicationAmendment.setStatus(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED.getValue()); + existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); applicationAmendmentRequestRepository.save(existingApplicationAmendment); } ApplicationAmendmentRequestResponse response = convertEntityToResponse(existingApplicationAmendment); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 33f235a2..53d21fc5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -5,10 +5,7 @@ import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.config.SamlSuccessHandler; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.entities.BeneficiaryEntity; -import net.gepafin.tendermanagement.entities.HubEntity; -import net.gepafin.tendermanagement.entities.RoleEntity; -import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; @@ -80,6 +77,9 @@ public class UserDao { @Autowired private HubService hubService; + @Autowired + private AuthenticationService authenticationService; + public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) { if(StringUtils.isEmpty(userReq.getHubUuid())) { @@ -92,6 +92,14 @@ public class UserDao { BeneficiaryEntity beneficiary = createBeneficiary(roleEntity, userReq, hub); UserEntity userEntity = convertUserRequestToUserEntity(beneficiary, roleEntity, userReq, hub); log.info("User created with ID: {}", userEntity.getId()); + LoginReq loginReq=new LoginReq(); + loginReq.setEmail(userEntity.getEmail()); + if(userEntity!=null){ + LoginAttemptEntity loginAttemptEntity =authenticationService.prepareLoginAttemptEntity(loginReq, request); + log.info("Authentication failed for email: {}", loginReq.getEmail()); + loginAttemptEntity.setUserId(userEntity.getId()); + authenticationService.createSuccessLoginAttempt(loginAttemptEntity); + } return authService.getJWTTokenBean(userEntity, Boolean.TRUE); } @@ -403,8 +411,8 @@ public class UserDao { return userResponseBeans; } - public JWTToken validateExistingUserToken(String token) { - return authService.validateExistingUserToken(token); + public JWTToken validateExistingUserToken(HttpServletRequest request,String token) { + return authService.validateExistingUserToken(request,token); } public UserSamlResponse validateNewUserToken(String token) { diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationAmendmentRequestEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationAmendmentRequestEnum.java index 0552fdc0..d25ef71d 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationAmendmentRequestEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationAmendmentRequestEnum.java @@ -3,7 +3,7 @@ package net.gepafin.tendermanagement.enums; import com.fasterxml.jackson.annotation.JsonValue; public enum ApplicationAmendmentRequestEnum { - AWATING("AWATING"), + AWAITING("AWAITING"), RESPONSE_RECEIVED("RESPONSE_RECEIVED"), CLOSE("CLOSE"), EXPIRED("EXPIRED"); diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java index a6112bf0..2f536da7 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java @@ -23,7 +23,7 @@ public interface ApplicationAmendmentRequestService { ApplicationAmendmentRequestResponse closeAmendmentRequest(HttpServletRequest request, Long id, CloseAmendmentRequest closeAmendmentRequest); ApplicationAmendmentRequestResponse extendResponseDays(HttpServletRequest request, Long id, Long addedDays); public ApplicationAmendmentRequestResponse getAmendmentByApplicationId(HttpServletRequest request,Long applicationId); - public ApplicationAmendmentRequestResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationAmendmentRequestEnum status); + public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationAmendmentId, ApplicationAmendmentRequestEnum status); void sendReminderEmail(HttpServletRequest request,Long amendmentId); } 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 4d212377..64967da1 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -95,8 +95,8 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm return applicationAmendmentRequestDao.getAmendmentByApplicationId(request,applicationId); } @Override - public ApplicationAmendmentRequestResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationAmendmentRequestEnum status) { - return applicationAmendmentRequestDao.updateApplicationAmendmentStatus(applicationId, status); + public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationAmendmentId, ApplicationAmendmentRequestEnum status) { + return applicationAmendmentRequestDao.updateApplicationAmendmentStatus(applicationAmendmentId, status); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 5a2d9ded..ddd74035 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -79,6 +79,7 @@ public class AuthenticationService { UserEntity user=null; LoginAttemptEntity loginAttemptEntity = prepareLoginAttemptEntity(loginReq, request); + try { log.info("Attempting login for email: {}", loginReq.getEmail()); String emailWithHubId = loginReq.getEmail()+":"+loginReq.getHubUuid(); UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( @@ -94,11 +95,18 @@ public class AuthenticationService { throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); } + loginAttemptEntity.setUserId(user.getId()); createSuccessLoginAttempt(loginAttemptEntity); + } catch (Exception e) { + log.info("Authentication failed for email: {}", loginReq.getEmail()); + loginAttemptEntity.setUserId(user.getId()); + createFailedLoginAttempt(loginAttemptEntity, e.getMessage()); + throw e; + } return getJWTTokenBean(user, loginReq.getRememberMe()); } - private LoginAttemptEntity prepareLoginAttemptEntity(LoginReq loginUserReq, HttpServletRequest request) { + public LoginAttemptEntity prepareLoginAttemptEntity(LoginReq loginUserReq, HttpServletRequest request) { String ipAddress = Utils.getClientIpAddress(request); String userAgent = request.getHeader("user-agent"); LoginAttemptEntity loginAttemptEntity = new LoginAttemptEntity(); @@ -109,11 +117,11 @@ public class AuthenticationService { return loginAttemptEntity; } - private void createSuccessLoginAttempt(LoginAttemptEntity loginAttemptEntity) { + public void createSuccessLoginAttempt(LoginAttemptEntity loginAttemptEntity) { loginAttemptEntity.setResult(LoginAttemptResultEnum.SUCCESS.getValue()); loginAttemptDao.createLoginAttempt(loginAttemptEntity); } - private void createFailedLoginAttempt(LoginAttemptEntity loginAttemptEntity, String errorMsg) { + public void createFailedLoginAttempt(LoginAttemptEntity loginAttemptEntity, String errorMsg) { loginAttemptEntity.setResult(LoginAttemptResultEnum.FAILED.getValue()); loginAttemptEntity.setErrorMsg(errorMsg); loginAttemptDao.createLoginAttempt(loginAttemptEntity); @@ -184,13 +192,17 @@ public class AuthenticationService { SecurityContextHolder.clearContext(); } - public JWTToken validateExistingUserToken(String token) { + public JWTToken validateExistingUserToken(HttpServletRequest request,String token) { SamlResponseEntity samlResponseLogEntity = samlResponseLogRepository.findByToken(token); if (samlResponseLogEntity == null) { log.info("Invalid spid login token : {}", token); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); } + LoginReq loginReq=new LoginReq(); + Long userId=null; + LoginAttemptEntity loginAttemptEntity =new LoginAttemptEntity(); + try { HubEntity hub = hubService.getHubByUuid(samlResponseLogEntity.getHubUuid()); Map> userAttributes = Utils .convertStringIntoMap(samlResponseLogEntity.getAuthenticationObject()); @@ -198,9 +210,18 @@ public class AuthenticationService { UserEntity userEntity = userRepository.findByBeneficiaryCodiceFiscaleAndHubId(cf, hub.getId()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + userId=userEntity.getId(); //samlResponseLogRepository.delete(samlResponseLogEntity); - - return getJWTTokenBean(userEntity, Boolean.TRUE); + loginReq.setEmail(userEntity.getEmail()); + loginAttemptEntity = prepareLoginAttemptEntity(loginReq, request); + loginAttemptEntity.setUserId(userEntity.getId()); + return getJWTTokenBean(userEntity, Boolean.TRUE); + } catch (Exception e) { + log.info("Authentication login failed for email: {}",e.getMessage()); + loginAttemptEntity.setUserId(userId); + createFailedLoginAttempt(loginAttemptEntity, e.getMessage()); + throw e; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java index 5d3640f9..d0b8a716 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -103,7 +103,7 @@ public class UserServiceImpl implements UserService { @Override @Transactional(rollbackFor = Exception.class) public JWTToken validateExistingUserToken(HttpServletRequest request, String token) { - return userDao.validateExistingUserToken(token); + return userDao.validateExistingUserToken(request,token); } @Override public UserSamlResponse validateNewUserToken(HttpServletRequest request, String token) { 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 9a75fe23..1934ec5b 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 @@ -111,11 +111,11 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme .body(new Response<>(applicationAmendmentBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_DATA_FOR_AMENDMENT_SUCCESS_MSG))); } @Override - public ResponseEntity> updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationId, + public ResponseEntity> updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationAmendmentId, ApplicationAmendmentRequestEnum status) { - ApplicationAmendmentRequestResponse applicationResponse = applicationAmendmentRequestService.updateApplicationStatus(request, applicationId, status); + ApplicationAmendmentRequestResponse applicationResponse = applicationAmendmentRequestService.updateApplicationAmendmentStatus(request, applicationAmendmentId, status); return ResponseEntity.status(HttpStatus.OK) - .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_STATUS_UPDATED_SUCCESSFULLY))); + .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_UPDATE_SUCCESSFULLY_MSG))); } @Override public ResponseEntity> sendReminderEmail( From aba7785dcdedd6987a935b242e323e895698f976 Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 6 Nov 2024 12:02:57 +0530 Subject: [PATCH 58/76] Updated updateApplicationAmendment API functionality --- .../dao/ApplicationAmendmentRequestDao.java | 54 ++++++++++++++++--- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 3c74fbf2..7a67aa13 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -8,17 +8,12 @@ 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.ApplicationAmendmentRequestEnum; -import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; -import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; -import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; +import net.gepafin.tendermanagement.enums.*; 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.request.CloseAmendmentRequest; -import net.gepafin.tendermanagement.model.response.AmendmentFormFieldResponse; -import net.gepafin.tendermanagement.model.response.ApplicationAmendmentRequestResponse; -import net.gepafin.tendermanagement.model.response.SystemEmailTemplateResponse; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.*; import net.gepafin.tendermanagement.util.DateTimeUtil; @@ -75,7 +70,6 @@ public class ApplicationAmendmentRequestDao { @Autowired private ProtocolDao protocolDao; - @Autowired private AssignedApplicationsService assignedApplicationsService; @@ -90,6 +84,12 @@ public class ApplicationAmendmentRequestDao { @Autowired private SystemEmailTemplatesService systemEmailTemplatesService; + @Autowired + private CallDao callDao; + + @Autowired + private DocumentRepository documentRepository; + @Autowired private HubService hubService; // @Autowired @@ -315,6 +315,44 @@ public class ApplicationAmendmentRequestDao { applicationAmendmentRequestResponse.setFormFields(formField); + List formFieldEntities = applicationFormFieldRepository.findByApplicationFormIdIn( + applicationForms.stream().map(ApplicationFormEntity::getId).collect(Collectors.toList()) + ); + + List fileDetailResponses = new ArrayList<>(); + for (AmendmentFormFieldResponse field : formFields) { + for (ApplicationFormFieldEntity formFieldEntity : formFieldEntities) { + if (formFieldEntity.getFieldId().equals(field.getFieldId()) && formFieldEntity.getFieldValue() != null) { + ApplicationFormFieldResponseBean responseBean = new ApplicationFormFieldResponseBean(); + responseBean.setFieldId(formFieldEntity.getFieldId()); + + String[] documentIds = formFieldEntity.getFieldValue().split(","); + List documentResponseBeans = new ArrayList<>(); + + for (String docId : documentIds) { + Long documentId = Long.valueOf(docId.trim()); + documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { + DocumentResponseBean docBean = new DocumentResponseBean(); + docBean.setId(documentEntity.getId()); + docBean.setName(documentEntity.getFileName()); + docBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); + docBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); + docBean.setSourceId(documentEntity.getSourceId()); + docBean.setFilePath(documentEntity.getFilePath()); + docBean.setCreatedDate(documentEntity.getCreatedDate()); + docBean.setUpdatedDate(documentEntity.getUpdatedDate()); + documentResponseBeans.add(docBean); + }); + } + + responseBean.setFieldValue(documentResponseBeans); + fileDetailResponses.add(responseBean); + } + } + } + + applicationAmendmentRequestResponse.setApplicationFormFields(fileDetailResponses); + return applicationAmendmentRequestResponse; } From 3c1c6c9487f35bd2d6b114985868c97b360a3bfd Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 6 Nov 2024 14:09:57 +0530 Subject: [PATCH 59/76] Updated code --- .../dao/ApplicationAmendmentRequestDao.java | 4 ++++ .../tendermanagement/dao/ApplicationDao.java | 17 ++++++++++++++--- .../dao/EmailNotificationDao.java | 11 +++++++++-- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index d4d3c7f0..d273ff36 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -578,9 +578,13 @@ public class ApplicationAmendmentRequestDao { String body = prepareBody(emailTemplate, amendment, beneficiaryUser); String email = beneficiaryUser.getEmail(); String companyEmail = applicationEntity.getCompany().getEmail(); + String contactEmail = applicationEntity.getCompany().getContactEmail(); if (Boolean.TRUE.equals(amendment.getIsEmail())&&email != null && !email.isEmpty() && companyEmail != null && !companyEmail.isEmpty()) { emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email)); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(companyEmail)); + if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(contactEmail)); + } // mailUtil.sendByMailGun(subject,body,List.of(email),null); } else { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.BENEFICIARY_EMAIL_NOT_FOUND_MSG)); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 8aca183b..a51d9be1 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -735,9 +735,20 @@ public class ApplicationDao { email = userEntity.getBeneficiary().getEmail(); } emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email)); - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(applicationEntity.getCompany().getEmail())); - } - + List recipientEmails = new ArrayList<>(); + recipientEmails.add(email); + String companyEmail = company.getEmail(); + String contactEmail = company.getContactEmail(); + + if (companyEmail != null && !companyEmail.isEmpty()) { + recipientEmails.add(companyEmail); + } + + if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { + recipientEmails.add(contactEmail); + } + emailNotificationDao.sendMail(hub.getId(), subject, body, recipientEmails); + } private void sendMailTodefaultSystemAndGepafin(UserEntity userEntity, ApplicationEntity applicationEntity) { CallEntity call = applicationEntity.getCall(); CompanyEntity company = applicationEntity.getCompany(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 43f3b4e4..2f59aa0c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -76,25 +76,32 @@ public class EmailNotificationDao { String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); + List recipientEmails = getRecipientEmails(applicationEntity, userEntity, additionalRecipients); + sendMail(applicationEntity.getHubId(), subject, body, recipientEmails); + } + private List getRecipientEmails(ApplicationEntity applicationEntity, UserEntity userEntity, List additionalRecipients) { List recipientEmails = new ArrayList<>(); String companyEmail = applicationEntity.getCompany().getEmail(); String contactEmail = applicationEntity.getCompany().getContactEmail(); + if (companyEmail != null && !companyEmail.isEmpty()) { recipientEmails.add(companyEmail); } if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { recipientEmails.add(contactEmail); } - + if (userEntity.getBeneficiary().getEmail() != null) { recipientEmails.add(userEntity.getBeneficiary().getEmail()); } if (additionalRecipients != null) { recipientEmails.addAll(additionalRecipients); } - sendMail(applicationEntity.getHubId(), subject, body, recipientEmails); + + return recipientEmails; } + private String determineService(Long hubId) { HubEntity hub = hubRepository.findById(hubId).orElseThrow(() -> new IllegalArgumentException("Invalid Hub ID: " + hubId)); From e13b849cde8580cec631370f78eac02353ea1ca2 Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 6 Nov 2024 15:22:01 +0530 Subject: [PATCH 60/76] Updated code --- .../dao/ApplicationAmendmentRequestDao.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 5dfc41cb..d0a6f0c8 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -578,15 +578,8 @@ public class ApplicationAmendmentRequestDao { String subject = prepareSubject(emailTemplate, amendment, beneficiaryUser); String body = prepareBody(emailTemplate, amendment, beneficiaryUser); String email = beneficiaryUser.getEmail(); - String companyEmail = applicationEntity.getCompany().getEmail(); - String contactEmail = applicationEntity.getCompany().getContactEmail(); - if (Boolean.TRUE.equals(amendment.getIsEmail())&&email != null && !email.isEmpty() && companyEmail != null && !companyEmail.isEmpty()) { + if (Boolean.TRUE.equals(amendment.getIsEmail())&&email != null && !email.isEmpty()) { emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email)); - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(companyEmail)); - if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(contactEmail)); - } -// mailUtil.sendByMailGun(subject,body,List.of(email),null); } else { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.BENEFICIARY_EMAIL_NOT_FOUND_MSG)); } From bb10a5e7d99588c197f65e1f84a43d7db74e6cf6 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 6 Nov 2024 15:48:48 +0530 Subject: [PATCH 61/76] Fixed issue related to pdf --- src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 550bd240..456a614b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -230,10 +230,10 @@ public class PdfDao { // PdfPCell valueCell = new PdfPCell(new Phrase(item, valueFont)); PdfPCell valueCell = PdfUtils.htmlToPdfPCell(item, valueFont); - valueCell.setFixedHeight(30f); // Set a fixed height for the cell valueCell.setPaddingLeft(10f); // Adjust left padding as needed valueCell.setPaddingTop(0f); // Remove padding from top to allow vertical centering valueCell.setPaddingBottom(6f); + valueCell.setMinimumHeight(30f); // Set a fixed height for the cell valueCell.setPaddingLeft(leftMargin); // Increase left margin for value valueCell.setBorder(Rectangle.NO_BORDER); // Remove border for value cell valueCell.setVerticalAlignment(Element.ALIGN_MIDDLE); @@ -306,7 +306,7 @@ public class PdfDao { } // PdfPCell valueCell = new PdfPCell(new Phrase(fieldValue1, valueFont)); PdfPCell valueCell = PdfUtils.htmlToPdfPCell(fieldValue1, valueFont); - valueCell.setFixedHeight(30f); // Set a fixed height for the cell + valueCell.setMinimumHeight(30f); // Set a fixed height for the cell valueCell.setPaddingLeft(10f); // Adjust left padding as needed valueCell.setPaddingTop(0f); // Remove padding from top to allow vertical centering valueCell.setPaddingBottom(6f); @@ -393,7 +393,7 @@ public class PdfDao { headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE); headerCell.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - headerCell.setFixedHeight(30f); // Set a fixed height for the cell + headerCell.setMinimumHeight(30f); // Set a fixed height for the cell headerCell.setPaddingLeft(10f); // Adjust left padding as needed headerCell.setPaddingTop(0f); // Remove padding from top to allow vertical centering headerCell.setPaddingBottom(6f); @@ -415,6 +415,7 @@ public class PdfDao { // PdfPCell dataCell = new PdfPCell(new Phrase(fieldValue != null ?fieldValue: "", textFont)); PdfPCell dataCell = PdfUtils.htmlToPdfPCell(fieldValue != null ? fieldValue : "", textFont); dataCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell + dataCell.setMinimumHeight(30f); dataCell.setPaddingLeft(10f); // Adjust left padding as needed dataCell.setPaddingTop(0f); // Remove padding from top to allow vertical centering dataCell.setPaddingBottom(6f); From c60b795ac76bfb14415350a8935c2f7e1823b131 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 7 Nov 2024 14:28:15 +0530 Subject: [PATCH 62/76] Fixed field ids coming in the response as value to give document response --- .../dao/ApplicationEvaluationDao.java | 282 +++++++++++++----- .../model/response/CriteriaMappedField.java | 3 +- 2 files changed, 216 insertions(+), 69 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 75e6bcc4..2da08538 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -24,6 +24,7 @@ import java.util.*; import java.util.stream.Collectors; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; +import static org.apache.commons.lang3.StringUtils.isNumeric; @Component public class ApplicationEvaluationDao { @@ -163,10 +164,8 @@ public class ApplicationEvaluationDao { } 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); @@ -178,28 +177,23 @@ public class ApplicationEvaluationDao { CriteriaMappedField mappedField = new CriteriaMappedField(); mappedField.setId(formFieldId); - FormEntity formEntity = formRepository.findById(formField.getFormId()).orElse(null); + FormEntity formEntity = getFormEntity(formField.getFormId()); 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; + contentBeans.stream() + .filter(contentBean -> contentBean.getId().equals(formFieldId)) + .findFirst() + .ifPresent(contentBean -> { + mappedField.setFieldLabel(getLabelForField(contentBean)); + + if ("fileupload".equals(contentBean.getName())) { + mapFileFieldDetails(mappedField, formFieldId, applicationForm.getId(), applicationId); + } else { + mapNonFileFieldDetails(mappedField, formFieldId, applicationForm.getId(), applicationId); } - } - } - mappedField.setFieldLabel(label); - }); + }); } - Optional formFieldEntityOptional = applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( - formFieldId, applicationForm.getId(), applicationId); - - formFieldEntityOptional.ifPresent(field -> mappedField.setFieldValue(field.getFieldValue())); - mappedFields.add(mappedField); uniqueFieldIds.add(formFieldId); } @@ -208,6 +202,58 @@ public class ApplicationEvaluationDao { return mappedFields; } + private FormEntity getFormEntity(Long formId) { + return formRepository.findById(formId).orElse(null); + } + + private String getLabelForField(ContentResponseBean 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; + } + } + } + return label; + } + + private void mapFileFieldDetails(CriteriaMappedField mappedField, String formFieldId, Long applicationFormId, Long applicationId) { + Optional formFieldEntityOptional = applicationFormFieldRepository + .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(formFieldId, applicationFormId, applicationId); + + if (formFieldEntityOptional.isPresent()) { + String[] documentIds = formFieldEntityOptional.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); + }); + } + mappedField.setFieldValue(documentResponseBeans); + } + } + + + private void mapNonFileFieldDetails(CriteriaMappedField mappedField, String formFieldId, Long applicationFormId, Long applicationId) { + applicationFormFieldRepository + .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(formFieldId, applicationFormId, applicationId) + .ifPresent(field -> mappedField.setFieldValue(field.getFieldValue())); + } + + private void setChecklistResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List checklistEntities) { List checklistResponsesFromEntity = entity.getChecklist() != null ? @@ -562,57 +608,23 @@ public class ApplicationEvaluationDao { return response; } - private void setCriteriaResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, - List evaluationCriterias) { + private void setCriteriaResponses(ApplicationEvaluationEntity entity, Long applicationId, + ApplicationEvaluationResponse response, + List evaluationCriterias) { - List criteriaResponses = entity.getCriteria() != null ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { - }) : getCriteriaResponse(applicationId); + List criteriaResponses = getInitialCriteriaResponses(entity, applicationId); criteriaResponses.forEach(criteriaResponse -> { - EvaluationCriteriaEntity matchingEvaluationCriteria = evaluationCriterias.stream() - .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())).findFirst().orElse(null); - - List applicationForms = applicationFormRepository.findByApplicationId(applicationId); - Map mappedFieldMap = new HashMap<>(); + EvaluationCriteriaEntity matchingEvaluationCriteria = + findMatchingEvaluationCriteria(criteriaResponse, evaluationCriterias); if (matchingEvaluationCriteria != null) { + List applicationForms = applicationFormRepository.findByApplicationId(applicationId); + Map mappedFieldMap = populateMappedFields( + matchingEvaluationCriteria, applicationForms, applicationId); + 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())); } }); @@ -620,6 +632,108 @@ public class ApplicationEvaluationDao { response.setCriteria(criteriaResponses); } + private List getInitialCriteriaResponses(ApplicationEvaluationEntity entity, Long applicationId) { + return entity.getCriteria() != null + ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() {}) + : getCriteriaResponse(applicationId); + } + + private EvaluationCriteriaEntity findMatchingEvaluationCriteria(CriteriaResponse criteriaResponse, + List evaluationCriterias) { + return evaluationCriterias.stream() + .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())) + .findFirst() + .orElse(null); + } + + private Map populateMappedFields(EvaluationCriteriaEntity matchingEvaluationCriteria, + List applicationForms, + Long applicationId) { + Map mappedFieldMap = new HashMap<>(); + 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(); + populateMappedField(mappedField, formFieldId, criteriaFormField, applicationForm, applicationId); + mappedFieldMap.put(formFieldId, mappedField); + } + } + } + + return mappedFieldMap; + } + + private void populateMappedField(CriteriaMappedField mappedField, String formFieldId, + CriteriaFormFieldEntity criteriaFormField, + ApplicationFormEntity applicationForm, Long applicationId) { + mappedField.setId(formFieldId); + formRepository.findById(criteriaFormField.getFormId()).ifPresent(formEntity -> { + List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); + contentResponseBeans.stream().filter(bean -> bean.getId().equals(formFieldId)).findFirst().ifPresent(contentResponseBean -> { + String label = getLabel(contentResponseBean); + mappedField.setFieldLabel(label); + if ("fileupload".equals(contentResponseBean.getName())) { + populateFileDetailsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId); + } else { + applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + formFieldId, applicationForm.getId(), applicationId) + .ifPresent(formField -> mappedField.setFieldValue(formField.getFieldValue())); + } + }); + }); + } + + private void populateFileDetailsAsFieldValue(CriteriaMappedField mappedField, String formFieldId, + ApplicationFormEntity applicationForm, Long applicationId) { + applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + formFieldId, applicationForm.getId(), applicationId) + .ifPresent(formField -> { + if (formField.getFieldValue() != null) { + List documentResponseBeans = new ArrayList<>(); + for (String docId : formField.getFieldValue().split(",")) { + Long documentId = Long.valueOf(docId.trim()); + documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { + DocumentResponseBean responseBean = createDocumentResponseBean(documentEntity); + documentResponseBeans.add(responseBean); + }); + } + // Set the list of DocumentResponseBean directly + mappedField.setFieldValue(documentResponseBeans); + } + }); + } + + private String getLabel(ContentResponseBean 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; + } + } + } + return label; + } + + + private DocumentResponseBean createDocumentResponseBean(DocumentEntity 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()); + return responseBean; + } + private void setChecklistResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, List checklistEntities) { @@ -764,13 +878,47 @@ public class ApplicationEvaluationDao { mappedField.setFieldLabel(label); }); } + List documentResponseBeans = new ArrayList<>(); + applicationFormRepository.findByApplicationId(applicationId).stream() + .flatMap(applicationForm -> applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + criteriaFormField.getFormFieldId(), applicationForm.getId(), applicationId).stream()) + .findFirst().ifPresent(formField -> { + String fieldValue = formField.getFieldValue(); + if (fieldValue != null) { + String[] fieldValues = fieldValue.split(","); + for (String value : fieldValues) { + String trimmedValue = value.trim(); + if (isNumeric(trimmedValue)) { + Long documentId = Long.valueOf(trimmedValue); + 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); + }); + } else { + mappedField.setFieldValue(trimmedValue); + } + } + } - applicationFormRepository.findByApplicationId(applicationId).stream().flatMap( - applicationForm -> applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(criteriaFormField.getFormFieldId(), - applicationForm.getId(), applicationId).stream()).findFirst().ifPresent(formField -> mappedField.setFieldValue(formField.getFieldValue())); + if (!documentResponseBeans.isEmpty()) { + mappedField.setFieldValue(documentResponseBeans); + } else { + mappedField.setFieldValue(fieldValue != null ? fieldValue.trim() : null); + } + + }); mappedFields.add(mappedField); processedFormFieldIds.add(criteriaFormField.getFormFieldId()); + } response.setCriteriaMappedFields(mappedFields); @@ -852,8 +1000,6 @@ public class ApplicationEvaluationDao { } fieldResponse.setFileDetail(documentResponseBeans); - - // Now add fieldResponse to the list fieldResponses.add(fieldResponse); } } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaMappedField.java b/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaMappedField.java index 8c62e178..e94e0f73 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaMappedField.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaMappedField.java @@ -1,10 +1,11 @@ package net.gepafin.tendermanagement.model.response; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.Data; @Data public class CriteriaMappedField { private String id; private String fieldLabel; - private String fieldValue; + private Object fieldValue; } From d550f97ea8ff4fb8636b3bd65867f503fc63dee4 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 7 Nov 2024 14:45:20 +0530 Subject: [PATCH 63/76] Updated get api t get amendment by application id --- .../dao/ApplicationAmendmentRequestDao.java | 10 ++++++---- .../ApplicationAmendmentRequestRepository.java | 3 ++- .../service/ApplicationAmendmentRequestService.java | 2 +- .../impl/ApplicationAmendmentRequestServiceImpl.java | 8 ++++---- .../web/rest/api/ApplicationAmendmentRequestApi.java | 2 +- .../impl/ApplicationAmendmentRequestController.java | 4 ++-- 6 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index d0a6f0c8..c6f21db7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -539,15 +539,17 @@ public class ApplicationAmendmentRequestDao { return convertEntityToResponse(request); } - public ApplicationAmendmentRequestResponse getAmendmentByApplicationId(HttpServletRequest request, Long applicationId) { + public List getAmendmentByApplicationId(HttpServletRequest request, Long applicationId) { log.info("Fetching the Amendment data from application id {}", applicationId); ApplicationEntity application = applicationService.validateApplication(applicationId); - ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity=applicationAmendmentRequestRepository.findByApplicationIdAndIsDeletedFalse(application.getId()); + List applicationAmendmentRequestEntity=applicationAmendmentRequestRepository.findByApplicationIdAndIsDeletedFalse(application.getId()); ApplicationAmendmentRequestResponse response=null; if(applicationAmendmentRequestEntity!=null) { - response = convertEntityToResponse(applicationAmendmentRequestEntity); + return applicationAmendmentRequestEntity.stream() + .map(this::convertEntityToResponse) + .collect(Collectors.toList()); } - return response; + return null; } public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus( Long id,ApplicationAmendmentRequestEnum statusTypeEnum) { diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 972ebccd..5bc8ca9d 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -23,7 +23,8 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository findByApplicationIdAndIsDeletedFalse(Long applicationId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java index 2f536da7..f4aad666 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java @@ -22,7 +22,7 @@ public interface ApplicationAmendmentRequestService { List getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request,Long beneficiaryId); ApplicationAmendmentRequestResponse closeAmendmentRequest(HttpServletRequest request, Long id, CloseAmendmentRequest closeAmendmentRequest); ApplicationAmendmentRequestResponse extendResponseDays(HttpServletRequest request, Long id, Long addedDays); - public ApplicationAmendmentRequestResponse getAmendmentByApplicationId(HttpServletRequest request,Long applicationId); + public List getAmendmentByApplicationId(HttpServletRequest request,Long applicationId); public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationAmendmentId, ApplicationAmendmentRequestEnum status); void sendReminderEmail(HttpServletRequest request,Long amendmentId); 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 fa724c94..67c13abd 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -129,11 +129,11 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm return applicationAmendmentRequestDao.extendResponseDays(id, addedDays); } - public ApplicationAmendmentRequestResponse getAmendmentByApplicationId(HttpServletRequest request, Long applicationId) { - ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByApplicationIdAndIsDeletedFalse(applicationId); + public List getAmendmentByApplicationId(HttpServletRequest request, Long applicationId) { + List amendment = applicationAmendmentRequestRepository.findByApplicationIdAndIsDeletedFalse(applicationId); if(amendment!=null) { - - Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(amendment.getApplicationEvaluationEntity().getId()); + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity=amendment.get(0); + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getId()); if (entityOptional.isPresent()) { UserEntity user = validator.validatePreInstructor(request, entityOptional.get().getUserId()); }} 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 10c3128b..4ecc8d18 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 @@ -155,7 +155,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 = "application/{id}", produces = "application/json") - ResponseEntity> getAmendmentByApplicationId(HttpServletRequest request, @Parameter(description = "The Application id", required = true) @PathVariable(value = "id", required = true) Long applicationId); + ResponseEntity>> getAmendmentByApplicationId(HttpServletRequest request, @Parameter(description = "The Application id", required = true) @PathVariable(value = "id", required = true) Long applicationId); @Operation(summary = "Api to update application amendment status", 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 1934ec5b..7821f2dc 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 @@ -105,8 +105,8 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.RESPONSE_DAYS_EXTENDED_SUCCESS_MSG))); } @Override - public ResponseEntity> getAmendmentByApplicationId(HttpServletRequest request, Long applicationId) { - ApplicationAmendmentRequestResponse applicationAmendmentBean = applicationAmendmentRequestService.getAmendmentByApplicationId(request,applicationId); + public ResponseEntity>> getAmendmentByApplicationId(HttpServletRequest request, Long applicationId) { + List applicationAmendmentBean = applicationAmendmentRequestService.getAmendmentByApplicationId(request,applicationId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applicationAmendmentBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_DATA_FOR_AMENDMENT_SUCCESS_MSG))); } From 647b41b2316d6a20a5fe38e72da91b8492977dea Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 7 Nov 2024 16:06:50 +0530 Subject: [PATCH 64/76] Updated status filter in get all application api --- .../tendermanagement/dao/ApplicationDao.java | 13 ++++++++----- .../service/ApplicationService.java | 2 +- .../service/impl/ApplicationServiceImpl.java | 4 ++-- .../web/rest/api/ApplicationApi.java | 2 +- .../web/rest/api/impl/ApplicationApiController.java | 4 ++-- 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index a51d9be1..1eb8017f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -294,11 +294,11 @@ public class ApplicationDao { // return applicationResponses; // } - public List getAllApplications(UserEntity userEntity, Long callId, Long companyId,String status) { + public List getAllApplications(UserEntity userEntity, Long callId, Long companyId,List statusList) { log.info("Fetching applications for RoleType: {}", userEntity.getRoleEntity().getRoleType()); - Specification spec = search(userEntity, callId, companyId,status); + Specification spec = search(userEntity, callId, companyId,statusList); List applicationEntities = applicationRepository.findAll(spec); @@ -308,7 +308,7 @@ public class ApplicationDao { } - private Specification search(UserEntity userEntity, Long callId, Long companyId,String status) { + private Specification search(UserEntity userEntity, Long callId, Long companyId,List statusList) { return (root, query, builder) -> { Boolean isBeneficiary = validator.checkIsBeneficiary(); Predicate predicate = builder.isFalse(root.get("isDeleted")); @@ -321,8 +321,11 @@ public class ApplicationDao { if (companyId != null) { predicate = builder.and(predicate, builder.equal(root.get("company").get("id"), companyId)); } - if (status != null) { - predicate = builder.and(predicate, builder.equal(root.get("status"), status)); + if (statusList != null && !statusList.isEmpty()) { + List statusNames = statusList.stream() + .map(Enum::name) + .collect(Collectors.toList()); + predicate = builder.and(predicate, root.get("status").in(statusNames)); } predicate = builder.and(predicate, builder.equal(root.get("hubId"), userEntity.getHub().getId())); return predicate; diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index d2bb4b19..9ef06c48 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -22,7 +22,7 @@ public interface ApplicationService { ApplicationGetResponseBean getApplicationByFormId(HttpServletRequest request, Long applicationId,Long formId); - List getAllApplications(HttpServletRequest request,Long callId, Long companyId,String status); + List getAllApplications(HttpServletRequest request,Long callId, Long companyId,List statusList); void deleteApplication(HttpServletRequest request, Long applicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index 111ac099..886b91c1 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -86,12 +86,12 @@ public class ApplicationServiceImpl implements ApplicationService { @Override @Transactional(readOnly = true) - public List getAllApplications(HttpServletRequest request, Long callId, Long companyId , String status) { + public List getAllApplications(HttpServletRequest request, Long callId, Long companyId ,List statusList) { UserEntity userEntity = validator.validateUser(request); if (companyId != null) { validator.validateUserWithCompany(request, companyId); } - return applicationDao.getAllApplications(userEntity, callId, companyId , status); + return applicationDao.getAllApplications(userEntity, callId, companyId , statusList); } @Override @Transactional(rollbackFor = Exception.class) diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index fcfbe2ff..d69b9847 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -72,7 +72,7 @@ public interface ApplicationApi { ResponseEntity>> getAllApplications(HttpServletRequest request, @Parameter(description = "The call id", required = false) @RequestParam(value = "callId", required = false) Long callId, @Parameter(description = "The company id", required = false) @RequestParam(value = "companyId", required = false) Long companyId, - @Parameter(description = "Application status" ,required = false) @RequestParam(value = "status",required = false)String status); + @Parameter(description = "Application status" ,required = false) @RequestParam(value = "status",required = false) List statusList); @Operation(summary = "Api to delete application", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java index 71dc2421..27ea0bb7 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java @@ -76,8 +76,8 @@ public class ApplicationApiController implements ApplicationApi { } @Override - public ResponseEntity>> getAllApplications(HttpServletRequest request, Long callId, Long companyId, String status) { - List applications = applicationService.getAllApplications(request, callId, companyId,status); + public ResponseEntity>> getAllApplications(HttpServletRequest request, Long callId, Long companyId, List statusList) { + List applications = applicationService.getAllApplications(request, callId, companyId,statusList); log.info("Get All Applications"); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); From 9f5ac3839b9ba7bcb362d21a23da8e39cd4e00e8 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 7 Nov 2024 17:15:05 +0530 Subject: [PATCH 65/76] Updated code --- .../dao/ApplicationAmendmentRequestDao.java | 19 ++++++++++++++----- ...ApplicationAmendmentRequestRepository.java | 2 ++ .../ApplicationAmendmentRequestService.java | 2 +- ...pplicationAmendmentRequestServiceImpl.java | 11 ++--------- .../api/ApplicationAmendmentRequestApi.java | 6 ++++-- ...ApplicationAmendmentRequestController.java | 4 ++-- 6 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index c6f21db7..185e8b45 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -539,17 +539,26 @@ public class ApplicationAmendmentRequestDao { return convertEntityToResponse(request); } - public List getAmendmentByApplicationId(HttpServletRequest request, Long applicationId) { + public List getAmendmentByApplicationId(HttpServletRequest request, Long applicationId,List statuses) { log.info("Fetching the Amendment data from application id {}", applicationId); ApplicationEntity application = applicationService.validateApplication(applicationId); - List applicationAmendmentRequestEntity=applicationAmendmentRequestRepository.findByApplicationIdAndIsDeletedFalse(application.getId()); - ApplicationAmendmentRequestResponse response=null; + List applicationAmendmentRequestEntity=applicationAmendmentRequestRepository.findByApplicationIdAndIsDeletedFalse(applicationId); + if(!statuses.isEmpty()) { + List statusStrings = statuses.stream().map(Enum::name).collect(Collectors.toList()); + applicationAmendmentRequestEntity = applicationAmendmentRequestRepository.findByApplicationIdAndStatusInAndIsDeletedFalse(application.getId(), statusStrings); + } if(!applicationAmendmentRequestEntity.isEmpty()) { + ApplicationAmendmentRequestEntity applicationAmendmentRequest=applicationAmendmentRequestEntity.get(0); + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(applicationAmendmentRequest.getApplicationEvaluationEntity().getId()); + if (entityOptional.isPresent()) { + UserEntity user = validator.validatePreInstructor(request, entityOptional.get().getUserId()); + }} + List response=new ArrayList<>(); if(applicationAmendmentRequestEntity!=null) { - return applicationAmendmentRequestEntity.stream() + response= applicationAmendmentRequestEntity.stream() .map(this::convertEntityToResponse) .collect(Collectors.toList()); } - return null; + return response; } public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus( Long id,ApplicationAmendmentRequestEnum statusTypeEnum) { diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 5bc8ca9d..88561517 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -27,4 +27,6 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository findByApplicationIdAndIsDeletedFalse(Long applicationId); + List findByApplicationIdAndStatusInAndIsDeletedFalse(Long applicationId, List statuses); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java index f4aad666..678ff913 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java @@ -22,7 +22,7 @@ public interface ApplicationAmendmentRequestService { List getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request,Long beneficiaryId); ApplicationAmendmentRequestResponse closeAmendmentRequest(HttpServletRequest request, Long id, CloseAmendmentRequest closeAmendmentRequest); ApplicationAmendmentRequestResponse extendResponseDays(HttpServletRequest request, Long id, Long addedDays); - public List getAmendmentByApplicationId(HttpServletRequest request,Long applicationId); + public List getAmendmentByApplicationId(HttpServletRequest request,Long applicationId,List statuses); public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationAmendmentId, ApplicationAmendmentRequestEnum status); void sendReminderEmail(HttpServletRequest request,Long amendmentId); 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 67c13abd..1f6f2f84 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -129,15 +129,8 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm return applicationAmendmentRequestDao.extendResponseDays(id, addedDays); } - public List getAmendmentByApplicationId(HttpServletRequest request, Long applicationId) { - List amendment = applicationAmendmentRequestRepository.findByApplicationIdAndIsDeletedFalse(applicationId); - if(amendment!=null) { - ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity=amendment.get(0); - Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getId()); - if (entityOptional.isPresent()) { - UserEntity user = validator.validatePreInstructor(request, entityOptional.get().getUserId()); - }} - return applicationAmendmentRequestDao.getAmendmentByApplicationId(request,applicationId); + public List getAmendmentByApplicationId(HttpServletRequest request, Long applicationId,List statuses) { + return applicationAmendmentRequestDao.getAmendmentByApplicationId(request,applicationId,statuses); } @Override public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationAmendmentId, ApplicationAmendmentRequestEnum status) { 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 4ecc8d18..b5d7bf9f 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 @@ -145,7 +145,7 @@ public interface ApplicationAmendmentRequestApi { ResponseEntity> closeApplicationAmendmentRequest(HttpServletRequest request, @Parameter(description = "The Application Amendment id", required = true) @RequestParam("id") Long id, @Valid @RequestBody CloseAmendmentRequest closeAmendmentRequest); - @Operation(summary = "Api to get amendment process by application id", + @Operation(summary = "Api to get amendment process list by application id", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -155,7 +155,9 @@ 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 = "application/{id}", produces = "application/json") - ResponseEntity>> getAmendmentByApplicationId(HttpServletRequest request, @Parameter(description = "The Application id", required = true) @PathVariable(value = "id", required = true) Long applicationId); + ResponseEntity>> getAmendmentByApplicationId(HttpServletRequest request, @Parameter(description = "The Application id", required = true) @PathVariable(value = "id", required = true) Long applicationId, + @Parameter(description = "List of amendment statuses") @RequestParam(value = "statuses", required = false) List statuses + ); @Operation(summary = "Api to update application amendment status", 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 7821f2dc..bd66efd1 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 @@ -105,8 +105,8 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.RESPONSE_DAYS_EXTENDED_SUCCESS_MSG))); } @Override - public ResponseEntity>> getAmendmentByApplicationId(HttpServletRequest request, Long applicationId) { - List applicationAmendmentBean = applicationAmendmentRequestService.getAmendmentByApplicationId(request,applicationId); + public ResponseEntity>> getAmendmentByApplicationId(HttpServletRequest request, Long applicationId,List statuses) { + List applicationAmendmentBean = applicationAmendmentRequestService.getAmendmentByApplicationId(request,applicationId,statuses); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applicationAmendmentBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_DATA_FOR_AMENDMENT_SUCCESS_MSG))); } From 82465fd7cacb92aa27816cbc4ac49a05279dad84 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 7 Nov 2024 17:20:12 +0530 Subject: [PATCH 66/76] Updated code --- .../web/rest/api/ApplicationAmendmentRequestApi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 b5d7bf9f..651680ff 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 @@ -154,8 +154,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 = "application/{id}", produces = "application/json") - ResponseEntity>> getAmendmentByApplicationId(HttpServletRequest request, @Parameter(description = "The Application id", required = true) @PathVariable(value = "id", required = true) Long applicationId, + @GetMapping(value = "application/{applicationId}", produces = "application/json") + ResponseEntity>> getAmendmentByApplicationId(HttpServletRequest request, @Parameter(description = "The Application id", required = true) @PathVariable(value = "applicationId", required = true) Long applicationId, @Parameter(description = "List of amendment statuses") @RequestParam(value = "statuses", required = false) List statuses ); From 6bf2ef2d83e449a660301b8ec9a1b6d0e50cbc95 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 7 Nov 2024 18:15:06 +0530 Subject: [PATCH 67/76] Updated Code --- .../gepafin/tendermanagement/web/rest/api/ApplicationApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index d69b9847..700bf353 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -72,7 +72,7 @@ public interface ApplicationApi { ResponseEntity>> getAllApplications(HttpServletRequest request, @Parameter(description = "The call id", required = false) @RequestParam(value = "callId", required = false) Long callId, @Parameter(description = "The company id", required = false) @RequestParam(value = "companyId", required = false) Long companyId, - @Parameter(description = "Application status" ,required = false) @RequestParam(value = "status",required = false) List statusList); + @Parameter(description = "Application statuses" ,required = false) @RequestParam(value = "statuses",required = false) List statusList); @Operation(summary = "Api to delete application", responses = { From fa49efd41a0efd5cdf4352fcfa6a40b473c64813 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 7 Nov 2024 21:53:00 +0530 Subject: [PATCH 68/76] Fixed permission related issue for amendment --- .../dao/ApplicationAmendmentRequestDao.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 185e8b45..41c45283 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -550,7 +550,11 @@ public class ApplicationAmendmentRequestDao { ApplicationAmendmentRequestEntity applicationAmendmentRequest=applicationAmendmentRequestEntity.get(0); Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(applicationAmendmentRequest.getApplicationEvaluationEntity().getId()); if (entityOptional.isPresent()) { - UserEntity user = validator.validatePreInstructor(request, entityOptional.get().getUserId()); + if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { + validator.validatePreInstructor(request, entityOptional.get().getUserId()); + } else { + validator.validateUserId(request, entityOptional.get().getAssignedApplicationsEntity().getApplication().getUserId()); + } }} List response=new ArrayList<>(); if(applicationAmendmentRequestEntity!=null) { From 1758cc881fafc415b34282a369064f7a03315329 Mon Sep 17 00:00:00 2001 From: harish Date: Fri, 8 Nov 2024 16:33:17 +0530 Subject: [PATCH 69/76] Updated criteria response for field ids coming in the mappedField response as value. --- .../dao/ApplicationEvaluationDao.java | 354 +++++++++++++----- 1 file changed, 263 insertions(+), 91 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 2da08538..609eb0db 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1,6 +1,9 @@ package net.gepafin.tendermanagement.dao; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; @@ -49,7 +52,6 @@ public class ApplicationEvaluationDao { @Autowired private FormRepository formRepository; - @Autowired private CallTargetAudienceChecklistRepository callTargetAudienceChecklistRepository; @@ -185,11 +187,19 @@ public class ApplicationEvaluationDao { .findFirst() .ifPresent(contentBean -> { mappedField.setFieldLabel(getLabelForField(contentBean)); + switch (contentBean.getName()) { + case "fileupload": + mapFileFieldDetails(mappedField, formFieldId, applicationForm.getId(), applicationId); + break; - if ("fileupload".equals(contentBean.getName())) { - mapFileFieldDetails(mappedField, formFieldId, applicationForm.getId(), applicationId); - } else { - mapNonFileFieldDetails(mappedField, formFieldId, applicationForm.getId(), applicationId); + case "checkboxes": + populateOptionFieldsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId, contentBean); + break; + case "paragraph": + handleParagraphField(applicationId, formField, contentBean, mappedField); + break; + default: + populateOptionFieldsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId, contentBean); } }); } @@ -676,17 +686,27 @@ public class ApplicationEvaluationDao { contentResponseBeans.stream().filter(bean -> bean.getId().equals(formFieldId)).findFirst().ifPresent(contentResponseBean -> { String label = getLabel(contentResponseBean); mappedField.setFieldLabel(label); - if ("fileupload".equals(contentResponseBean.getName())) { - populateFileDetailsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId); - } else { - applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( - formFieldId, applicationForm.getId(), applicationId) - .ifPresent(formField -> mappedField.setFieldValue(formField.getFieldValue())); + switch (contentResponseBean.getName()) { + case "fileupload": + populateFileDetailsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId); + break; + + case "checkboxes": + populateOptionFieldsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId, contentResponseBean); + break; + + case "paragraph": + handleParagraphField(applicationId, criteriaFormField, contentResponseBean, mappedField); + break; + + default: + populateOptionFieldsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId, contentResponseBean); } }); }); } + private void populateFileDetailsAsFieldValue(CriteriaMappedField mappedField, String formFieldId, ApplicationFormEntity applicationForm, Long applicationId) { applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( @@ -719,6 +739,47 @@ public class ApplicationEvaluationDao { } return label; } + private void populateOptionFieldsAsFieldValue(CriteriaMappedField mappedField, String formFieldId, ApplicationFormEntity applicationForm, Long applicationId, ContentResponseBean contentBean) { + ObjectMapper objectMapper = new ObjectMapper(); + findFormFieldValue(applicationId, formFieldId).ifPresent(formField -> { + Object value = formField.getFieldValue(); + List labels = new ArrayList<>(); + if (value instanceof String) { + String fieldValue = (String) value; + if (fieldValue.contains(",")) { + try { + List parsedValue = objectMapper.readValue(fieldValue, new TypeReference>() {}); + parsedValue.forEach(item -> addLabelToList(labels, item, contentBean)); + } catch (JsonProcessingException e) { + + String[] fallbackValues = fieldValue.split(","); + for (String item : fallbackValues) { + addLabelToList(labels, item.trim(), contentBean); + } + } + mappedField.setFieldValue(!labels.isEmpty() ? labels : null); + } else { + + addLabelToList(labels, fieldValue.trim(), contentBean); + mappedField.setFieldValue(!labels.isEmpty() ? labels.get(0) : null); + } + } else if (value instanceof List) { + + List parsedValue = (List) value; + parsedValue.forEach(item -> addLabelToList(labels, item, contentBean)); + mappedField.setFieldValue(!labels.isEmpty() ? labels : null); + } + }); + } + + private void addLabelToList(List labels, Object item, ContentResponseBean contentBean) { + if (item instanceof String) { + Object label = PdfDao.findLabelInOptions(contentBean.getSettings(), item); + if (label != null) { + labels.add(label.toString()); + } + } + } private DocumentResponseBean createDocumentResponseBean(DocumentEntity documentEntity) { @@ -807,8 +868,6 @@ public class ApplicationEvaluationDao { fieldResponse.setFileDetail(documentResponseBeans); } - - // Mark this field ID as processed to prevent duplicates processedFieldIds.add(fieldResponse.getId()); } }); @@ -835,99 +894,212 @@ public class ApplicationEvaluationDao { response.setEvaluationDate(application.getSubmissionDate() != null ? application.getSubmissionDate().plusDays(30) : null); } + private Optional findFormFieldValue(Long applicationId, String formFieldId) { + return applicationFormRepository.findByApplicationId(applicationId).stream() + .flatMap(applicationForm -> applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + formFieldId, applicationForm.getId(), applicationId).stream()) + .findFirst(); + } List getCriteriaResponse(Long applicationId) { + CallEntity call = getCallEntityByApplicationId(applicationId); + List evaluationCriterias = getEvaluationCriterias(call); - CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); - List evaluationCriterias = evaluationCriteriaRepository.findByCallId(call.getId()); + return evaluationCriterias.stream() + .map(criteria -> buildCriteriaResponse(applicationId, criteria)) + .collect(Collectors.toList()); + } - 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); + private CallEntity getCallEntityByApplicationId(Long applicationId) { + return callRepository.findCallEntityByApplicationId(applicationId); + } - List criteriaFormFields = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(criteria.getId()); + private List getEvaluationCriterias(CallEntity call) { + return evaluationCriteriaRepository.findByCallId(call.getId()); + } - List mappedFields = new ArrayList<>(); - Set processedFormFieldIds = new HashSet<>(); + private CriteriaResponse buildCriteriaResponse(Long applicationId, EvaluationCriteriaEntity criteria) { + CriteriaResponse response = new CriteriaResponse(); + response.setId(criteria.getId()); + response.setLabel(criteria.getLookupData().getValue()); + response.setScore(null); + response.setMaxScore(criteria.getScore()); + response.setValid(null); - for (CriteriaFormFieldEntity criteriaFormField : criteriaFormFields) { - if (processedFormFieldIds.contains(criteriaFormField.getFormFieldId())) { - continue; - } + List mappedFields = getMappedFields(applicationId, criteria); + response.setCriteriaMappedFields(mappedFields); + return response; + } - CriteriaMappedField mappedField = new CriteriaMappedField(); - mappedField.setId(criteriaFormField.getFormFieldId()); + private List getMappedFields(Long applicationId, EvaluationCriteriaEntity criteria) { + List criteriaFormFields = getCriteriaFormFields(criteria); - 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); - }); - } - List documentResponseBeans = new ArrayList<>(); - applicationFormRepository.findByApplicationId(applicationId).stream() - .flatMap(applicationForm -> applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( - criteriaFormField.getFormFieldId(), applicationForm.getId(), applicationId).stream()) - .findFirst().ifPresent(formField -> { - String fieldValue = formField.getFieldValue(); - if (fieldValue != null) { - String[] fieldValues = fieldValue.split(","); - for (String value : fieldValues) { - String trimmedValue = value.trim(); - if (isNumeric(trimmedValue)) { - Long documentId = Long.valueOf(trimmedValue); - 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); - }); - } else { - mappedField.setFieldValue(trimmedValue); - } - } - } - - if (!documentResponseBeans.isEmpty()) { - mappedField.setFieldValue(documentResponseBeans); - } else { - mappedField.setFieldValue(fieldValue != null ? fieldValue.trim() : null); - } - - }); - - mappedFields.add(mappedField); - processedFormFieldIds.add(criteriaFormField.getFormFieldId()); + List mappedFields = new ArrayList<>(); + Set processedFormFieldIds = new HashSet<>(); + for (CriteriaFormFieldEntity criteriaFormField : criteriaFormFields) { + if (processedFormFieldIds.contains(criteriaFormField.getFormFieldId())) { + continue; } - response.setCriteriaMappedFields(mappedFields); - return response; - }).collect(Collectors.toList()); + CriteriaMappedField mappedField = mapField(applicationId, criteriaFormField); + mappedFields.add(mappedField); + processedFormFieldIds.add(criteriaFormField.getFormFieldId()); + } - return criteriaResponses; + return mappedFields; } + private List getCriteriaFormFields(EvaluationCriteriaEntity criteria) { + return criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(criteria.getId()); + } + + private CriteriaMappedField mapField(Long applicationId, CriteriaFormFieldEntity criteriaFormField) { + 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 -> processFieldValue(applicationId, criteriaFormField, contentResponseBean, mappedField)); + } + + return mappedField; + } + + private void processFieldValue(Long applicationId, CriteriaFormFieldEntity criteriaFormField, ContentResponseBean contentResponseBean, CriteriaMappedField mappedField) { + String label = getLabelFromSettings(contentResponseBean); + + mappedField.setFieldLabel(label); + + boolean isCheckbox = "checkboxes".equals(contentResponseBean.getName()); + boolean isFileUpload = "fileupload".equals(contentResponseBean.getName()); + boolean isParagraph = "paragraph".equals(contentResponseBean.getName()); + + if (isFileUpload) { + handleFileUpload(applicationId, criteriaFormField, mappedField); + } else if (isCheckbox) { + handleCheckbox(applicationId, criteriaFormField, contentResponseBean, mappedField); + } + else if (isParagraph) { + handleParagraphField(applicationId, criteriaFormField, contentResponseBean, mappedField); + } + else { + handleOtherFields(applicationId, criteriaFormField, contentResponseBean, mappedField); + } + } + private void handleParagraphField(Long applicationId, CriteriaFormFieldEntity criteriaFormField, ContentResponseBean contentResponseBean, CriteriaMappedField mappedField) { + findFormFieldValue(applicationId, criteriaFormField.getFormFieldId()).ifPresent(formField -> { + String paragraph = contentResponseBean.getSettings().stream() + .filter(setting -> "text".equals(setting.getName())) + .map(SettingResponseBean::getValue) + .map(Object::toString) + .findFirst() + .orElse(null); + if (paragraph != null) { + mappedField.setFieldValue(paragraph.trim()); + } + + }); + } + + private String getLabelFromSettings(ContentResponseBean 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; + } + } + } + return label; + } + + private void handleFileUpload(Long applicationId, CriteriaFormFieldEntity criteriaFormField, CriteriaMappedField mappedField) { + List documentResponseBeans = new ArrayList<>(); + findFormFieldValue(applicationId, criteriaFormField.getFormFieldId()).ifPresent(formField -> { + String fieldValue = formField.getFieldValue(); + if (fieldValue != null) { + String[] fieldValues = fieldValue.split(","); + for (String value : fieldValues) { + Long documentId = Long.valueOf(value.trim()); + documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { + DocumentResponseBean responseBean = mapDocumentEntityToResponse(documentEntity); + documentResponseBeans.add(responseBean); + }); + } + } + mappedField.setFieldValue(!documentResponseBeans.isEmpty() ? documentResponseBeans : null); + }); + } + + private DocumentResponseBean mapDocumentEntityToResponse(DocumentEntity 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()); + return responseBean; + } + + private void handleCheckbox(Long applicationId, CriteriaFormFieldEntity criteriaFormField, ContentResponseBean contentResponseBean, CriteriaMappedField mappedField) { + ObjectMapper objectMapper = new ObjectMapper(); + findFormFieldValue(applicationId, criteriaFormField.getFormFieldId()).ifPresent(formField -> { + Object value = formField.getFieldValue(); + List labels = new ArrayList<>(); + + if (value instanceof String) { + List parsedValue = parseJsonValue((String) value, objectMapper); + addLabelsFromParsedValues(parsedValue, contentResponseBean, labels); + } else if (value instanceof List) { + List parsedValue = (List) value; + addLabelsFromParsedValues(parsedValue, contentResponseBean, labels); + } + + mappedField.setFieldValue(!labels.isEmpty() ? (labels.size() == 1 ? labels.get(0) : labels) : null); + }); + } + + private List parseJsonValue(String value, ObjectMapper objectMapper) { + try { + return objectMapper.readValue(value, new TypeReference>() {}); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + private void addLabelsFromParsedValues(List parsedValue, ContentResponseBean contentResponseBean, List labels) { + for (Object item : parsedValue) { + if (item instanceof String) { + Object label = PdfDao.findLabelInOptions(contentResponseBean.getSettings(), item); + if (label != null) { + labels.add(label.toString()); + } + } + } + } + + private void handleOtherFields(Long applicationId, CriteriaFormFieldEntity criteriaFormField, ContentResponseBean contentResponseBean, CriteriaMappedField mappedField) { + findFormFieldValue(applicationId, criteriaFormField.getFormFieldId()).ifPresent(formField -> { + String fieldValue = formField.getFieldValue() != null ? formField.getFieldValue().trim() : null; + Object label = PdfDao.findLabelInOptions(contentResponseBean.getSettings(), fieldValue); + if (label != null) { + mappedField.setFieldValue(fieldValue != null && !fieldValue.isEmpty() && !fieldValue.contains(",") + ? label.toString() + : Arrays.asList(label.toString())); + } + }); + } + + List getChecklistResponse(Long applicationId) { CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); From c875def01ce690d6e86cdb0507dbd4a141d37488 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 8 Nov 2024 16:45:19 +0530 Subject: [PATCH 70/76] Added field call email in get amendment api by application id --- .../tendermanagement/dao/ApplicationAmendmentRequestDao.java | 3 ++- .../model/response/ApplicationAmendmentRequestResponse.java | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 41c45283..b522354d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -257,6 +257,7 @@ public class ApplicationAmendmentRequestDao { ApplicationEntity application = applicationService.validateApplication(applicationId); applicationAmendmentRequestResponse.setApplicationId(applicationId); + applicationAmendmentRequestResponse.setCallEmail(application.getCall().getEmail()); applicationAmendmentRequestResponse.setApplicationEvaluationId(applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getId()); applicationAmendmentRequestResponse.setNote(applicationAmendmentRequestEntity.getNote()); applicationAmendmentRequestResponse.setStatus(ApplicationAmendmentRequestEnum.valueOf(applicationAmendmentRequestEntity.getStatus())); @@ -543,7 +544,7 @@ public class ApplicationAmendmentRequestDao { log.info("Fetching the Amendment data from application id {}", applicationId); ApplicationEntity application = applicationService.validateApplication(applicationId); List applicationAmendmentRequestEntity=applicationAmendmentRequestRepository.findByApplicationIdAndIsDeletedFalse(applicationId); - if(!statuses.isEmpty()) { + if(statuses!=null && !statuses.isEmpty()) { List statusStrings = statuses.stream().map(Enum::name).collect(Collectors.toList()); applicationAmendmentRequestEntity = applicationAmendmentRequestRepository.findByApplicationIdAndStatusInAndIsDeletedFalse(application.getId(), statusStrings); } if(!applicationAmendmentRequestEntity.isEmpty()) { 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 c942dbf2..be03d36b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java @@ -10,6 +10,7 @@ import java.util.List; @Data public class ApplicationAmendmentRequestResponse { private Long id; + private String callEmail; private String note; private Long responseDays; private LocalDateTime startDate; From 4d1a1a9352e73ed3fd9795c0738edcba2e2776df Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 8 Nov 2024 20:30:09 +0530 Subject: [PATCH 71/76] fixed evaluation criteria issue --- .../tendermanagement/dao/ApplicationDao.java | 18 +++-- .../dao/ApplicationEvaluationDao.java | 71 +++++++++++-------- 2 files changed, 53 insertions(+), 36 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 1eb8017f..cb1e14c3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -137,6 +137,9 @@ public class ApplicationDao { @Autowired private EmailNotificationDao emailNotificationDao; + + @Autowired + private FormDao formDao; public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { FormEntity formEntity = formService.validateForm(formId); @@ -209,8 +212,10 @@ public class ApplicationDao { ApplicationFormEntity applicationFormEntity, List applicationFormFieldResponseBeans) { - List contentResponseBeans = Utils.convertJsonStringToList( - applicationFormEntity.getForm().getContent(), ContentResponseBean.class); +// List contentResponseBeans = Utils.convertJsonStringToList( +// applicationFormEntity.getForm().getContent(), ContentResponseBean.class); + + List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(applicationFormEntity.getForm()).getContent(); for (ApplicationFormFieldEntity applicationFormFieldEntity : applicationFormFieldEntities) { @@ -430,7 +435,8 @@ public class ApplicationDao { private List validateFileUploadDocuments(ApplicationFormFieldRequestBean applicationFormFieldRequestBean, FormEntity formEntity) { List documentIds=null; - List contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class); +// List contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class); + List contentResponseBeans=formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); for (ContentResponseBean contentResponseBean:contentResponseBeans){ if(Boolean.TRUE.equals(contentResponseBean.getName().equals("fileupload"))) { if (contentResponseBean.getId().equals(applicationFormFieldRequestBean.getFieldId())) { @@ -580,7 +586,8 @@ public class ApplicationDao { formApplicationResponse.setId(formEntity.getId()); formApplicationResponse.setLabel(formEntity.getLabel()); formApplicationResponse.setCallId(formEntity.getCall().getId()); - formApplicationResponse.setContent(Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class)); +// formApplicationResponse.setContent(Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class) + formApplicationResponse.setContent(formDao.convertFormEntityToFormResponseBean(formEntity).getContent()); return formApplicationResponse; } @@ -649,7 +656,8 @@ public class ApplicationDao { } public void validateFormFields(ApplicationRequestBean request, FormEntity formEntity) { - List contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class); +// List contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class); + List contentResponseBeans=formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); List requestFields = request.getFormFields(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 609eb0db..7eca5cf9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -75,6 +75,9 @@ public class ApplicationEvaluationDao { @Autowired ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository; + + @Autowired + private FormDao formDao; private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { @@ -168,41 +171,42 @@ public class ApplicationEvaluationDao { 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) { + Set uniqueFieldIds = new HashSet<>(); + for (CriteriaFormFieldEntity formField : criteriaFormFields) { String formFieldId = formField.getFormFieldId(); + FormEntity formEntity = applicationForm.getForm(); + if (formEntity == null || !formEntity.getId().equals(formField.getFormId())) { + continue; + } if (!uniqueFieldIds.contains(formFieldId)) { CriteriaMappedField mappedField = new CriteriaMappedField(); mappedField.setId(formFieldId); - FormEntity formEntity = getFormEntity(formField.getFormId()); - if (formEntity != null) { - List contentBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); - contentBeans.stream() - .filter(contentBean -> contentBean.getId().equals(formFieldId)) - .findFirst() - .ifPresent(contentBean -> { - mappedField.setFieldLabel(getLabelForField(contentBean)); - switch (contentBean.getName()) { - case "fileupload": - mapFileFieldDetails(mappedField, formFieldId, applicationForm.getId(), applicationId); - break; - - case "checkboxes": - populateOptionFieldsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId, contentBean); - break; - case "paragraph": - handleParagraphField(applicationId, formField, contentBean, mappedField); - break; - default: - populateOptionFieldsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId, contentBean); - } - }); - } + List contentBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); + contentBeans.stream() + .filter(contentBean -> contentBean.getId().equals(formFieldId)) + .findFirst() + .ifPresent(contentBean -> { + mappedField.setFieldLabel(getLabelForField(contentBean)); + switch (contentBean.getName()) { + case "fileupload": + mapFileFieldDetails(mappedField, formFieldId, applicationForm.getId(), applicationId); + break; + case "checkboxes": + populateOptionFieldsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId, contentBean); + break; + case "paragraph": + handleParagraphField(applicationId, formField, contentBean, mappedField); + break; + default: + populateOptionFieldsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId, contentBean); + } + }); mappedFields.add(mappedField); uniqueFieldIds.add(formFieldId); @@ -314,7 +318,8 @@ public class ApplicationEvaluationDao { applicationFormEntities.forEach(applicationForm -> { FormEntity formEntity = applicationForm.getForm(); if (formEntity != null) { - List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); +// List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); + List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); contentResponseBeans.forEach(contentResponseBean -> { if ("fileupload".equals(contentResponseBean.getName()) && contentResponseBean.getId().equals(fieldResponse.getId())) { String label = null; @@ -682,7 +687,8 @@ public class ApplicationEvaluationDao { ApplicationFormEntity applicationForm, Long applicationId) { mappedField.setId(formFieldId); formRepository.findById(criteriaFormField.getFormId()).ifPresent(formEntity -> { - List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); +// List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); + List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); contentResponseBeans.stream().filter(bean -> bean.getId().equals(formFieldId)).findFirst().ifPresent(contentResponseBean -> { String label = getLabel(contentResponseBean); mappedField.setFieldLabel(label); @@ -828,7 +834,8 @@ public class ApplicationEvaluationDao { applicationFormEntities.forEach(applicationForm -> { FormEntity formEntity = applicationForm.getForm(); if (formEntity != null) { - List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); +// List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); + List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); contentResponseBeans.forEach(contentResponseBean -> { if ("fileupload".equals(contentResponseBean.getName()) && contentResponseBean.getId().equals(fieldResponse.getId())) { String label = null; @@ -960,7 +967,8 @@ public class ApplicationEvaluationDao { FormEntity formEntity = formRepository.findById(criteriaFormField.getFormId()).orElse(null); if (formEntity != null) { - List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); +// List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); + List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); contentResponseBeans.stream() .filter(bean -> bean.getId().equals(criteriaFormField.getFormFieldId())) .findFirst() @@ -1125,7 +1133,8 @@ public class ApplicationEvaluationDao { FormEntity formEntity = applicationForm.getForm(); if (formEntity != null) { - List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); +// List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); + List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); for (ContentResponseBean contentResponseBean : contentResponseBeans) { if ("fileupload".equals(contentResponseBean.getName())) { From 3671d1409afe0b40e9074778021750749c036c69 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 8 Nov 2024 21:12:25 +0530 Subject: [PATCH 72/76] updated code --- .../dao/ApplicationEvaluationDao.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 7eca5cf9..e6c7eea9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -672,9 +672,11 @@ public class ApplicationEvaluationDao { for (CriteriaFormFieldEntity criteriaFormField : criteriaFormFields) { String formFieldId = criteriaFormField.getFormFieldId(); if (!mappedFieldMap.containsKey(formFieldId)) { - CriteriaMappedField mappedField = new CriteriaMappedField(); - populateMappedField(mappedField, formFieldId, criteriaFormField, applicationForm, applicationId); - mappedFieldMap.put(formFieldId, mappedField); +// CriteriaMappedField mappedField = new CriteriaMappedField(); + CriteriaMappedField mappedField = populateMappedField(formFieldId, criteriaFormField, applicationForm, applicationId); + if(mappedField != null) { + mappedFieldMap.put(formFieldId, mappedField); + } } } } @@ -682,10 +684,14 @@ public class ApplicationEvaluationDao { return mappedFieldMap; } - private void populateMappedField(CriteriaMappedField mappedField, String formFieldId, + private CriteriaMappedField populateMappedField(String formFieldId, CriteriaFormFieldEntity criteriaFormField, ApplicationFormEntity applicationForm, Long applicationId) { + CriteriaMappedField mappedField = new CriteriaMappedField(); mappedField.setId(formFieldId); + if(Boolean.FALSE.equals(criteriaFormField.getFormId().equals(applicationForm.getForm().getId()))) { + return null; + } formRepository.findById(criteriaFormField.getFormId()).ifPresent(formEntity -> { // List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); @@ -710,6 +716,7 @@ public class ApplicationEvaluationDao { } }); }); + return mappedField; } From ff6d1142de9cad6574a14d152f1d0ecf6856933b Mon Sep 17 00:00:00 2001 From: harish Date: Sat, 9 Nov 2024 12:21:28 +0530 Subject: [PATCH 73/76] Updated code --- .../dao/ApplicationEvaluationDao.java | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index e6c7eea9..81aa20a1 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -203,6 +203,9 @@ public class ApplicationEvaluationDao { case "paragraph": handleParagraphField(applicationId, formField, contentBean, mappedField); break; + case "table": + handleTableField(applicationId, formField, contentBean, mappedField); + break; default: populateOptionFieldsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId, contentBean); } @@ -710,6 +713,9 @@ public class ApplicationEvaluationDao { case "paragraph": handleParagraphField(applicationId, criteriaFormField, contentResponseBean, mappedField); break; + case "table": + handleTableField(applicationId, criteriaFormField, contentResponseBean, mappedField); + break; default: populateOptionFieldsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId, contentResponseBean); @@ -993,7 +999,7 @@ public class ApplicationEvaluationDao { boolean isCheckbox = "checkboxes".equals(contentResponseBean.getName()); boolean isFileUpload = "fileupload".equals(contentResponseBean.getName()); boolean isParagraph = "paragraph".equals(contentResponseBean.getName()); - + boolean isTable = "table".equals(contentResponseBean.getName()); if (isFileUpload) { handleFileUpload(applicationId, criteriaFormField, mappedField); } else if (isCheckbox) { @@ -1001,11 +1007,63 @@ public class ApplicationEvaluationDao { } else if (isParagraph) { handleParagraphField(applicationId, criteriaFormField, contentResponseBean, mappedField); + } else if (isTable) { + handleTableField(applicationId, criteriaFormField, contentResponseBean, mappedField); } else { handleOtherFields(applicationId, criteriaFormField, contentResponseBean, mappedField); } } + private void handleTableField(Long applicationId, CriteriaFormFieldEntity criteriaFormField, + ContentResponseBean contentResponseBean, CriteriaMappedField mappedField) { + Map stateFieldMap = new HashMap<>(); + Map stateFieldBoolean = new HashMap<>(); + + contentResponseBean.getSettings().stream() + .filter(setting -> "table_columns".equals(setting.getName())) + .map(SettingResponseBean::getValue) + .filter(Objects::nonNull) + .filter(settingValue -> settingValue instanceof Map) + .map(settingValue -> (Map) settingValue) + .map(valueMap -> (List>) valueMap.get("stateFieldData")) + .filter(Objects::nonNull) + .flatMap(List::stream) + .forEach(fieldData -> { + String fieldName = (String) fieldData.get("name"); + String fieldLabel = (String) fieldData.get("label"); + Boolean predefined = (Boolean) fieldData.getOrDefault("predefined", false); + + if (fieldName != null) { + stateFieldMap.put(fieldName, fieldLabel); + stateFieldBoolean.put(fieldName, predefined); + } + }); + + findFormFieldValue(applicationId, criteriaFormField.getFormFieldId()).ifPresent(formField -> { + String fieldValue1 = formField.getFieldValue(); + ObjectMapper objectMapper = new ObjectMapper(); + + try { + List> rowsData = objectMapper.readValue(fieldValue1, new TypeReference>>() {}); + + List> tableData = new ArrayList<>(); + for (Map rowData : rowsData) { + Map mappedRow = new HashMap<>(); + rowData.forEach((fieldKey, fieldValue) -> { + String columnLabel = stateFieldMap.getOrDefault(fieldKey, fieldKey); + mappedRow.put(columnLabel, fieldValue); + }); + tableData.add(mappedRow); + } + + mappedField.setFieldValue(tableData); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + + private void handleParagraphField(Long applicationId, CriteriaFormFieldEntity criteriaFormField, ContentResponseBean contentResponseBean, CriteriaMappedField mappedField) { findFormFieldValue(applicationId, criteriaFormField.getFormFieldId()).ifPresent(formField -> { String paragraph = contentResponseBean.getSettings().stream() From c2af1bddc470f317b27c6f6ec7b242d8a6e2df4f Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 11 Nov 2024 13:00:44 +0530 Subject: [PATCH 74/76] Fixed issue with application approval in application evaluation --- .../dao/ApplicationEvaluationDao.java | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 81aa20a1..636b0570 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -458,12 +458,16 @@ public class ApplicationEvaluationDao { private List processCriteria(ApplicationEvaluationEntity entity, ApplicationEvaluationRequest req) { - List existingCriteriaList = entity.getCriteria() != null ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { - }) : new ArrayList<>(); + List incomingCriteriaList = Optional.ofNullable(req.getCriteria()).orElse(new ArrayList<>()); - Map existingCriteriaMap = existingCriteriaList.stream().collect(Collectors.toMap(CriteriaResponse::getId, criteria -> criteria)); + List existingCriteriaList = entity.getCriteria() != null ? + Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() {}) : + new ArrayList<>(); - List updatedCriteriaList = req.getCriteria().stream().map(incoming -> { + Map existingCriteriaMap = existingCriteriaList.stream() + .collect(Collectors.toMap(CriteriaResponse::getId, criteria -> criteria)); + + List updatedCriteriaList = incomingCriteriaList.stream().map(incoming -> { CriteriaRequest request = new CriteriaRequest(); request.setId(incoming.getId()); request.setScore(incoming.getScore()); @@ -471,14 +475,15 @@ public class ApplicationEvaluationDao { CriteriaResponse existingCriteria = existingCriteriaMap.get(incoming.getId()); if (existingCriteria != null) { - request.setScore(incoming.getScore() != null ? incoming.getScore() : null); - request.setValid(incoming.getValid() != null ? incoming.getValid() : 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 -> { + .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()); @@ -492,58 +497,65 @@ public class ApplicationEvaluationDao { private List processChecklist(ApplicationEvaluationEntity entity, ApplicationEvaluationRequest req) { + List incomingChecklistList = Optional.ofNullable(req.getChecklist()).orElse(new ArrayList<>()); + List existingChecklistList = entity.getChecklist() != null ? - Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() { - }) : + Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() {}) : new ArrayList<>(); - Map existingChecklistMap = existingChecklistList.stream().collect(Collectors.toMap(ChecklistResponse::getId, checklist -> checklist)); + Map existingChecklistMap = existingChecklistList.stream() + .collect(Collectors.toMap(ChecklistResponse::getId, checklist -> checklist)); - List updatedChecklistList = req.getChecklist().stream().map(incoming -> { + List updatedChecklistList = incomingChecklistList.stream().map(incoming -> { ChecklistRequest request = new ChecklistRequest(); request.setId(incoming.getId()); request.setValid(incoming.getValid()); ChecklistResponse existingChecklist = existingChecklistMap.get(incoming.getId()); if (existingChecklist != null && incoming.getValid() == null) { - request.setValid(null); + request.setValid(existingChecklist.getValid()); } return request; }).collect(Collectors.toList()); List missingChecklistRequests = existingChecklistList.stream() - .filter(existing -> !updatedChecklistList.stream().map(ChecklistRequest::getId).toList().contains(existing.getId())).map(existing -> { + .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() != null ? existing.getValid() : null); + 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<>(); + List incomingFieldList = Optional.ofNullable(req.getFiles()).orElse(new ArrayList<>()); - Map existingFieldMap = existingFieldList.stream().collect(Collectors.toMap(FieldResponse::getId, field -> field)); + List existingFieldList = entity.getFile() != null ? + Utils.convertJsonToList(entity.getFile(), new TypeReference>() {}) : + new ArrayList<>(); - List updatedFieldList = req.getFiles().stream().map(incoming -> { + Map existingFieldMap = existingFieldList.stream() + .collect(Collectors.toMap(FieldResponse::getId, field -> field)); + + List updatedFieldList = incomingFieldList.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() : 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 -> { + .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()); From 63c70f1d691984eb0356afba9e3133b0b4ff7253 Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 11 Nov 2024 16:33:19 +0530 Subject: [PATCH 75/76] Done ticket GEPAFINBE-88 --- .../tendermanagement/dao/ApplicationEvaluationDao.java | 9 ++++++++- .../model/response/CriteriaMappedField.java | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 636b0570..29d198fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -15,6 +15,7 @@ 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.CallService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -46,6 +47,8 @@ public class ApplicationEvaluationDao { @Autowired private UserService userService; +// @Autowired +// private CallService callService; @Autowired private EvaluationCriteriaRepository evaluationCriteriaRepository; @@ -193,6 +196,7 @@ public class ApplicationEvaluationDao { .findFirst() .ifPresent(contentBean -> { mappedField.setFieldLabel(getLabelForField(contentBean)); + mappedField.setFieldName(contentBean.getName()); switch (contentBean.getName()) { case "fileupload": mapFileFieldDetails(mappedField, formFieldId, applicationForm.getId(), applicationId); @@ -712,6 +716,7 @@ public class ApplicationEvaluationDao { List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); contentResponseBeans.stream().filter(bean -> bean.getId().equals(formFieldId)).findFirst().ifPresent(contentResponseBean -> { String label = getLabel(contentResponseBean); + mappedField.setFieldName(contentResponseBean.getName()); mappedField.setFieldLabel(label); switch (contentResponseBean.getName()) { case "fileupload": @@ -1007,7 +1012,7 @@ public class ApplicationEvaluationDao { String label = getLabelFromSettings(contentResponseBean); mappedField.setFieldLabel(label); - + mappedField.setFieldName(contentResponseBean.getName()); boolean isCheckbox = "checkboxes".equals(contentResponseBean.getName()); boolean isFileUpload = "fileupload".equals(contentResponseBean.getName()); boolean isParagraph = "paragraph".equals(contentResponseBean.getName()); @@ -1290,6 +1295,8 @@ public class ApplicationEvaluationDao { if (existingEntityOptional.isPresent()) { ApplicationEvaluationEntity existingEntity = existingEntityOptional.get(); +// UserEntity userEntity = userService.validateUser(application.getUserId()); +// callService.validatePublishedCall(application.getCall().getId(), userEntity.getHub().getId()); application.setStatus(newStatus.getValue()); application = applicationRepository.save(application); String statusType = application.getStatus(); diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaMappedField.java b/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaMappedField.java index e94e0f73..d730d308 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaMappedField.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CriteriaMappedField.java @@ -6,6 +6,7 @@ import lombok.Data; @Data public class CriteriaMappedField { private String id; + private String fieldName; private String fieldLabel; private Object fieldValue; } From bf21c1e799ee34a3269d935d5c8dac72c95a9b79 Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 11 Nov 2024 19:44:31 +0530 Subject: [PATCH 76/76] Updated sequence of form in pdf --- .../tendermanagement/dao/ApplicationDao.java | 61 +++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index cb1e14c3..3f144d87 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -521,10 +521,63 @@ public class ApplicationDao { } else { List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationEntity.getId()); - for (ApplicationFormEntity applicationFormEntity : applicationFormEntities) { - FormEntity form = formService.validateForm(applicationFormEntity.getForm().getId()); - formEntities.add(form); - addFormApplication(form, applicationEntity, formApplicationResponses); + List sequencedApplicationFormEntity = new ArrayList<>(); + Long formIdMiddle = null; + List flowEdgesList = flowEdgesRepository.findBySourceIdAndCallId( + applicationEntity.getCall().getInitialForm(), applicationEntity.getCall().getId()); + + if (!flowEdgesList.isEmpty()) { + if (flowEdgesList.size() == 1) { + formIdMiddle = flowEdgesList.get(0).getTargetId(); + } else { + List nextFormIds = flowEdgesList.stream() + .map(FlowEdgesEntity::getTargetId) + .toList(); + + FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndCallId( + applicationEntity.getCall().getInitialForm(), applicationEntity.getCall().getId()); + + ApplicationFormFieldEntity applicationFormFieldEntity = applicationFormFieldRepository + .findByFieldIdAndApplicationFormFormIdAndApplicationFormApplicationId( + flowDataEntity.getChoosenField(), applicationEntity.getCall().getInitialForm(), applicationEntity.getId()) + .orElse(null); + + if (applicationFormFieldEntity != null) { + formIdMiddle = flowDataRepository.findByChoosenValueAndFormIdIn( + applicationFormFieldEntity.getFieldValue(), nextFormIds) + .map(FlowDataEntity::getFormId) + .orElse(null); + } + } + } + List applicationFormIds = new ArrayList<>(); + applicationFormIds.add(applicationEntity.getCall().getInitialForm()); + if (formIdMiddle != null && formIdMiddle > 0) { + applicationFormIds.add(formIdMiddle); + } + applicationFormIds.add(applicationEntity.getCall().getFinalForm()); + if (applicationFormEntities.size() == 3) { + for (Long applicationFormId : applicationFormIds) { + for (ApplicationFormEntity applicationFormEntity : applicationFormEntities) { + if (applicationFormEntity.getForm().getId().equals(applicationFormId)) { + sequencedApplicationFormEntity.add(applicationFormEntity); + FormEntity form = formService.validateForm(applicationFormId); + formEntities.add(form); + addFormApplication(form, applicationEntity, formApplicationResponses); + } + } + } + }else { + ApplicationFormEntity applicationFormEntity1=applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(),applicationEntity.getCall().getInitialForm()); + sequencedApplicationFormEntity.add(applicationFormEntity1); + FormEntity form1 = formService.validateForm(applicationFormEntity1.getForm().getId()); + formEntities.add(form1); + addFormApplication(form1, applicationEntity, formApplicationResponses); + ApplicationFormEntity applicationFormEntity2=applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(),applicationEntity.getCall().getFinalForm()); + sequencedApplicationFormEntity.add(applicationFormEntity2); + FormEntity form2= formService.validateForm(applicationFormEntity2.getForm().getId()); + formEntities.add(form2); + addFormApplication(form2, applicationEntity, formApplicationResponses); } }