From cb6189baffdc1a7794a01a76daab1bad14fe41f9 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 4 Mar 2025 15:45:09 +0530 Subject: [PATCH 01/30] Fixed application amendment issue --- .../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 23747301..e9621798 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -1047,7 +1047,7 @@ public class ApplicationAmendmentRequestDao { List amendmentRequests = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse( existingApplicationAmendment.getApplicationEvaluationEntity().getId()); - Boolean allClosed = amendmentRequests.stream().allMatch(amendment -> amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue())); + Boolean allClosed = amendmentRequests.stream().allMatch(amendment -> (amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue()) || amendment.getStatus().equals(ApplicationAmendmentRequestEnum.EXPIRED.getValue()))); ApplicationEntity application = applicationService.validateApplication(existingApplicationAmendment.getApplicationId()); ApplicationEntity oldApplicationEntityData = Utils.getClonedEntityForData(application); if (Boolean.TRUE.equals(allClosed)) { From 59d6387b3fa03be8807382b367a8580655f697bf Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 4 Mar 2025 16:41:34 +0530 Subject: [PATCH 02/30] updated code --- .../tendermanagement/dao/CompanyDocumentDao.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java index f43c6a90..0ef3349a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.dao; +import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.CopyObjectRequest; import jakarta.persistence.criteria.Predicate; @@ -33,6 +34,7 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; +import java.net.URL; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -86,6 +88,9 @@ public class CompanyDocumentDao { @Autowired private Validator validator; + @Autowired + private AmazonS3 amazonS3; + public List uploadFileForCompany(HttpServletRequest request, Long userId, List files, Long companyId, Long documentCategoryId, CompanyDocumentTypeEnum companyDocumentSourceTypeEnum, LocalDateTime expirationDate,String name){ DocumentCategoryEntity categoryEntity = categoryDao.validateCategory(documentCategoryId); validator.validateUserWithCompany(request,companyId); @@ -271,8 +276,11 @@ public class CompanyDocumentDao { s3Client.copyObject(copyRequest); log.info("File copied successfully from {} to {}", oldS3Path, newS3Path); + URL amazonS3Url = amazonS3.getUrl(bucketName, newS3Path); + String fileUrl = amazonS3Url.toString(); + DocumentEntity entity = new DocumentEntity(); - entity.setFilePath(newS3Path); + entity.setFilePath(fileUrl); entity.setFileName(companyDocumentEntity.getFileName()); entity.setSource(DocumentSourceTypeEnum.APPLICATION.getValue()); entity.setType(documentTypeEnum.getValue()); From d1ee521e18a6c823ccdd2c7ccf4e07be726aa03a Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 4 Mar 2025 19:15:27 +0530 Subject: [PATCH 03/30] Fixed issue for application updated date --- .../java/net/gepafin/tendermanagement/dao/ApplicationDao.java | 2 +- 1 file changed, 1 insertion(+), 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 0b565c89..9b3466fe 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -424,7 +424,7 @@ public class ApplicationDao { responseBean.setCallTitle(applicationEntity.getCall().getName()); responseBean.setCallEndDate(applicationEntity.getCall().getEndDate()); responseBean.setCallEndTime(applicationEntity.getCall().getEndTime()); - responseBean.setModifiedDate(applicationEntity.getCall().getUpdatedDate()); + responseBean.setModifiedDate(applicationEntity.getUpdatedDate()); responseBean.setCallId(applicationEntity.getCall().getId()); responseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); responseBean.setStatus(applicationEntity.getStatus()); From 63a60b2522d0a8693f36c0dd25abfadde2eff96d Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 5 Mar 2025 15:03:51 +0530 Subject: [PATCH 04/30] Done ticket GEPAFINBE-181 --- .../constants/GepafinConstant.java | 5 + .../gepafin/tendermanagement/dao/CallDao.java | 137 +++++++++++++++++- .../request/CallPageableRequestBean.java | 3 + 3 files changed, 141 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 8f29a46f..ff6ac233 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -485,6 +485,11 @@ public class GepafinConstant { public static final String USAGE="usage"; public static final String LIMIT="limit"; public static final String DATA="data"; + + public static final String PREFERRED_CALL_ID="preferredCallId"; + + public static final String REGION_ID="regionId"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index c34b32aa..bef8c76f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -4,17 +4,18 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; +import java.sql.Timestamp; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.Predicate; -import jakarta.persistence.criteria.Root; +import jakarta.persistence.criteria.*; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.*; @@ -1058,10 +1059,14 @@ public class CallDao { Integer year = null; String search = null; + Map filters = new HashMap<>(); if (callPageableRequestBean.getGlobalFilters() != null) { year = callPageableRequestBean.getGlobalFilters().getYear(); search = callPageableRequestBean.getGlobalFilters().getSearch(); } + if (callPageableRequestBean.getFilters() != null) { + filters = callPageableRequestBean.getFilters(); + } List predicates = new ArrayList<>(); if (year != null && year > 0) { int filterYear = callPageableRequestBean.getGlobalFilters().getYear(); @@ -1104,7 +1109,7 @@ public class CallDao { .toList(); predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); } - + applyFilters(root, criteriaBuilder, predicates, filters); predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB).get(GepafinConstant.ID), userEntity.getHub().getId())); @@ -1112,6 +1117,130 @@ public class CallDao { } + private void applyFilters(Root root, CriteriaBuilder criteriaBuilder, List predicates, Map filters) { + if (Boolean.FALSE.equals(filters.isEmpty())) { + for (Map.Entry entry : filters.entrySet()) { + String fieldName = entry.getKey(); + FilterCriteria filterCriteria = entry.getValue(); + Object value = filterCriteria.getValue(); + MatchModeEnum matchMode = filterCriteria.getMatchMode(); + + if (value != null && matchMode != null) { + Path fieldPath = getFieldPath(root, fieldName); + if (fieldPath != null) { + applyStringFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); + applyNumberFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); + applyDateFilter(fieldPath, criteriaBuilder, predicates, value, matchMode,root); + } + } + } + } + } + + private void applyStringFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode) { + if (value instanceof String) { + String valueStr = (String) value; + if (fieldPath.getJavaType().equals(String.class)) { + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); + switch (mode) { + case CONTAINS -> + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase() + "%")); + case EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, valueStr)); + case STARTSWITH -> + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), valueStr.toLowerCase() + "%")); + case ENDSWITH -> + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase())); + } + } + } + } + + private void applyNumberFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode) { + if (Number.class.isAssignableFrom(fieldPath.getJavaType())) { + Number numberValue = null; + if (value instanceof Number) { + numberValue = (Number) value; + } + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); + switch (mode) { + case EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, numberValue)); + } + } + } + + + + + private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode, Root root) { + if (fieldPath.getJavaType().equals(LocalDateTime.class)) { + // Convert input string: Replace 'T' with space + String formattedValue = value.toString().replace("T", " "); + + // Handle timezones and UTC (`Z` or `+HH:mm`) + if (formattedValue.contains("Z") || formattedValue.matches(".*[+-]\\d{2}:\\d{2}$")) { + OffsetDateTime offsetDateTime = OffsetDateTime.parse(value.toString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME); + formattedValue = offsetDateTime.toLocalDateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")); + } + + // Check if more than 3 decimal places exist + if (formattedValue.contains(".")) { + int dotIndex = formattedValue.indexOf("."); + if (formattedValue.length() > dotIndex + 4) { + formattedValue = formattedValue.substring(0, dotIndex + 4); // Keep only 3 decimals + } + } else { + formattedValue += ".000"; // Ensure 3 decimals + } + + // Define correct date-time format + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + + // Parse the formatted value into LocalDateTime + LocalDateTime dateTimeValue = LocalDateTime.parse(formattedValue, formatter); + + // Extract only the date portion + LocalDate dateValue = dateTimeValue.toLocalDate(); + + // Convert database field to LocalDate for date-only comparison + Expression dateField = criteriaBuilder.function("DATE", LocalDate.class, fieldPath); + + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); + + switch (mode) { + case DATEIS -> predicates.add(criteriaBuilder.equal(dateField, dateValue)); + case DATEISNOT -> predicates.add(criteriaBuilder.notEqual(dateField, dateValue)); + case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(dateTimeValue))); + case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(dateTimeValue))); + } + } + } + + + + + private Path getFieldPath(Root root, String fieldName) { + try { + return switch (fieldName) { + + case GepafinConstant.REGION_ID -> { + // Ensure join is only created if not already present + Join regionJoin = root.getJoins().stream() + .filter(j -> j.getAttribute().getName().equals("region")) + .findFirst() + .map(j -> (Join) j) + .orElseGet(() -> root.join("region", JoinType.LEFT)); + + yield regionJoin.get("id"); + } + + default -> root.get(fieldName); + }; + } catch (IllegalArgumentException e) { + return null; + } + } + + public CallResponse createCallStep2EvaluationV2(CallEntity callEntity, CreateCallRequestStep2EvaluationV2 createCallRequest, UserEntity user) { convertToDocumentEntities(createCallRequest.getDocs(), callEntity.getId(), DocumentTypeEnum.DOCUMENT); diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java index 8b848c85..260a45e5 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java @@ -4,6 +4,7 @@ import lombok.Data; import net.gepafin.tendermanagement.enums.CallStatusEnum; import java.util.List; +import java.util.Map; @Data public class CallPageableRequestBean { @@ -11,4 +12,6 @@ public class CallPageableRequestBean { private GlobalFilters globalFilters; private List status; + + private Map filters; } From aa092a49d8c99c213a786a25d4c353fd11aed93d Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 5 Mar 2025 16:15:30 +0530 Subject: [PATCH 05/30] Updated code for call pagination filter --- .../tendermanagement/enums/MatchModeEnum.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java index f3ee252c..89eb4268 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java @@ -4,14 +4,14 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum MatchModeEnum { - STARTSWITH("Starts with"), - ENDSWITH("Ends with"), - CONTAINS("Contains"), - EQUALS("Equals"), - DATEIS("Date is"), - DATEISNOT("Date is not"), - BEFORE("Date is before"), - AFTER("Date is after"); + STARTSWITH("starts with"), + ENDSWITH("ends with"), + CONTAINS("contains"), + EQUALS("equals"), + DATEIS("date is"), + DATEISNOT("date is not"), + BEFORE("date is before"), + AFTER("date is after"); private String value; From b6f20674cbc63f90fd273b43f5f2cf97463cd5a5 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 5 Mar 2025 17:31:43 +0530 Subject: [PATCH 06/30] Updated code for date filter in call pagination endpoint --- .../tendermanagement/enums/MatchModeEnum.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java index 89eb4268..878c7f85 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java @@ -4,14 +4,14 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum MatchModeEnum { - STARTSWITH("starts with"), - ENDSWITH("ends with"), + STARTSWITH("startsWith"), + ENDSWITH("endsWith"), CONTAINS("contains"), EQUALS("equals"), - DATEIS("date is"), - DATEISNOT("date is not"), - BEFORE("date is before"), - AFTER("date is after"); + DATEIS("dateIs"), + DATEISNOT("dateIsNot"), + BEFORE("dateBefore"), + AFTER("dateAfter"); private String value; From 0580751b5e3b36e99f0a8b34f7f295b9185f4c8d Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 5 Mar 2025 19:01:27 +0530 Subject: [PATCH 07/30] Inserted new role and a user for confidi --- .../db/changelog/db.changelog-1.0.0.xml | 61 ++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) 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 66bf7b3b..04ed853f 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 @@ -2561,5 +2561,64 @@ - + + select + setval('gepafin_schema.role_id_seq', (select + max(id)+1 + from gepafin_schema.role), false) + + select + setval('gepafin_schema.beneficiary_id_seq', (select + max(id)+1 + from gepafin_schema.beneficiary), false) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 47c816c2647231c64fbb04cf785d9bbd57fad4ce Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 5 Mar 2025 19:37:25 +0530 Subject: [PATCH 08/30] Done ticket GEPAFINBE-182 --- .../gepafin/tendermanagement/dao/CallDao.java | 87 +++++++++++++++++-- .../enums/UserActionContextEnum.java | 3 +- .../service/impl/CallServiceImpl.java | 3 +- 3 files changed, 85 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index c34b32aa..2a549273 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -13,6 +13,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Expression; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; import jakarta.servlet.http.HttpServletRequest; @@ -804,6 +805,30 @@ public class CallDao { } else { calls = callRepository.findByStatusInAndHubId(callStatusList, user.getHub().getId()); } + LocalDateTime now = LocalDateTime.now(); + for (CallEntity call : calls) { + CallEntity oldCallEntity = Utils.getClonedEntityForData(call); + if (CallStatusEnum.PUBLISH.getValue().equals(call.getStatus()) && + call.getEndDate() != null && call.getEndTime() != null) { + LocalDateTime callEndDateTime = LocalDateTime.of(LocalDate.from(call.getEndDate()), call.getEndTime()); + if (callEndDateTime.isBefore(now)) { + call.setStatus(CallStatusEnum.EXPIRED.getValue()); + callRepository.save(call); + } + if (Boolean.FALSE.equals(oldCallEntity.getStatus().equals(call.getStatus()))) { + + loggingUtil.logUserAction(UserActionRequest.builder() + .request(request) + .actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.UPDATE_EXPIRED_CALL) + .build()); + + /** This code is responsible for adding a version history log for the "update call status to EXPIRED" operation **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallEntity).newData(call).build()); + } + } + } + List callIds = calls.stream().map(CallEntity::getId).collect(Collectors.toList()); Map preferredCallsMap = getBeneficiaryPreferredCallsForUser(request,user, callIds, companyId); @@ -980,7 +1005,7 @@ public class CallDao { Translator.toLocale(GepafinConstant.COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL) ); } - Specification spec = search(user, callPageableRequestBean); + Specification spec = search(request,user, callPageableRequestBean); Page entityPage; if (Boolean.TRUE.equals(onlyPreferredCall)) { validator.validateUserWithCompany(request, companyId); @@ -1027,10 +1052,10 @@ public class CallDao { return pageableResponseBean; } - public Specification search(UserEntity userEntity, CallPageableRequestBean callPageableRequestBean) { + public Specification search(HttpServletRequest request,UserEntity userEntity, CallPageableRequestBean callPageableRequestBean) { return (root, query, criteriaBuilder) -> { - List predicates = getPredicates(callPageableRequestBean, criteriaBuilder, root, userEntity); + List predicates = getPredicates(request,callPageableRequestBean, criteriaBuilder, root, userEntity); SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); if (callPageableRequestBean.getGlobalFilters() != null @@ -1053,9 +1078,9 @@ public class CallDao { } - private List getPredicates(CallPageableRequestBean callPageableRequestBean, + private List getPredicates(HttpServletRequest request,CallPageableRequestBean callPageableRequestBean, CriteriaBuilder criteriaBuilder, Root root, UserEntity userEntity) { - + expirePublishedCalls(request); Integer year = null; String search = null; if (callPageableRequestBean.getGlobalFilters() != null) { @@ -1107,11 +1132,61 @@ public class CallDao { predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB).get(GepafinConstant.ID), userEntity.getHub().getId())); - return predicates; } + public void expirePublishedCalls(HttpServletRequest request) { + List expiredCalls = callRepository.findAll((root, query, criteriaBuilder) -> { + Predicate isPublished = criteriaBuilder.equal(root.get(GepafinConstant.STATUS), CallStatusEnum.PUBLISH.name()); + + // Concatenate date and time as a single string + Expression dateTimeString = criteriaBuilder.concat( + root.get(GepafinConstant.END_DATE), + criteriaBuilder.literal(" ") // Space between date and time + ); + Expression fullDateTimeString = criteriaBuilder.concat(dateTimeString, root.get(GepafinConstant.END_TIME)); + + // Convert the concatenated string into TIMESTAMP + Expression endDateTime = criteriaBuilder.function( + "to_timestamp", + LocalDateTime.class, + fullDateTimeString, + criteriaBuilder.literal("YYYY-MM-DD HH24:MI:SS") + ); + + Predicate isExpired = criteriaBuilder.lessThan(endDateTime, LocalDateTime.now()); + + return criteriaBuilder.and(isPublished, isExpired); + }); + + if (!expiredCalls.isEmpty()) { + for (CallEntity call : expiredCalls) { + CallEntity oldCallEntity = Utils.getClonedEntityForData(call); // Clone before modification + call.setStatus(CallStatusEnum.EXPIRED.getValue()); + + if (!oldCallEntity.getStatus().equals(call.getStatus())) { + // Log user action + loggingUtil.logUserAction(UserActionRequest.builder() + .request(request) + .actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.UPDATE_EXPIRED_CALL) + .build()); + + // Add version history log + loggingUtil.addVersionHistory(VersionHistoryRequest.builder() + .request(request) + .actionType(VersionActionTypeEnum.UPDATE) + .oldData(oldCallEntity) + .newData(call) + .build()); + } + } + callRepository.saveAll(expiredCalls); // Save all modified calls at once + } + } + + public CallResponse createCallStep2EvaluationV2(CallEntity callEntity, CreateCallRequestStep2EvaluationV2 createCallRequest, UserEntity user) { convertToDocumentEntities(createCallRequest.getDocs(), callEntity.getId(), DocumentTypeEnum.DOCUMENT); diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index c1d0d83e..766ffc1d 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -213,7 +213,8 @@ public enum UserActionContextEnum { GET_ALL_APPLICATION_AMENDMENT_BY_PAGINATION("GET_ALL_APPLICATION_AMENDMENT_BY_PAGINATION"), GET_ALL_USER_ACTION_BY_PAGINATION("GET_ALL_USER_ACTION_BY_PAGINATION"), GET_ALL_USER_BY_PAGINATION("GET_ALL_USER_BY_PAGINATION"), - UPDATE_CALL_END_DATE_AND_TIME("UPDATE_CALL_END_DATE_AND_TIME"); + UPDATE_CALL_END_DATE_AND_TIME("UPDATE_CALL_END_DATE_AND_TIME"), + UPDATE_EXPIRED_CALL("UPDATE_EXPIRED_CALL") ; private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index c5b6952b..3eaed63d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -61,7 +61,7 @@ public class CallServiceImpl implements CallService { } @Override - @Transactional(readOnly = true) + @Transactional(rollbackFor = Exception.class) public List getAllCalls(HttpServletRequest request,Long companyId,Boolean onlyPreferredCall) { UserEntity user = validator.validateUser(request); return callDao.getAllCalls(request,user,companyId,onlyPreferredCall); @@ -104,6 +104,7 @@ public class CallServiceImpl implements CallService { } @Override + @Transactional(rollbackFor = Exception.class) public PageableResponseBean> getAllCallsByPagination(HttpServletRequest request,Long companyId , Boolean onlyPreferredCall, CallPageableRequestBean callPageableRequestBean) { UserEntity user = validator.validateUser(request); return callDao.getAllCallsByPagination(request,user,companyId,onlyPreferredCall,callPageableRequestBean); From e937f33aebd52f782a68049b49de932c431825fd Mon Sep 17 00:00:00 2001 From: Piyush Date: Wed, 5 Mar 2025 20:31:20 +0530 Subject: [PATCH 09/30] Done ticket GEPAFINBE-178 --- .../constants/GepafinConstant.java | 2 + .../tendermanagement/dao/CompanyDao.java | 138 ++++++++++++++++++ .../enums/UserActionContextEnum.java | 1 + .../model/request/LimitRequest.java | 8 + .../repositories/CompanyRepository.java | 10 ++ .../service/CompanyService.java | 3 + .../service/impl/CompanyServiceImpl.java | 7 + .../gepafin/tendermanagement/util/Utils.java | 8 + .../web/rest/api/CompanyApi.java | 14 ++ .../rest/api/impl/CompanyApiController.java | 13 ++ src/main/resources/message_en.properties | 2 + src/main/resources/message_it.properties | 2 + 12 files changed, 208 insertions(+) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/LimitRequest.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index b04dab53..8cdf2848 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -484,6 +484,8 @@ public class GepafinConstant { public static final String USAGE="usage"; public static final String LIMIT="limit"; public static final String DATA="data"; + + public static final String INVALID_LIMIT = "error.invalid.limit"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java index 1f0446a0..ca9c2621 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java @@ -1,23 +1,33 @@ package net.gepafin.tendermanagement.dao; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.data.domain.Pageable; // Correct package + import java.util.EnumSet; import java.util.List; import java.util.Map; import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.log4j.Log4j2; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.UserCompanyDelegationStatusEnum; +import net.gepafin.tendermanagement.model.request.LimitRequest; +import net.gepafin.tendermanagement.model.response.VatCheckResponseBean; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.FaqRepository; +import net.gepafin.tendermanagement.service.feignClient.VatCheckService; import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.web.rest.api.errors.*; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Component; import net.gepafin.tendermanagement.config.Translator; @@ -27,9 +37,11 @@ import net.gepafin.tendermanagement.model.response.CompanyResponse; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.Utils; +import static net.gepafin.tendermanagement.util.Utils.convertObjectToJsonString; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @Component +@Log4j2 public class CompanyDao { @Autowired @@ -60,6 +72,13 @@ public class CompanyDao { @Autowired private HttpServletRequest request; + + @Autowired + private VatCheckService vatCheckService; // Service to call VAT API + + + private static final String NOT_FOUND_JSON = "{\"data\": \"not found\"}"; + public CompanyResponse createCompany(UserEntity userEntity, CompanyRequest companyRequest) { CompanyEntity existingCompany = companyRepository.findByVatNumberAndHubId(companyRequest.getVatNumber(), userEntity.getHub().getId()); @@ -410,4 +429,123 @@ public class CompanyDao { VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldUserWithCompanyData).newData(existingRelation).build()); } + + + public void updateMissingVatCheckResponses(HttpServletRequest request, LimitRequest limitRequest) { + long limit = limitRequest.getLimit(); + + if (limit <= 0 || limit > 3000) { + log.error("Invalid limit: {}. Limit should be between 1 and 3000.", limit); + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_LIMIT)); + } + + int successfulUpdates = 0; + int failedUpdates = 0; + int invalidVatNumbers = 0; + + Pageable pageable = PageRequest.of(0, (int) limit, Sort.by("id").ascending()); + Page companyPage = companyRepository.findCompaniesWithMissingVatCheck(pageable); + List companies = companyPage.getContent(); + + if (companies.isEmpty()) { + log.info("No companies found with missing VAT check responses."); + return; + } + + log.info("Processing {} companies with missing VAT check responses...", companies.size()); + + for (CompanyEntity company : companies) { + try { + log.info("Processing company ID: {} with VAT number: {}", company.getId(), company.getVatNumber()); + + VatCheckResponseBean vatResponse = companyService.checkVatNumber(request, company.getVatNumber()); + CompanyEntity oldCompanyData = Utils.getClonedEntityForData(company); + + if (vatResponse != null && vatResponse.getVatCheckResponse() != null) { + // Convert response to JSON and update the JSON field + String jsonResponse = Utils.convertMapIntoJsonString(vatResponse.getVatCheckResponse()); + company.setJson(jsonResponse); + log.info("Company ID {}: JSON field updated successfully.", company.getId()); + + // Extract and set codiceAteco field + updateCodiceAtecoField(company); + + successfulUpdates++; + } else { + company.setJson(NOT_FOUND_JSON); + invalidVatNumbers++; + log.warn("Company ID {}: Invalid or null VAT check response. JSON set to '{}'", company.getId(), NOT_FOUND_JSON); + } + + // Adding version history log + /** This code is responsible for adding a version history log for the "Update MissingVatCheckResponses" operation. **/ + loggingUtil.addVersionHistory( + VersionHistoryRequest.builder() + .request(request) + .actionType(VersionActionTypeEnum.UPDATE) + .oldData(oldCompanyData) + .newData(company) + .build()); + + } catch (Exception e) { + failedUpdates++; + log.error("Error updating VAT check response for company ID {}: {}", company.getId(), e.getMessage(), e); + } + } + + companyRepository.saveAll(companies); + + log.info("VAT check update completed. Limit: {} | Successful: {} | Invalid VAT numbers: {} | Failed: {}", + limit, successfulUpdates, invalidVatNumbers, failedUpdates); + } + + private void updateCodiceAtecoField(CompanyEntity company) { + Map vatCheckResponse = Utils.convertJsonStringToMap(company.getJson()); + + if (vatCheckResponse != null && vatCheckResponse.containsKey("data")) { + Object dataObj = vatCheckResponse.get("data"); + + if (dataObj instanceof Map) { + Map dataMap = (Map) dataObj; + log.info("Company ID {}: Available keys inside 'data' -> {}", company.getId(), dataMap.keySet()); + + if (dataMap.containsKey("dettaglio")) { + Object dettaglioObj = dataMap.get("dettaglio"); + + if (dettaglioObj instanceof Map) { + Map dettaglio = (Map) dettaglioObj; + + if (dettaglio.containsKey("codice_ateco")) { + Object codiceAtecoObj = dettaglio.get("codice_ateco"); + + if (codiceAtecoObj instanceof String) { + String codiceAteco = (String) codiceAtecoObj; + + if (codiceAteco != null && !codiceAteco.isEmpty()) { + company.setCodiceAteco(codiceAteco); + log.info("Company ID {}: codiceAteco updated to {}", company.getId(), codiceAteco); + } else { + log.warn("Company ID {}: codiceAteco is null or empty in the response.", company.getId()); + } + } else { + log.warn("Company ID {}: 'codice_ateco' is not a string, actual type: {}", company.getId(), codiceAtecoObj.getClass()); + } + } else { + log.warn("Company ID {}: 'dettaglio' does not contain 'codice_ateco' key.", company.getId()); + } + } else { + log.warn("Company ID {}: 'dettaglio' is not a Map, actual type: {}", company.getId(), dettaglioObj.getClass()); + } + } else { + log.warn("Company ID {}: 'dettaglio' section is missing inside 'data'!", company.getId()); + } + } else { + log.warn("Company ID {}: 'data' is not a Map, actual type: {}", company.getId(), dataObj.getClass()); + } + } else { + log.warn("Company ID {}: 'data' section missing in the JSON response.", company.getId()); + } + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 64a43904..6b5b8ea4 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -65,6 +65,7 @@ public enum UserActionContextEnum { CHECK_COMPANY_VAT_NUMBER("CHECK_COMPANY_VAT_NUMBER"), GET_COMPANY_BY_USER("GET_COMPANY_BY_USER"), REMOVE_COMPANY_FROM_USER("REMOVE_COMPANY_FROM_USER"), + UPDATE_COMPANY_JSON("UPDATE_COMPANY_JSON"), /** LookUpData action context **/ CREATE_LOOKUP_DATA("CREATE_LOOKUP_DATA"), diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LimitRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/LimitRequest.java new file mode 100644 index 00000000..6d360714 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LimitRequest.java @@ -0,0 +1,8 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class LimitRequest { + private Long limit; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java index b9395883..350b9b49 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java @@ -1,7 +1,10 @@ package net.gepafin.tendermanagement.repositories; +import org.springframework.data.domain.Pageable; + import java.util.List; +import org.springframework.data.domain.Page; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -21,5 +24,12 @@ public interface CompanyRepository extends JpaRepository { CompanyEntity findByVatNumberAndHubId(String vatNumber, Long hubId); + @Query(""" + SELECT c FROM CompanyEntity c + WHERE c.vatNumber IS NOT NULL + AND (c.json IS NULL OR c.json = '') +""") + Page findCompaniesWithMissingVatCheck(Pageable pageable); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java b/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java index da36cc15..ae752c04 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java @@ -4,6 +4,7 @@ import java.io.ByteArrayOutputStream; import java.util.List; import java.util.Map; +import net.gepafin.tendermanagement.model.request.LimitRequest; import net.gepafin.tendermanagement.model.response.VatCheckResponseBean; import org.springframework.web.multipart.MultipartFile; @@ -45,4 +46,6 @@ public interface CompanyService { UserWithCompanyEntity getUserWithCompanyEntity(Long userId,Long companyId); void removeCompanyFromList(HttpServletRequest request, Long companyId); + void updateMissingVatCheckResponses(HttpServletRequest request, LimitRequest limitRequest); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java index 092c5102..1e77eddb 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java @@ -4,6 +4,7 @@ import java.io.ByteArrayOutputStream; import java.util.List; import java.util.Map; +import net.gepafin.tendermanagement.model.request.LimitRequest; import net.gepafin.tendermanagement.model.response.VatCheckResponseBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -130,4 +131,10 @@ public class CompanyServiceImpl implements CompanyService { UserEntity userEntity =validator.validateUser(request); companyDao.removeCompanyFromList(userEntity, companyId); } + + @Override + public void updateMissingVatCheckResponses(HttpServletRequest request, LimitRequest limitRequest) { + UserEntity userEntity =validator.validateUser(request); + companyDao.updateMissingVatCheckResponses(request, limitRequest); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 06abaaab..1838bd57 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -788,4 +788,12 @@ public class Utils { public static boolean isValidBoolean(String value) { return "true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value); } + public static Map convertJsonStringToMap(String jsonString) { + try { + return mapper.readValue(jsonString, Map.class); + } catch (Exception e) { + e.printStackTrace(); // Handle the exception + return null; + } + } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java index 6384f4d7..fea29d0d 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java @@ -3,9 +3,11 @@ package net.gepafin.tendermanagement.web.rest.api; import java.util.List; import java.util.Map; +import net.gepafin.tendermanagement.model.request.LimitRequest; import net.gepafin.tendermanagement.model.response.VatCheckResponseBean; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -155,4 +157,16 @@ public interface CompanyApi { ResponseEntity> removeCompanyFromList(HttpServletRequest request, @Parameter(description = "The company id", required = true) @PathVariable("companyId") Long companyId); + + @Operation(summary = "Api to update company with no data through script", 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 = "/updateCompanyJson", produces = { "application/json" }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') ") + ResponseEntity> updateMissingVatCheckResponses(HttpServletRequest request, + @Parameter(description = "Limit request object ", required = true) @RequestBody LimitRequest limitRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java index 0bfb0e7a..64dee16b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java @@ -6,6 +6,7 @@ import java.util.Map; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; +import net.gepafin.tendermanagement.model.request.LimitRequest; import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.model.response.VatCheckResponseBean; import net.gepafin.tendermanagement.util.LoggingUtil; @@ -188,4 +189,16 @@ public class CompanyApiController implements CompanyApi{ return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_DELETE_SUCCESS_MSG))); } + @Override + public ResponseEntity> updateMissingVatCheckResponses(HttpServletRequest request, LimitRequest limitRequest) { + log.info("Api to update company json field"); + + /** This code is responsible for creating user action logs for the "Update company json field" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.UPDATE_COMPANY_JSON).build()); + + companyService.updateMissingVatCheckResponses(request, limitRequest); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_UPDATED_SUCCESS_MSG))); + } } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 36970d79..d29c4a80 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -394,3 +394,5 @@ invalid.expiration.date = Invalid Expiration Date appointment.cannot.be.created = Appointment cannot be created because call doesn't have the template id. appointment.not.created = Appointment not created please try again. validation.failed.checklist=Validation failed for checklist. + +error.invalid.limit=Limit should be between 1 and 3000. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index ce2e539d..6aa57aa3 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -384,3 +384,5 @@ invalid.expiration.date = Data di scadenza non valida appointment.cannot.be.created = Impossibile creare l'appuntamento perch� la chiamata non ha l'ID del modello di appuntamento. appointment.not.created = Appuntamento non creato, riprova validation.failed.checklist=Convalida fallita per la checklist. + +error.invalid.limit=Il limite dovrebbe essere compreso tra 1 e 3000. From e061f734ec75eaccbf153ac1e12a15daaec53505 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 6 Mar 2025 14:05:17 +0530 Subject: [PATCH 10/30] Updated code --- .../net/gepafin/tendermanagement/enums/RoleStatusEnum.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/enums/RoleStatusEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/RoleStatusEnum.java index 31d3e9b8..0891dc93 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/RoleStatusEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/RoleStatusEnum.java @@ -8,7 +8,8 @@ public enum RoleStatusEnum { ROLE_SUPER_ADMIN("ROLE_SUPER_ADMIN"), ROLE_PRE_INSTRUCTOR("ROLE_PRE_INSTRUCTOR"), ROLE_GEPAFIN_OPERATOR("ROLE_GEPAFIN_OPERATOR"), - ROLE_INSTRUCTOR_MANAGER("ROLE_INSTRUCTOR_MANAGER"); + ROLE_INSTRUCTOR_MANAGER("ROLE_INSTRUCTOR_MANAGER"), + ROLE_CONFIDI("ROLE_CONFIDI"); private String value; From f272d6508b8df717d81ccb1fcebc107bee4a30ec Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 6 Mar 2025 19:11:16 +0530 Subject: [PATCH 11/30] Updated permission for confidi role --- src/main/resources/db/changelog/db.changelog-1.0.0.xml | 7 +++++++ 1 file changed, 7 insertions(+) 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 04ed853f..33567244 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 @@ -2621,4 +2621,11 @@ + + + + role_type = 'ROLE_CONFIDI' + + + From 3664c2382e913baedd46218649e68226c9176ba3 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 6 Mar 2025 20:00:34 +0530 Subject: [PATCH 12/30] Done ticket GEPAFINBE-180 --- .../constants/GepafinConstant.java | 2 ++ .../dao/ApplicationAmendmentRequestDao.java | 8 +++++-- .../dao/ApplicationEvaluationDao.java | 22 +++++++++++++------ .../dao/EmailNotificationDao.java | 7 ++++-- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 8f29a46f..f4d5c1e6 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -485,6 +485,8 @@ public class GepafinConstant { public static final String USAGE="usage"; public static final String LIMIT="limit"; public static final String DATA="data"; + + public static final String FILE_SELECT = "fileselect"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index e9621798..aa112e63 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -181,6 +181,7 @@ public class ApplicationAmendmentRequestDao { for (ApplicationFormEntity form : forms) { String content = form.getForm().getContent(); List> result = filterByName(content, "fileupload"); + result.addAll(filterByName(content, GepafinConstant.FILE_SELECT)); List amendmentFormFieldResponses= getIdAndLabelFromResult(result); amendmentFormFieldResponses.removeIf(amendmentFormFieldResponse -> { FieldRequest matchingRequest = fieldRequestMap.get(amendmentFormFieldResponse.getFieldId()); @@ -533,12 +534,15 @@ public class ApplicationAmendmentRequestDao { } return response; } - + private Map extractFieldIdToLabelMap(List forms) { return forms.stream() .flatMap(form -> { String content = form.getForm().getContent(); - return getIdAndLabelFromResult(filterByName(content, "fileupload")).stream(); + List> filteredResults = new ArrayList<>(); + filteredResults.addAll(filterByName(content, "fileupload")); + filteredResults.addAll(filterByName(content, GepafinConstant.FILE_SELECT)); + return getIdAndLabelFromResult(filteredResults).stream(); }) .collect(Collectors.toMap(AmendmentFormFieldResponse::getFieldId, AmendmentFormFieldResponse::getLabel)); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 336db880..7a5807a2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -378,6 +378,9 @@ public class ApplicationEvaluationDao { case "fileupload": mapFileFieldDetails(mappedField, formFieldId, applicationForm.getId(), applicationId); break; + case "fileselect": + mapFileFieldDetails(mappedField, formFieldId, applicationForm.getId(), applicationId); + break; case "checkboxes": populateOptionFieldsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId, contentBean); break; @@ -516,7 +519,7 @@ public class ApplicationEvaluationDao { List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); contentResponseBeans.forEach(contentResponseBean -> { // Check if this is a file upload field that matches the current field response - if ("fileupload".equals(contentResponseBean.getName()) && contentResponseBean.getId().equals(fieldResponse.getId())) { + if (("fileupload".equals(contentResponseBean.getName()) || GepafinConstant.FILE_SELECT.equals(contentResponseBean.getName())) && contentResponseBean.getId().equals(fieldResponse.getId())) { String label = null; // Set the label if available if (contentResponseBean.getSettings() != null) { @@ -1252,7 +1255,9 @@ public class ApplicationEvaluationDao { case "fileupload": populateFileDetailsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId); break; - + case "fileselect": + populateFileDetailsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId); + break; case "checkboxes": populateOptionFieldsAsFieldValue(mappedField, formFieldId, applicationForm, applicationId, contentResponseBean); break; @@ -1402,7 +1407,7 @@ public class ApplicationEvaluationDao { // 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())) { + if (("fileupload".equals(contentResponseBean.getName()) || GepafinConstant.FILE_SELECT.equals(contentResponseBean.getName())) && contentResponseBean.getId().equals(fieldResponse.getId())) { String label = null; if (contentResponseBean.getSettings() != null) { for (SettingResponseBean setting : contentResponseBean.getSettings()) { @@ -1564,9 +1569,10 @@ public class ApplicationEvaluationDao { mappedField.setFieldName(contentResponseBean.getName()); boolean isCheckbox = "checkboxes".equals(contentResponseBean.getName()); boolean isFileUpload = "fileupload".equals(contentResponseBean.getName()); + boolean isFileSelect = GepafinConstant.FILE_SELECT.equals(contentResponseBean.getName()); boolean isParagraph = "paragraph".equals(contentResponseBean.getName()); boolean isTable = "table".equals(contentResponseBean.getName()); - if (isFileUpload) { + if (isFileUpload || isFileSelect ) { handleFileUpload(applicationId, criteriaFormField, mappedField); } else if (isCheckbox) { handleCheckbox(applicationId, criteriaFormField, contentResponseBean, mappedField); @@ -1773,7 +1779,7 @@ public class ApplicationEvaluationDao { List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); for (ContentResponseBean contentResponseBean : contentResponseBeans) { - if ("fileupload".equals(contentResponseBean.getName())) { + if ("fileupload".equals(contentResponseBean.getName()) || GepafinConstant.FILE_SELECT.equals(contentResponseBean.getName())) { String fieldId = contentResponseBean.getId(); Long applicationFormId = applicationForm.getId(); @@ -2103,7 +2109,8 @@ public class ApplicationEvaluationDao { List contentResponseBeans=evaluationFormDao.convertEvaluationFormEntityToEvaluationFormResponseBean(evaluationFormEntity).getContent(); for (ContentResponseBean contentResponseBean:contentResponseBeans){ - if(Boolean.TRUE.equals(contentResponseBean.getName().equals("fileupload"))) { + if(Boolean.TRUE.equals(contentResponseBean.getName().equals("fileupload")) || + Boolean.TRUE.equals(contentResponseBean.getName().equals(GepafinConstant.FILE_SELECT))){ if (contentResponseBean.getId().equals(applicationFormFieldRequestBean.getFieldId())) { Object fieldValueObject = applicationFormFieldRequestBean.getFieldValue(); if (fieldValueObject instanceof String) { @@ -2128,7 +2135,8 @@ public class ApplicationEvaluationDao { for (ApplicationEvaluationFormFieldEntity applicationEvaluationFormFieldEntity : evaluationFormFieldEntities) { Optional fileUploadContent = contentResponseBeans.stream() - .filter(contentResponseBean -> "fileupload".equals(contentResponseBean.getName()) && + .filter(contentResponseBean -> ("fileupload".equals(contentResponseBean.getName()) || + GepafinConstant.FILE_SELECT.equals(contentResponseBean.getName())) && contentResponseBean.getId().equals(applicationEvaluationFormFieldEntity.getFieldId())) .findFirst(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 25b54319..185d1c62 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -184,8 +184,11 @@ public class EmailNotificationDao { // Extract data from forms for (ApplicationFormEntity form : forms) { String content = form.getForm().getContent(); - List> result = filterByName(content, "fileupload"); - allFormFields.addAll(getIdAndLabelFromResult(result)); + List> fileUploadResult = filterByName(content, "fileupload"); + allFormFields.addAll(getIdAndLabelFromResult(fileUploadResult)); + + List> fileSelectResult = filterByName(content,GepafinConstant.FILE_SELECT); + allFormFields.addAll(getIdAndLabelFromResult(fileSelectResult)); } // Process allFormFields and generate bullet points From ada37c004282da7160603589849863ac282d0dd4 Mon Sep 17 00:00:00 2001 From: Piyush Date: Mon, 10 Mar 2025 16:49:27 +0530 Subject: [PATCH 13/30] Fixed number parsing issue --- .../net/gepafin/tendermanagement/util/FieldValidator.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index caccec60..6b286642 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -63,8 +63,8 @@ public class FieldValidator { if (value != null) { if(min!=null) { if(contentResponseBean.getName().equals(GepafinConstant.NUMBER_INPUT)) { - long numericValue = Long.parseLong(value); // Convert String to Long - if (numericValue < min) { + double numericValue = Double.parseDouble(value); // Use double instead of long + if (numericValue < min.doubleValue()) { errors.add(MessageFormat.format( Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MIN), fieldLabel, min)); } @@ -90,8 +90,8 @@ public class FieldValidator { if (value != null) { if (max != null) { if(contentResponseBean.getName().equals(GepafinConstant.NUMBER_INPUT)) { - long numericValue = Long.parseLong(value); // Convert String to Long - if (numericValue > max) { + double numericValue = Double.parseDouble(value); // Convert String to Long + if (numericValue > max.doubleValue()) { errors.add(MessageFormat.format( Translator.toLocale(GepafinConstant.VALIDATION_FIELD_MAX), fieldLabel, max)); } From 1c330ff7139e766991b10c52a2afca9e65949045 Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 10 Mar 2025 20:02:37 +0530 Subject: [PATCH 14/30] Done ticket GEPAFINBE-76 --- .../constants/GepafinConstant.java | 3 +- .../dao/ApplicationAmendmentRequestDao.java | 6 +- .../tendermanagement/dao/ApplicationDao.java | 8 +- .../gepafin/tendermanagement/dao/CallDao.java | 89 +++++++++++++++---- .../dao/CommunicationDao.java | 2 +- .../tendermanagement/dao/DashboardDao.java | 23 +++-- .../tendermanagement/dao/DelegationDao.java | 9 +- .../gepafin/tendermanagement/dao/FaqDao.java | 4 +- .../gepafin/tendermanagement/dao/UserDao.java | 4 +- .../request/CallPageableRequestBean.java | 2 + .../repositories/CallRepository.java | 5 ++ .../repositories/UserRepository.java | 5 ++ .../tendermanagement/service/CallService.java | 2 +- .../service/impl/ApplicationServiceImpl.java | 2 +- .../service/impl/CallServiceImpl.java | 4 +- .../impl/CommunicationServiceImpl.java | 4 +- .../tendermanagement/util/Validator.java | 11 +++ .../web/rest/api/CallApi.java | 2 +- .../web/rest/api/CommunicationApi.java | 4 +- .../web/rest/api/impl/CallApiController.java | 4 +- .../db/changelog/db.changelog-1.0.0.xml | 8 ++ 21 files changed, 152 insertions(+), 49 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index ff6ac233..31d409d6 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -485,10 +485,9 @@ public class GepafinConstant { public static final String USAGE="usage"; public static final String LIMIT="limit"; public static final String DATA="data"; - public static final String PREFERRED_CALL_ID="preferredCallId"; - public static final String REGION_ID="regionId"; + public static final String DELEGATION_TEMPLATE_CONFIDI="DELEGATION_TEMPLATE_CONFIDI"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index e9621798..bcb9efa0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -678,7 +678,7 @@ public class ApplicationAmendmentRequestDao { log.info("Updating application amendement with ID: {}", id); ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); Boolean isBeneficiary=false; - if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { + if (Boolean.FALSE.equals(validator.checkIsBeneficiary()) && Boolean.FALSE.equals(validator.checkIsConfidi()) ) { validator.validatePreInstructor(request, existingApplicationAmendment.getApplicationEvaluationEntity().getUserId()); isBeneficiary=false; } else { @@ -1368,10 +1368,10 @@ public class ApplicationAmendmentRequestDao { .toList(); predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); } - if(Boolean.TRUE.equals(validator.checkIsBeneficiary())) { + if(Boolean.TRUE.equals(validator.checkIsBeneficiary()) || Boolean.TRUE.equals(validator.checkIsConfidi())) { predicates.add(root.get("applicationEvaluationEntity").get("assignedApplicationsEntity").get("application").get("userId").in(userId)); } - if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { + else { predicates.add(root.get("applicationEvaluationEntity").get("assignedApplicationsEntity").get("userId").in(userId)); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 9b3466fe..d49de7fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -389,7 +389,7 @@ public class ApplicationDao { return (root, query, builder) -> { Boolean isBeneficiary = validator.checkIsBeneficiary(); Predicate predicate = builder.isFalse(root.get("isDeleted")); - if (isBeneficiary) { + if (Boolean.TRUE.equals(validator.checkIsBeneficiary()) || Boolean.TRUE.equals(validator.checkIsConfidi())) { predicate = builder.and(predicate, builder.equal(root.get("userId"), userEntity.getId())); } if (callId != null) { @@ -742,7 +742,7 @@ public class ApplicationDao { List formApplicationResponses = new ArrayList<>(); List formEntities = new ArrayList<>(); UserEntity userEntity = validator.validateUser(request); - boolean isBeneficiary = isBeneficiary(userEntity); + boolean isBeneficiary = Boolean.TRUE.equals(validator.checkIsBeneficiary()) || Boolean.TRUE.equals(validator.checkIsConfidi()); ApplicationEntity applicationEntity = isBeneficiary ? applicationRepository.findByIdAndUserIdAndIsDeletedFalse(applicationId, userEntity.getId()) .orElseThrow(() -> new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG))) @@ -1530,8 +1530,8 @@ public class ApplicationDao { } List predicates = new ArrayList<>(); - Boolean isBeneficiary = validator.checkIsBeneficiary(); - if (isBeneficiary) { +// Boolean isBeneficiary = validator.checkIsBeneficiary(); + if (Boolean.TRUE.equals(validator.checkIsBeneficiary()) || Boolean.TRUE.equals(validator.checkIsConfidi())) { predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.USER_ID), userEntity.getId())); } if (year != null && year > 0) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index bef8c76f..94fefebc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -781,30 +781,21 @@ public class CallDao { return createCallResponseBean; } - public List getAllCalls(HttpServletRequest request,UserEntity user, Long companyId,Boolean onlyPreferredCall) { + public List getAllCalls(HttpServletRequest request,UserEntity user, Long companyId,Boolean onlyPreferredCall,Boolean onlyConfidiCall) { String type = user.getRoleEntity().getRoleType(); List callStatusList = CallStatusEnum.getStatusValues(); if (Boolean.FALSE.equals(ROLE_SUPER_ADMIN.getValue().equals(type))) { callStatusList = List.of(CallStatusEnum.PUBLISH.getValue()); } - List calls; +// List calls = List.of(); if (Boolean.TRUE.equals(onlyPreferredCall) && companyId == null) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL)); } + Specification spec = buildCallSpecification(request, user, companyId, onlyPreferredCall, onlyConfidiCall, callStatusList); + + List calls = callRepository.findAll(spec); - if (Boolean.TRUE.equals(onlyPreferredCall)) { - validator.validateUserWithCompany(request, companyId); - UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(user.getId(),companyId); - List preferredCalls = beneficiaryPreferredCallRepository - .findByUserIdAndUserWithCompanyIdAndIsDeletedFalse(user.getId(), userWithCompanyEntity.getId()); - List preferredCallIds = preferredCalls.stream() - .map(BeneficiaryPreferredCallEntity::getCallId) - .collect(Collectors.toList()); - calls = callRepository.findByIdInAndStatusIn(preferredCallIds, callStatusList); - } else { - calls = callRepository.findByStatusInAndHubId(callStatusList, user.getHub().getId()); - } List callIds = calls.stream().map(CallEntity::getId).collect(Collectors.toList()); Map preferredCallsMap = getBeneficiaryPreferredCallsForUser(request,user, callIds, companyId); @@ -825,7 +816,7 @@ public class CallDao { public Map getBeneficiaryPreferredCallsForUser(HttpServletRequest request, UserEntity user, List callIds, Long companyId) { List beneficiaryPreferredCalls; - if (companyId != null && Boolean.TRUE.equals(validator.checkIsBeneficiary())) { + if (companyId != null && (Boolean.TRUE.equals(validator.checkIsBeneficiary()) || Boolean.TRUE.equals(validator.checkIsConfidi()))) { validator.validateUserWithCompany(request, companyId); UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(user.getId(),companyId); beneficiaryPreferredCalls = beneficiaryPreferredCallRepository @@ -994,7 +985,10 @@ public class CallDao { // Add preferredCallIds filtering to the specification spec = spec.and((root, query, criteriaBuilder) -> - root.get(GepafinConstant.ID).in(preferredCallIds) + criteriaBuilder.and( + root.get(GepafinConstant.ID).in(preferredCallIds), + criteriaBuilder.isTrue(root.get("confidi")) + ) ); } entityPage = callRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); @@ -1110,6 +1104,28 @@ public class CallDao { predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); } applyFilters(root, criteriaBuilder, predicates, filters); + Boolean isConfidi = callPageableRequestBean.getConfidi(); + + if (validator.checkIsConfidi()) { + + if (isConfidi == null || isConfidi.equals(Boolean.FALSE)) { + // Ensure no records are returned + return List.of(criteriaBuilder.disjunction()); + } + + if (isConfidi.equals(Boolean.TRUE)) { + predicates.add(criteriaBuilder.isTrue(root.get("confidi"))); + } + } + else if( Boolean.FALSE.equals(validator.checkIsConfidi()) && isConfidi!=null){ + if (isConfidi.equals(Boolean.TRUE)) { + predicates.add(criteriaBuilder.isTrue(root.get("confidi"))); + } + if (isConfidi.equals(Boolean.FALSE)) { + predicates.add(criteriaBuilder.isFalse(root.get("confidi"))); + } + } + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB).get(GepafinConstant.ID), userEntity.getHub().getId())); @@ -1251,4 +1267,45 @@ public class CallDao { createCallResponseBean.setCurrentStep(GepafinConstant.EVALUATION_V2_STEP_2); return createCallResponseBean; } + private Specification buildCallSpecification(HttpServletRequest request, UserEntity user, Long companyId, Boolean onlyPreferredCall, Boolean onlyConfidiCall, List callStatusList) { + return (root, query, criteriaBuilder) -> { + List predicates = new ArrayList<>(); + predicates.add(root.get("status").in(callStatusList)); + + if (Boolean.TRUE.equals(onlyPreferredCall)) { + validator.validateUserWithCompany(request, companyId); + UserWithCompanyEntity userWithCompanyEntity = companyService.getUserWithCompany(user.getId(), companyId); + List preferredCalls = beneficiaryPreferredCallRepository + .findByUserIdAndUserWithCompanyIdAndIsDeletedFalse(user.getId(), userWithCompanyEntity.getId()); + List preferredCallIds = preferredCalls.stream() + .map(BeneficiaryPreferredCallEntity::getCallId) + .collect(Collectors.toList()); + + predicates.add(root.get("id").in(preferredCallIds)); + } else { + predicates.add(criteriaBuilder.equal(root.get("hub").get("id"), user.getHub().getId())); + } + + if (validator.checkIsConfidi()) { + if (onlyConfidiCall==null || Boolean.FALSE.equals(onlyConfidiCall)) { + return criteriaBuilder.conjunction(); + } + + if (onlyConfidiCall!=null && Boolean.TRUE.equals(onlyConfidiCall)) { + predicates.add(criteriaBuilder.isTrue(root.get("confidi"))); + } + }else { + if(onlyConfidiCall!=null) { + if (Boolean.TRUE.equals(onlyConfidiCall)) { + predicates.add(criteriaBuilder.isTrue(root.get("confidi"))); + } + if (Boolean.FALSE.equals(onlyConfidiCall)) { + predicates.add(criteriaBuilder.isFalse(root.get("confidi"))); + } + } + } + + return criteriaBuilder.and(predicates.toArray(new Predicate[0])); + }; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java index d7ef7c83..c41aee3f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java @@ -138,7 +138,7 @@ public class CommunicationDao { if(validator.checkIsPreInstructor()){ communicationEntity.setSenderUserId(amendmentRequest.getApplicationEvaluationEntity().getUserId()); communicationEntity.setReceiverUserId(amendmentRequest.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getApplication().getUserId()); - } else if(validator.checkIsBeneficiary()) { + } else if(Boolean.TRUE.equals(validator.checkIsBeneficiary()) || Boolean.TRUE.equals(validator.checkIsConfidi())) { communicationEntity.setSenderUserId(amendmentRequest.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getApplication().getUserId()); communicationEntity.setReceiverUserId(amendmentRequest.getApplicationEvaluationEntity().getUserId()); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index e80e67e4..25500ada 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -136,8 +136,8 @@ public class DashboardDao { } private void setRegisteredUsers(Widget1 widget1, UserEntity requestedUserEntity) { - Long activeUsers = userRepository.countByStatusAndRoleEntityRoleTypeAndHubId(UserStatusEnum.ACTIVE.getValue(), - RoleStatusEnum.ROLE_BENEFICIARY.getValue(), requestedUserEntity.getHub().getId()); + Long activeUsers = userRepository.countByStatusAndRoleEntityRoleTypeInAndHubId(UserStatusEnum.ACTIVE.getValue(), + List.of(RoleStatusEnum.ROLE_BENEFICIARY.getValue(),RoleStatusEnum.ROLE_CONFIDI.getValue()), requestedUserEntity.getHub().getId()); if (activeUsers != null) { widget1.setNumberOfResgisteredUsers(activeUsers); } @@ -183,10 +183,21 @@ public class DashboardDao { .map(BeneficiaryPreferredCallEntity::getCallId) .collect(Collectors.toList()); List callEntities = callRepository.findByIdIn(callIds); - long activeCallsCount = callEntities.stream() - .filter(call -> CallStatusEnum.PUBLISH.getValue().equals(call.getStatus()) - && userEntity.getHub().getId().equals(call.getHub().getId())) - .count(); + long activeCallsCount=0; + if(Boolean.TRUE.equals(validator.checkIsBeneficiary())) { + activeCallsCount = callEntities.stream() + .filter(call -> CallStatusEnum.PUBLISH.getValue().equals(call.getStatus()) + && userEntity.getHub().getId().equals(call.getHub().getId())) + .count(); + } + if(Boolean.TRUE.equals(validator.checkIsConfidi())) { + activeCallsCount = callEntities.stream() + .filter(call -> CallStatusEnum.PUBLISH.getValue().equals(call.getStatus()) + && userEntity.getHub().getId().equals(call.getHub().getId()) + && call.getConfidi()) // Add this condition for confidi + .count(); + + } beneficiaryWidgetResponseBean.setNumberOfCalls(activeCallsCount); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index 670f9444..a3243c22 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -128,7 +128,12 @@ public class DelegationDao { CompanyEntity companyEntity = companyDao.validateCompany(companyId); companyDao.getUserWithCompany(userEntity.getId(), companyId); updatePlaceholdersForDelegation(user, companyEntity, placeholders, companyDelegationRequest); - DocumentEntity documentEntity = documentRepository.findBySource(GepafinConstant.DELEGATION_TEMPLATE).get(0); + DocumentEntity documentEntity =null; + if(Boolean.TRUE.equals(validator.checkIsConfidi())){ + documentEntity = documentRepository.findBySource(GepafinConstant.DELEGATION_TEMPLATE_CONFIDI).get(0); + }else { + documentEntity = documentRepository.findBySource(GepafinConstant.DELEGATION_TEMPLATE).get(0); + } return generateDocument(placeholders, documentEntity.getFilePath()); } @@ -293,7 +298,7 @@ public class DelegationDao { if (validator.checkIsPreInstructor()) { ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluationByApplicationId(applicationId); validator.validatePreInstructor(request, applicationEvaluationEntity.getUserId()); - } else if (validator.checkIsBeneficiary()) { + } else if (Boolean.TRUE.equals(validator.checkIsBeneficiary()) || Boolean.TRUE.equals(validator.checkIsConfidi())) { userId = validator.validateUser(request).getId(); } return companyService.getUserWithCompany(userId, companyId); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java index e5a41e68..b4b42508 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java @@ -66,7 +66,7 @@ public class FaqDao { CallEntity callEntity = callService.validateCall(callId); FaqEntity entity = createOrUpdateFaqEntity(faqRequest, callEntity, userEntity, LookUpDataTypeEnum.FAQ); FaqEntity oldFaqEntity = Utils.getClonedEntityForData(entity); - if (validator.checkIsBeneficiary() && companyId == null) { + if ((Boolean.TRUE.equals(validator.checkIsBeneficiary()) || Boolean.TRUE.equals(validator.checkIsConfidi())) && companyId == null) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.COMPANY_ID_MANDATORY)); } UserWithCompanyEntity userWithCompanyEntity=null; @@ -132,7 +132,7 @@ public class FaqDao { oldFaqEntity = Utils.getClonedEntityForData(faqEntity); actionType = VersionActionTypeEnum.UPDATE; } else { - if (Boolean.FALSE.equals(userEntity.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue()))) { + if (Boolean.FALSE.equals(userEntity.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue())) && Boolean.FALSE.equals(userEntity.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_CONFIDI.getValue()))) { lookUpDataService.getOrCreateLookUpDataEntity(faqReq, type); } faqEntity = new FaqEntity(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index f1bbb0b7..04f2496e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -169,7 +169,7 @@ public class UserDao { } private BeneficiaryEntity createBeneficiary(RoleEntity roleEntity, UserReq userReq, HubEntity hub) { BeneficiaryEntity beneficiaryEntity = null; - if (RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(roleEntity.getRoleType())) { + if (RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(roleEntity.getRoleType()) || RoleStatusEnum.ROLE_CONFIDI.getValue().equals(roleEntity.getRoleType())) { beneficiaryEntity = new BeneficiaryEntity(); beneficiaryEntity.setAddress(userReq.getAddress()); beneficiaryEntity.setCity(userReq.getCity()); @@ -765,7 +765,7 @@ public class UserDao { HubEntity hubEntity = hubService.valdateHub(userEntity.getHub().getId()); String beneficiaryRoleType = RoleStatusEnum.ROLE_BENEFICIARY.getValue(); - if (validator.checkIsBeneficiary()) { + if (Boolean.TRUE.equals(validator.checkIsBeneficiary()) || Boolean.TRUE.equals(validator.checkIsConfidi())) { // Validate if the new email already exists for another beneficiary in the same hub boolean emailExistsForBeneficiary = userRepository.existsByEmailIgnoreCaseForBeneficiaries( userReq.getEmail(), hubEntity.getUniqueUuid(), beneficiaryRoleType); diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java index 260a45e5..5a76ad97 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java @@ -14,4 +14,6 @@ public class CallPageableRequestBean { private List status; private Map filters; + + private Boolean confidi; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index d666de41..5d2bf7f7 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -54,4 +54,9 @@ public interface CallRepository extends JpaRepository, JpaSpec List findByIdIn(@Param("ids") List ids); + @Query("SELECT c FROM CallEntity c WHERE c.id IN :ids AND c.status IN :status AND c.confidi= :confidi") + List findByIdInAndStatusInAndConfidi(@Param("ids") List ids, @Param("status") List status,Boolean confidi); + + public List findByStatusInAndHubIdAndConfidi(List callStatus, Long hubId,Boolean onlyConfidiCall); + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index 9f58ea49..db2d686e 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.RoleStatusEnum; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; @@ -32,6 +33,10 @@ public interface UserRepository extends JpaRepository, JpaSpec Long countByStatusAndRoleEntityRoleTypeAndHubId(String status, String roleName, Long hubId); + + Long countByStatusAndRoleEntityRoleTypeInAndHubId(String status,List roleName, Long hubId); + + Optional findByBeneficiaryCodiceFiscaleAndHubId(String codiceFiscale, Long hubId); // Boolean existsByBeneficiaryCodiceFiscaleAndHubId(String codiceFiscale, Long hubId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 0e1838b5..925c71cd 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -21,7 +21,7 @@ public interface CallService { CallResponse getCallById (HttpServletRequest request, Long callId,Long companyId); - List getAllCalls(HttpServletRequest request,Long companyId,Boolean onlyPreferredCall); + List getAllCalls(HttpServletRequest request,Long companyId,Boolean onlyPreferredCall,Boolean onlyConfidiCall); CallResponse validateCallData(HttpServletRequest request, Long callId); 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 c98ded2b..8426390e 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -81,7 +81,7 @@ public class ApplicationServiceImpl implements ApplicationService { validator.validateUserWithCompany(request, companyId); } ApplicationEntity applicationEntity =null; - if(validator.checkIsBeneficiary()){ + if(Boolean.TRUE.equals(validator.checkIsBeneficiary()) || Boolean.TRUE.equals(validator.checkIsConfidi())){ if(companyId==null){ throw new ForbiddenAccessException(Status.FORBIDDEN,Translator.toLocale(GepafinConstant.COMPANY_ID_MANDATORY)); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index c5b6952b..8dfbd861 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -62,9 +62,9 @@ public class CallServiceImpl implements CallService { @Override @Transactional(readOnly = true) - public List getAllCalls(HttpServletRequest request,Long companyId,Boolean onlyPreferredCall) { + public List getAllCalls(HttpServletRequest request,Long companyId,Boolean onlyPreferredCall,Boolean onlyConfidiCall) { UserEntity user = validator.validateUser(request); - return callDao.getAllCalls(request,user,companyId,onlyPreferredCall); + return callDao.getAllCalls(request,user,companyId,onlyPreferredCall,onlyConfidiCall); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationServiceImpl.java index ad3513e3..ed51cc7a 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationServiceImpl.java @@ -31,7 +31,7 @@ public class CommunicationServiceImpl implements CommunicationService { @Transactional(rollbackFor = Exception.class) public CommunicationResponseBean addCommentToAmendmentRequest(HttpServletRequest request ,CommunicationRequestBean communicationRequestBean, Long amendmentId) { ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(amendmentId); - if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { + if (Boolean.FALSE.equals(validator.checkIsBeneficiary()) && Boolean.FALSE.equals(validator.checkIsConfidi())) { validator.validatePreInstructor(request, applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getUserId()); } else { validator.validateUserId(request, applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getApplication().getUserId()); @@ -43,7 +43,7 @@ public class CommunicationServiceImpl implements CommunicationService { @Transactional(rollbackFor = Exception.class) public String deleteComment(HttpServletRequest request ,Long amendmentId, Long commentId) { ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(amendmentId); - if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { + if (Boolean.FALSE.equals(validator.checkIsBeneficiary()) && Boolean.FALSE.equals(validator.checkIsConfidi())) { validator.validatePreInstructor(request, applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getUserId()); } else { validator.validateUserId(request, applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getApplication().getUserId()); diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index 4e3335a6..21e2bd1a 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -195,4 +195,15 @@ public class Validator { } return false; } + public Boolean checkIsConfidi() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null && authentication.isAuthenticated()) { + for (GrantedAuthority authority : authentication.getAuthorities()) { + if (RoleStatusEnum.ROLE_CONFIDI.getValue().equals(authority.getAuthority())) { + return true; + } + } + } + return false; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 37af42d4..e1893f5a 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -101,7 +101,7 @@ public interface CallApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "", produces = { "application/json" }) - ResponseEntity>> getAllCalls(HttpServletRequest request,@RequestParam(value = "companyId", required = false) Long companyId , @RequestParam(value = "onlyPreferredCall", required = false, defaultValue = "false") Boolean onlyPreferredCall); + ResponseEntity>> getAllCalls(HttpServletRequest request,@RequestParam(value = "companyId", required = false) Long companyId , @RequestParam(value = "onlyPreferredCall", required = false, defaultValue = "false") Boolean onlyPreferredCall,@RequestParam(value = "onlyConfidiCall", required = false) Boolean onlyConfidiCall); @Operation(summary = "Api to validate call", 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 e50dae85..01070a4e 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 { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PostMapping(value = "/{amendmentId}", produces = { "application/json" }) - @PreAuthorize("hasRole('ROLE_PRE_INSTRUCTOR') || hasRole('ROLE_BENEFICIARY') || hasRole('ROLE_INSTRUCTOR_MANAGER')") + @PreAuthorize("hasRole('ROLE_PRE_INSTRUCTOR') || hasRole('ROLE_BENEFICIARY') || hasRole('ROLE_INSTRUCTOR_MANAGER') || hasRole('ROLE_CONFIDI')") ResponseEntity> addCommentToAmendmentRequest(HttpServletRequest request, @RequestBody @Parameter CommunicationRequestBean communicationResponseBean, @PathVariable(value = "amendmentId") Long amendmentId); @@ -55,7 +55,7 @@ public interface CommunicationApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PutMapping(value = "/{amendmentId}/{commentId}", produces = { "application/json" }) - @PreAuthorize("hasRole('ROLE_PRE_INSTRUCTOR') || hasRole('ROLE_BENEFICIARY') || hasRole('ROLE_INSTRUCTOR_MANAGER')") + @PreAuthorize("hasRole('ROLE_PRE_INSTRUCTOR') || hasRole('ROLE_BENEFICIARY') || hasRole('ROLE_INSTRUCTOR_MANAGER') || hasRole('ROLE_CONFIDI')") ResponseEntity> updateCommunicationAmendment(HttpServletRequest request, @RequestBody @Parameter CommunicationRequestBean communicationResponseBean, @PathVariable(value = "amendmentId") Long amendmentId, @PathVariable(value = "commentId") Long commentId); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 4ea1c575..5673bb2b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -93,13 +93,13 @@ public class CallApiController implements CallApi { @Override @Transactional - public ResponseEntity>> getAllCalls(HttpServletRequest request,Long companyId,Boolean onlyPreferredCall) { + public ResponseEntity>> getAllCalls(HttpServletRequest request,Long companyId,Boolean onlyPreferredCall,Boolean onlyConfidiCall) { /** This code is responsible for creating user action logs for the "get all Calls" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) .actionContext(UserActionContextEnum.GET_CALL).build()); - List calls = callService.getAllCalls(request, companyId, onlyPreferredCall); + List calls = callService.getAllCalls(request, companyId, onlyPreferredCall,onlyConfidiCall); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(calls, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_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 33567244..0bb1adf4 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 @@ -2627,5 +2627,13 @@ role_type = 'ROLE_CONFIDI' + + + + + + + + From f50add618f1286864b096a1cd3c59713d1d86083 Mon Sep 17 00:00:00 2001 From: Piyush Date: Tue, 11 Mar 2025 13:00:12 +0530 Subject: [PATCH 15/30] Fixed null request in version history logging --- .../gepafin/tendermanagement/dao/ApplicationEvaluationDao.java | 2 +- 1 file changed, 1 insertion(+), 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 7a5807a2..e43ef991 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -745,7 +745,7 @@ public class ApplicationEvaluationDao { applicationAmendmentRequestEntities.forEach(applicationAmendmentRequestEntity->{ ApplicationAmendmentRequestEntity oldEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity); updateAmendment(applicationAmendmentRequestEntity, amendmentFormFieldsMap.get(applicationAmendmentRequestEntity.getId())); - loggingUtil.addVersionHistory(VersionHistoryRequest.builder().actionType(VersionActionTypeEnum.UPDATE).oldData(oldEntity).newData(applicationAmendmentRequestEntity).build()); + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldEntity).newData(applicationAmendmentRequestEntity).build()); }); applicationAmendmentRequestRepository.saveAll(applicationAmendmentRequestEntities); From 9a0ebc6843d40663e8f10efbdbbaf6eefbf01718 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 11 Mar 2025 16:44:13 +0530 Subject: [PATCH 16/30] Updated code --- .../gepafin/tendermanagement/dao/CallDao.java | 23 ++++++------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index c57307b4..86a19a42 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -800,18 +800,6 @@ public class CallDao { List calls = callRepository.findAll(spec); - if (Boolean.TRUE.equals(onlyPreferredCall)) { - validator.validateUserWithCompany(request, companyId); - UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(user.getId(),companyId); - List preferredCalls = beneficiaryPreferredCallRepository - .findByUserIdAndUserWithCompanyIdAndIsDeletedFalse(user.getId(), userWithCompanyEntity.getId()); - List preferredCallIds = preferredCalls.stream() - .map(BeneficiaryPreferredCallEntity::getCallId) - .collect(Collectors.toList()); - calls = callRepository.findByIdInAndStatusIn(preferredCallIds, callStatusList); - } else { - calls = callRepository.findByStatusInAndHubId(callStatusList, user.getHub().getId()); - } LocalDateTime now = LocalDateTime.now(); for (CallEntity call : calls) { CallEntity oldCallEntity = Utils.getClonedEntityForData(call); @@ -1156,8 +1144,9 @@ public class CallDao { if (isConfidi.equals(Boolean.TRUE)) { predicates.add(criteriaBuilder.isTrue(root.get("confidi"))); } - } - else if( Boolean.FALSE.equals(validator.checkIsConfidi()) && isConfidi!=null){ + } else if (Boolean.TRUE.equals(validator.checkIsBeneficiary())) { + predicates.add(criteriaBuilder.isFalse(root.get("confidi"))); + } else if( Boolean.FALSE.equals(validator.checkIsConfidi()) && isConfidi!=null){ if (isConfidi.equals(Boolean.TRUE)) { predicates.add(criteriaBuilder.isTrue(root.get("confidi"))); } @@ -1376,13 +1365,15 @@ public class CallDao { if (validator.checkIsConfidi()) { if (onlyConfidiCall==null || Boolean.FALSE.equals(onlyConfidiCall)) { - return criteriaBuilder.conjunction(); + return criteriaBuilder.disjunction(); // Returns an empty predicate (no results) } if (onlyConfidiCall!=null && Boolean.TRUE.equals(onlyConfidiCall)) { predicates.add(criteriaBuilder.isTrue(root.get("confidi"))); } - }else { + } else if (Boolean.TRUE.equals(validator.checkIsBeneficiary())) { + predicates.add(criteriaBuilder.isFalse(root.get("confidi"))); + } else { if(onlyConfidiCall!=null) { if (Boolean.TRUE.equals(onlyConfidiCall)) { predicates.add(criteriaBuilder.isTrue(root.get("confidi"))); From a78a3bcca6b9978eb2fdf610b81681bc0cd0783c Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 11 Mar 2025 16:47:52 +0530 Subject: [PATCH 17/30] Added name in document response --- .../net/gepafin/tendermanagement/dao/CompanyDocumentDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java index 0ef3349a..6b025e27 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java @@ -281,7 +281,7 @@ public class CompanyDocumentDao { DocumentEntity entity = new DocumentEntity(); entity.setFilePath(fileUrl); - entity.setFileName(companyDocumentEntity.getFileName()); + entity.setFileName(companyDocumentEntity.getName()); entity.setSource(DocumentSourceTypeEnum.APPLICATION.getValue()); entity.setType(documentTypeEnum.getValue()); entity.setSourceId(applicationId); From abf2dfb9abfa4439602a05e89fccd8d5fc84f765 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 12 Mar 2025 16:01:34 +0530 Subject: [PATCH 18/30] Update the config for fileselect --- src/main/resources/db/changelog/db.changelog-1.0.0.xml | 5 +++++ .../resources/db/dump/update_form_field_data_12-03-2025.sql | 6 ++++++ 2 files changed, 11 insertions(+) create mode 100644 src/main/resources/db/dump/update_form_field_data_12-03-2025.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 0bb1adf4..333585c8 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 @@ -2636,4 +2636,9 @@ + + + + diff --git a/src/main/resources/db/dump/update_form_field_data_12-03-2025.sql b/src/main/resources/db/dump/update_form_field_data_12-03-2025.sql new file mode 100644 index 00000000..50d0c041 --- /dev/null +++ b/src/main/resources/db/dump/update_form_field_data_12-03-2025.sql @@ -0,0 +1,6 @@ +UPDATE FORM_FIELD +SET LABEL = 'Seleziona File', + SETTINGS = '[{"name": "label", "value": "Seleziona File"},{"name": "documentCategories", "value": []},{"name": "isDelegation", "value": false}]', + UPDATED_DATE = CURRENT_TIMESTAMP +WHERE NAME = 'fileselect'; + From bf5d3d79b3284bb3ee3fb6103b92b33f9d8ed4bd Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 12 Mar 2025 18:51:40 +0530 Subject: [PATCH 19/30] updated code --- .../dao/CompanyDocumentDao.java | 29 ++++++------ .../service/AmazonS3Service.java | 2 + .../service/CompanyDocumentService.java | 2 +- .../service/impl/AmazonS3ServiceImpl.java | 44 ++++++++++++++----- .../impl/CompanyDocumentServiceImpl.java | 4 +- .../web/rest/api/CompanyDocumentApi.java | 2 +- .../impl/CompanyDocumentApiControlller.java | 4 +- 7 files changed, 56 insertions(+), 31 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java index 0ef3349a..20a9f152 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java @@ -258,30 +258,29 @@ public class CompanyDocumentDao { return userActionContext; } - public DocumentResponseBean validateAndDuplicateCompanyDocument(HttpServletRequest request , Long userId ,Long companyDocumentId , Long applicationId , DocumentTypeEnum documentTypeEnum){ + public DocumentResponseBean createDuplicateCompanyDocument(HttpServletRequest request , Long userId ,Long companyDocumentId , Long applicationId , DocumentTypeEnum documentTypeEnum){ ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId); CompanyDocumentEntity companyDocumentEntity = validateCompanyDocument(companyDocumentId); validator.validateUserWithCompany(request,companyDocumentEntity.getCompanyId()); - String oldS3Path = companyDocumentEntity.getFilePath(); - String newS3Path = s3ConfigBean.generateDocumentPath(DocumentSourceTypeEnum.APPLICATION,applicationEntity.getCall().getId(),applicationId,0L); + String companyDocumentPath = companyDocumentEntity.getFilePath(); + String documentPath = s3ConfigBean.generateDocumentPath(DocumentSourceTypeEnum.APPLICATION,applicationEntity.getCall().getId(),applicationId,0L); - log.info("Original Paths - oldPath: {}, newPath: {}", oldS3Path, newS3Path); + log.info("Original Paths - oldPath: {}, newPath: {}", companyDocumentPath, documentPath); - oldS3Path = amazonS3ServiceImpl.decodeS3Key(amazonS3ServiceImpl.cleanOldPath(oldS3Path)); - newS3Path = amazonS3ServiceImpl.cleanNewPath(oldS3Path, newS3Path); - log.info("Moving file from {} to {} in bucket {}", oldS3Path, newS3Path, bucketName); + UploadFileOnAmazonS3Response response; + try { + response = amazonS3ServiceImpl.copyFile(companyDocumentEntity.getName(), companyDocumentPath, documentPath); + } catch (Exception e) { + log.error("Error occurred while uploading file from Amazon S3: {}", e); + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); + } - CopyObjectRequest copyRequest = new CopyObjectRequest(bucketName, oldS3Path, bucketName, newS3Path); - s3Client.copyObject(copyRequest); - log.info("File copied successfully from {} to {}", oldS3Path, newS3Path); - - URL amazonS3Url = amazonS3.getUrl(bucketName, newS3Path); - String fileUrl = amazonS3Url.toString(); DocumentEntity entity = new DocumentEntity(); - entity.setFilePath(fileUrl); - entity.setFileName(companyDocumentEntity.getFileName()); + entity.setFilePath(response.getFilePath()); + entity.setFileName(response.getFileName()); entity.setSource(DocumentSourceTypeEnum.APPLICATION.getValue()); entity.setType(documentTypeEnum.getValue()); entity.setSourceId(applicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java index f9f22ae1..642bbcfc 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java @@ -19,4 +19,6 @@ AmazonS3Service { UploadFileOnAmazonS3Response moveFile(String fileName, String oldPath, String newPath); + UploadFileOnAmazonS3Response copyFile(String fileName, String oldS3Path, String newS3Path); + } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java b/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java index b7604509..ab640840 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CompanyDocumentService.java @@ -20,7 +20,7 @@ public interface CompanyDocumentService { void deleteCompanyFile(HttpServletRequest request,Long companyDocumentId); - DocumentResponseBean validateAndDuplicateCompanyDocument(HttpServletRequest request, Long companyDocumentId, Long applicationId, DocumentTypeEnum typeEnum); + DocumentResponseBean createDuplicateCompanyDocument(HttpServletRequest request, Long companyDocumentId, Long applicationId, DocumentTypeEnum typeEnum); List getAllCompanyDocument(HttpServletRequest request ,Long companyId , CompanyDocumentTypeEnum typeEnum); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java index bff95344..7566f935 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -160,20 +160,14 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { @Override public UploadFileOnAmazonS3Response moveFile(String fileName, String oldPath, String newPath) { try { - log.info("Original Paths - oldPath: {}, newPath: {}", oldPath, newPath); - - oldPath = decodeS3Key(cleanOldPath(oldPath)); - newPath = cleanNewPath(oldPath, newPath); log.info("Moving file from {} to {} in bucket {}", oldPath, newPath, bucketName); - CopyObjectRequest copyRequest = new CopyObjectRequest(bucketName, oldPath, bucketName, newPath); - s3Client.copyObject(copyRequest); - log.info("File copied successfully from {} to {}", oldPath, newPath); + UploadFileOnAmazonS3Response response = copyFile(fileName, oldPath, newPath); - s3Client.deleteObject(bucketName, oldPath); + s3Client.deleteObject(bucketName, decodeS3Key(cleanOldPath(oldPath))); log.info("Original file deleted successfully: {}", oldPath); - String filePath = s3Url + newPath; - return UploadFileOnAmazonS3Response.builder().fileName(fileName).filePath(filePath).build(); + + return response; } catch (AmazonServiceException e) { log.error("AWS service error while moving file: {}", e.getErrorMessage(), e); throw e; @@ -193,4 +187,34 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { public String cleanOldPath(String oldPath) { return oldPath.replace(s3Url, ""); } + + @Override + public UploadFileOnAmazonS3Response copyFile(String fileName, String oldS3Path, String newS3Path){ + try { + log.info("Copying file from {} to {} in bucket {}", oldS3Path, newS3Path, bucketName); + + oldS3Path = decodeS3Key(cleanOldPath(oldS3Path)); + newS3Path = cleanNewPath(oldS3Path, newS3Path); + log.info("Copying file from {} to {} in bucket {}", oldS3Path, newS3Path, bucketName); + + CopyObjectRequest copyRequest = new CopyObjectRequest(bucketName, oldS3Path, bucketName, newS3Path); + s3Client.copyObject(copyRequest); + log.info("File copied successfully from {} to {}", oldS3Path, newS3Path); + + URL amazonS3Url = amazonS3.getUrl(bucketName, newS3Path); + String fileUrl = amazonS3Url.toString(); + return UploadFileOnAmazonS3Response.builder().fileName(fileName).filePath(fileUrl).build(); + } + catch (AmazonServiceException e) { + log.error("AWS service error while copying file: {}", e.getErrorMessage(), e); + throw e; + } catch (SdkClientException e) { + log.error("SDK client error while copying file: {}", e.getMessage(), e); + throw e; + } catch (Exception e) { + log.error("Unexpected error while copying file: {}", e.getMessage(), e); + throw e; + } + + } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java index 8af71f1d..74b680e4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java @@ -53,9 +53,9 @@ public class CompanyDocumentServiceImpl implements CompanyDocumentService { } @Override - public DocumentResponseBean validateAndDuplicateCompanyDocument(HttpServletRequest request, Long companyDocumentId, Long applicationId, DocumentTypeEnum typeEnum) { + public DocumentResponseBean createDuplicateCompanyDocument(HttpServletRequest request, Long companyDocumentId, Long applicationId, DocumentTypeEnum typeEnum) { UserEntity user = validator.validateUser(request); - return companyDocumentDao.validateAndDuplicateCompanyDocument(request, user.getId(), companyDocumentId,applicationId,typeEnum); + return companyDocumentDao.createDuplicateCompanyDocument(request, user.getId(), companyDocumentId,applicationId,typeEnum); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java index f31de82d..fdd53635 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyDocumentApi.java @@ -102,7 +102,7 @@ public interface CompanyDocumentApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) }))}) @PutMapping(value = "/{id}/document/upload", produces = MediaType.APPLICATION_JSON_VALUE) - default ResponseEntity> validateAndDuplicateCompanyDocument (HttpServletRequest httpServletRequest, @Parameter(description = "Company Document Id", required = true) @PathVariable("id") Long companyDocumentId, + default ResponseEntity> createDuplicateCompanyDocument (HttpServletRequest httpServletRequest, @Parameter(description = "Company Document Id", required = true) @PathVariable("id") Long companyDocumentId, @Parameter(description = "Application Id", required = true) @RequestParam Long applicationId, @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java index 83a73f97..543ec40d 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyDocumentApiControlller.java @@ -91,12 +91,12 @@ public class CompanyDocumentApiControlller implements CompanyDocumentApi { } @Override - public ResponseEntity> validateAndDuplicateCompanyDocument(HttpServletRequest httpServletRequest, Long companyDocumentId , Long applicationId,DocumentTypeEnum typeEnum) { + public ResponseEntity> createDuplicateCompanyDocument(HttpServletRequest httpServletRequest, Long companyDocumentId , Long applicationId,DocumentTypeEnum typeEnum) { /** This code is responsible for creating user action logs for the "duplicate company document" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(httpServletRequest).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.DUPLICATE_COMPANY_DOCUMENT).build()); - DocumentResponseBean responseBeans = companyDocumentService.validateAndDuplicateCompanyDocument(httpServletRequest, companyDocumentId,applicationId,typeEnum); + DocumentResponseBean responseBeans = companyDocumentService.createDuplicateCompanyDocument(httpServletRequest, companyDocumentId,applicationId,typeEnum); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_DOCUMENT_COPIED_SUCCESSFULLY))); } From c11814e2062e9db6dd661ab980005f8a21449793 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 13 Mar 2025 12:30:18 +0530 Subject: [PATCH 20/30] Updated code --- .../config/LocalTimeAttributeConverter.java | 18 ++++++++++++++++++ .../tendermanagement/dao/ProtocolDao.java | 3 ++- .../entities/ProtocolEntity.java | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/config/LocalTimeAttributeConverter.java diff --git a/src/main/java/net/gepafin/tendermanagement/config/LocalTimeAttributeConverter.java b/src/main/java/net/gepafin/tendermanagement/config/LocalTimeAttributeConverter.java new file mode 100644 index 00000000..549bc72b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/LocalTimeAttributeConverter.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.config; +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; +import java.sql.Time; +import java.time.LocalTime; + +@Converter(autoApply = true) +public class LocalTimeAttributeConverter implements AttributeConverter { + @Override + public Time convertToDatabaseColumn(LocalTime localTime) { + return (localTime == null ? null : Time.valueOf(localTime)); + } + + @Override + public LocalTime convertToEntityAttribute(Time sqlTime) { + return (sqlTime == null ? null : sqlTime.toLocalTime()); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java index 4601ef8c..b70bc588 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java @@ -49,7 +49,8 @@ public class ProtocolDao { LocalDateTime utcDateTime = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); protocolEntity.setYear(utcDateTime.getYear()); protocolEntity.setProtocolNumber(protocolNumber); - protocolEntity.setTime(LocalTime.now()); + LocalTime time = utcDateTime.toLocalTime().withNano(0); + protocolEntity.setTime(time); protocolEntity.setApplicationId(applicationEntity.getId()); protocolEntity.setHubId(hubId); if(Boolean.TRUE.equals(isForApplication)){ diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java index 47dc5065..69303b41 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Data; +import net.gepafin.tendermanagement.config.LocalTimeAttributeConverter; import java.time.LocalTime; @@ -20,6 +21,7 @@ public class ProtocolEntity extends BaseEntity { private Long call; @Column(name = "TIME", nullable = false) + @Convert(converter = LocalTimeAttributeConverter.class) private LocalTime time; @Column(name="APPLICATION_ID") From 0a8a29ff47eb18afa9314d72e187202499537af6 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 13 Mar 2025 16:12:14 +0530 Subject: [PATCH 21/30] Done ticket GEPAFINBE-186 --- .../tendermanagement/config/MessageSourceConfig.java | 12 ++++++++++++ src/main/resources/message_en.properties | 2 +- src/main/resources/message_it.properties | 3 ++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/MessageSourceConfig.java b/src/main/java/net/gepafin/tendermanagement/config/MessageSourceConfig.java index 6f9767c6..79ef4d11 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/MessageSourceConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/MessageSourceConfig.java @@ -1,8 +1,12 @@ package net.gepafin.tendermanagement.config; +import org.springframework.web.servlet.LocaleResolver; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ResourceBundleMessageSource; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; + +import java.util.Locale; @Configuration public class MessageSourceConfig { @@ -14,4 +18,12 @@ public class MessageSourceConfig { messageSource.setUseCodeAsDefaultMessage(true); return messageSource; } + + @Bean + public LocaleResolver localeResolver() { + // Force the locale resolver to always use Italian + SessionLocaleResolver localeResolver = new SessionLocaleResolver(); + localeResolver.setDefaultLocale(Locale.ITALIAN); + return localeResolver; + } } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index d312160e..93c3ee68 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -53,7 +53,7 @@ call.update.successfully=Call updated successfully. call.fetch.success=Call details fetched successfully. call.not.found=Call not found. score.not.null=Score cannot be null or cannot be zero. -field.not.null={0} cannot be null. +field.not.null={0} cannot be empty. field.not.empty={0} cannot be empty. update_call_status_success_msg=The call status has been updated successfully. status.same.error=Status is already set. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 67a3921c..c698c2f7 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -53,7 +53,7 @@ call.update.successfully=Chiamata aggiornata con successo. call.fetch.success=Dettagli della chiamata recuperati con successo. call.not.found=Chiamata non trovata. score.not.null=Il punteggio non pu? essere nullo o zero. -field.not.null={0} non pu? essere nullo. +field.not.null={0} non può essere vuoto. field.not.empty=la {0} non pu? essere vuota. update_call_status_success_msg=Lo stato della chiamata ? stato aggiornato con successo. status.same.error=Lo stato ? gi? impostato. @@ -386,3 +386,4 @@ appointment.not.created = Appuntamento non creato, riprova validation.failed.checklist=Convalida fallita per la checklist. insufficient.score.msg = Punteggio non sufficiente per passaggio alla valutazione tecnica ed economico finanziaria +validation.table.message=I dati per il campo {0} non sono presenti. \ No newline at end of file From 3f4d997aba2af2b44c14dc660b2e8cd0d76495e1 Mon Sep 17 00:00:00 2001 From: Piyush Date: Mon, 17 Mar 2025 16:36:21 +0530 Subject: [PATCH 22/30] Done ticket GEPAFINBE-183 --- .../constants/GepafinConstant.java | 3 + .../gepafin/tendermanagement/dao/UserDao.java | 68 +++++++++++++------ .../tendermanagement/entities/HubEntity.java | 3 + .../entities/SystemEmailTemplatesEntity.java | 4 +- src/main/resources/application.properties | 5 +- .../db/changelog/db.changelog-1.0.0.xml | 21 ++++++ ...tem_email_template_for_user_13-03-2025.sql | 43 ++++++++++++ ...ate_hub_data_for_hub_config_13-03-2025.sql | 8 +++ ...l_template_for_confidi_user_13-03-2025.sql | 38 +++++++++++ 9 files changed, 169 insertions(+), 24 deletions(-) create mode 100644 src/main/resources/db/dump/insert_system_email_template_for_user_13-03-2025.sql create mode 100644 src/main/resources/db/dump/update_hub_data_for_hub_config_13-03-2025.sql create mode 100644 src/main/resources/db/dump/update_system_email_template_for_confidi_user_13-03-2025.sql diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index ff6ac233..44ee3380 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -490,6 +490,9 @@ public class GepafinConstant { public static final String REGION_ID="regionId"; + public static final String EMAIL_SUPPORT = "email_support"; + public static final String PHONE_SUPPORT = "phone_support"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index f1bbb0b7..890932ee 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -24,11 +24,11 @@ import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; -import net.gepafin.tendermanagement.web.rest.api.errors.ForbiddenAccessException; 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.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -40,10 +40,8 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Component; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; +import java.util.*; -import java.util.Map; import java.util.stream.Collectors; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @@ -77,7 +75,13 @@ public class UserDao { @Value("${default.hub.uuid}") private String defaultHubUuid; - + + @Value("${app.confidi.login.url.suffix}") + private String confidiLogin; + + @Value("${app.bandi.login.url.suffix}") + private String bandiLoginUrlSuffix; + @Autowired private Validator validator; @@ -139,35 +143,57 @@ public class UserDao { loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).newData(userEntity).build()); if(beneficiary == null){ - sendEmailToOnboardingUser(userEntity); + sendEmailToOnboardingUser(userEntity, userReq ); } return token; } - public void sendEmailToOnboardingUser(UserEntity userEntity){ - SystemEmailTemplateResponse emailTemplate = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( - SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.USER_ONBOARDING, userEntity.getHub(), null); + public void sendEmailToOnboardingUser(UserEntity userEntity,UserReq userReq){ + SystemEmailTemplateResponse emailTemplate; + RoleStatusEnum roleStatus = RoleStatusEnum.valueOf(userEntity.getRoleEntity().getRoleType()); + + SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum templateType = + roleStatus.equals(RoleStatusEnum.ROLE_CONFIDI) + ? SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.USER_ONBOARDING_CONFIDI + : SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.USER_ONBOARDING_BANDI; + + emailTemplate = systemEmailTemplatesService.retrieveTemplateByTypeAndCall(templateType, userEntity.getHub(), null); + EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(emailTemplate.getEmailScenario(), RecipientTypeEnum.USER, userEntity.getId(), userEntity.getEmail(), userEntity.getId(), null, null, null); - String firstName = userEntity.getFirstName() != null ? userEntity.getFirstName() : ""; - String lastName = userEntity.getLastName() != null ? userEntity.getLastName() : ""; - String userName = String.join(" ", firstName, lastName).trim(); - String subject = Utils.replacePlaceholders(emailTemplate.getSubject(), Map.of( - "{{user_name}}", userName - )); - String body = Utils.replacePlaceholders(emailTemplate.getHtmlContent(), Map.of( - "{{user_name}}", userName, - "{{user_email}}", userEntity.getEmail() - )); + + Map placeholders = replacePlaceholders(userEntity, userReq); + String body = Utils.replacePlaceholders(emailTemplate.getHtmlContent(), placeholders); emailNotificationDao.sendMail( userEntity.getHub().getId(), - subject, + emailTemplate.getSubject(), body, List.of(userEntity.getEmail()), emailLogRequest ); } - private BeneficiaryEntity createBeneficiary(RoleEntity roleEntity, UserReq userReq, HubEntity hub) { + + private Map replacePlaceholders(UserEntity userEntity, UserReq userReq) { + RoleStatusEnum roleStatus = RoleStatusEnum.valueOf(userEntity.getRoleEntity().getRoleType()); + String confidiLoginUrl = userEntity.getHub().getDomainName() + confidiLogin; + String bandiLoginUrl = userEntity.getHub().getDomainName() + bandiLoginUrlSuffix; + String hubConfigText = userEntity.getHub().getHubConfig(); + JSONObject hubConfig = new JSONObject(hubConfigText); + + String gepafinEmail = hubConfig.optString(GepafinConstant.EMAIL_SUPPORT, ""); + String gepafinPhoneNumber = hubConfig.optString(GepafinConstant.PHONE_SUPPORT, ""); + + Map placeholders = new HashMap<>(); + placeholders.put("{{username}}", userEntity.getEmail()); + placeholders.put("{{userpassword}}",userReq.getPassword()); + String loginUrl = roleStatus.equals(RoleStatusEnum.ROLE_CONFIDI) ? confidiLoginUrl : bandiLoginUrl; + placeholders.put("{{login_url}}",loginUrl); + placeholders.put("{{gepafinphonenumber}}", gepafinPhoneNumber); + placeholders.put("{{gepafinemail}}", gepafinEmail); + return placeholders; + } + + private BeneficiaryEntity createBeneficiary(RoleEntity roleEntity, UserReq userReq, HubEntity hub) { BeneficiaryEntity beneficiaryEntity = null; if (RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(roleEntity.getRoleType())) { beneficiaryEntity = new BeneficiaryEntity(); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java index ccd6c325..603b42b4 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java @@ -66,4 +66,7 @@ public class HubEntity extends BaseEntity{ @Column(name = "EVALUATION_EXPIRATION_DAYS") private Long evaluationExpirationDays; + + @Column(name = "HUB_CONFIG") + private String hubConfig; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java index 8a3c964b..b2c3cfb7 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java @@ -52,10 +52,10 @@ public class SystemEmailTemplatesEntity extends BaseEntity { INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE("INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE"), ADMISSIBILITY_NOTIFICATION("ADMISSIBILITY_NOTIFICATION"), AMENDMENT_REMINDER("AMENDMENT_REMINDER"), - USER_ONBOARDING("USER_ONBOARDING"), + USER_ONBOARDING_CONFIDI("USER_ONBOARDING_CONFIDI"), + USER_ONBOARDING_BANDI("USER_ONBOARDING_BANDI"), PASSWORD_RESET("PASSWORD_RESET"), INADMISSIBILITY_TEMPLATE("INADMISSIBILITY_NOTIFICATION"); - private String value; SystemEmailTemplatesEntityTypeEnum(String value) { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d0af99d3..3b9bd853 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -68,4 +68,7 @@ default.hub.pdf.banner=https://mementoresources.s3.amazonaws.com/gepafin/staging #feign client config spring.cloud.openfeign.client.config.default.connectTimeout=300000 spring.cloud.openfeign.client.config.default.readTimeout=300000 -spring.rabbitmq.connection-timeout=120000 \ No newline at end of file +spring.rabbitmq.connection-timeout=120000 + +app.bandi.login.url.suffix=/loginadmin +app.confidi.login.url.suffix=/confidi \ No newline at end of file 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 04ed853f..22b82c67 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 @@ -2621,4 +2621,25 @@ + + + + + + + + + + + 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_user_13-03-2025.sql b/src/main/resources/db/dump/insert_system_email_template_for_user_13-03-2025.sql new file mode 100644 index 00000000..adf2450a --- /dev/null +++ b/src/main/resources/db/dump/insert_system_email_template_for_user_13-03-2025.sql @@ -0,0 +1,43 @@ +INSERT INTO gepafin_schema.system_email_template +(template_name, "type", html_content, subject, "json", "system", is_deleted, created_date, updated_date, email_scenario) +VALUES +( + 'Welcome Email for New Bandi User', + 'USER_ONBOARDING_BANDI', + ' + +
+

Gentile Utente,

+

Le comunichiamo che il Suo account per accedere al portale è stato creato con successo.

+

Di seguito trova le credenziali di accesso:

+
    +
  • Indirizzo portale: {{login_url}}
  • +
  • Nome utente: {{username}}
  • +
  • Password: {{userpassword}}
  • +
+

Al primo accesso le consigliamo di modificare la password con una nuova di Sua scelta. + Per motivi di sicurezza, Le consigliamo di scegliere una password che:

+
    +
  • Sia composta da almeno 8 caratteri
  • +
  • Contenga lettere maiuscole e minuscole
  • +
  • Includa numeri e caratteri speciali
  • +
+

In caso di difficoltà durante laccesso o per qualsiasi chiarimento, può contattare il nostro servizio di assistenza:

+ +

La invitiamo a conservare queste informazioni in un luogo sicuro e a non condividerle con terzi.

+

Cordiali saluti,

+

{{email_signature}}

+
+ + ', + 'Le Sue Credenziali di Accesso al Portale Bandi', + NULL, + true, + false, + CURRENT_TIMESTAMP, + CURRENT_TIMESTAMP, + 'USER_CREATION' +); diff --git a/src/main/resources/db/dump/update_hub_data_for_hub_config_13-03-2025.sql b/src/main/resources/db/dump/update_hub_data_for_hub_config_13-03-2025.sql new file mode 100644 index 00000000..fafbf66b --- /dev/null +++ b/src/main/resources/db/dump/update_hub_data_for_hub_config_13-03-2025.sql @@ -0,0 +1,8 @@ +UPDATE hub +SET hub_config = '{"email_support": "", "phone_support": ""}' +WHERE unique_uuid = 't7jh5wfg9QXylNaTZkPoE'; + +-- Update hub table with specific email and phone support values +UPDATE hub +SET hub_config = '{"email_support": "email@support.it", "phone_support": "09998888"}' +WHERE unique_uuid = 'p4lk3bcx1RStqTaIVVbXs'; \ No newline at end of file diff --git a/src/main/resources/db/dump/update_system_email_template_for_confidi_user_13-03-2025.sql b/src/main/resources/db/dump/update_system_email_template_for_confidi_user_13-03-2025.sql new file mode 100644 index 00000000..0146994f --- /dev/null +++ b/src/main/resources/db/dump/update_system_email_template_for_confidi_user_13-03-2025.sql @@ -0,0 +1,38 @@ +UPDATE gepafin_schema.system_email_template +SET + template_name = 'Welcome Email for New Confidi User', + "type" = 'USER_ONBOARDING_CONFIDI', + html_content = ' + +
+

Gentile Utente,

+

Le comunichiamo che il Suo account per accedere al portale è stato creato con successo.

+

Di seguito trova le credenziali di accesso:

+ +
  • Indirizzo portale: {{login_url}}
  • +
  • Nome utente: {{username}}
  • +
  • Password: {{userpassword}}
  • + +

    Al primo accesso le consigliamo di modificare la password con una nuova di Sua scelta. + Per motivi di sicurezza, Le consigliamo di scegliere una password che:

    +
      +
    • Sia composta da almeno 8 caratteri
    • +
    • Contenga lettere maiuscole e minuscole
    • +
    • Includa numeri e caratteri speciali
    • +
    +

    In caso di difficoltà durante laccesso o per qualsiasi chiarimento, può contattare il nostro servizio di assistenza:

    + +

    La invitiamo a conservare queste informazioni in un luogo sicuro e a non condividerle con terzi.

    +

    Cordiali saluti,

    +

    {{email_signature}}

    +
    + + ', + subject = 'Le Sue Credenziali di Accesso al Portale Gepafin Confidi', + updated_date = CURRENT_TIMESTAMP +WHERE template_name = 'Welcome Email for New User' AND "type" = 'USER_ONBOARDING'; + + From 82f668c08c52ff4f83d98e6798c45f3d8367c2d2 Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 17 Mar 2025 16:36:58 +0530 Subject: [PATCH 23/30] Fixed issue in form field map --- .../tendermanagement/dao/ApplicationEvaluationDao.java | 4 +++- .../gepafin/tendermanagement/dao/AssignedApplicationsDao.java | 1 + .../model/response/AssignedApplicationsResponse.java | 3 +++ 3 files changed, 7 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 e43ef991..0fd56e6c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -887,7 +887,9 @@ public class ApplicationEvaluationDao { amendmentFormField.setValid(amendmentDetailsRequest.getValid()); } }); - applicationAmendmentRequestEntity.setFormFields(Utils.convertListToJsonString(formFieldsMap.values().stream().toList())); + if(Boolean.FALSE.equals(CollectionUtils.isEmpty(formFieldsMap))) { + applicationAmendmentRequestEntity.setFormFields(Utils.convertListToJsonString(formFieldsMap.values().stream().toList())); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index 1105a7fb..c09c0fb6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -214,6 +214,7 @@ public class AssignedApplicationsDao { assignedApplicationsResponse.setAppointmentTemplateId(application.getCall().getAppointmentTemplateId()); assignedApplicationsResponse.setNdg(application.getNdg()); assignedApplicationsResponse.setAppointmentId(application.getAppointmentId()); + assignedApplicationsResponse.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); return assignedApplicationsResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java index 7f80e8f0..58a6e7da 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -1,6 +1,8 @@ package net.gepafin.tendermanagement.model.response; +import com.amazonaws.services.dynamodbv2.xspec.S; import lombok.Data; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; import net.gepafin.tendermanagement.model.BaseBean; @@ -28,6 +30,7 @@ public class AssignedApplicationsResponse extends BaseBean { private EvaluationVersionEnum evaluationVersion; private String ndg; private String appointmentId; + private ApplicationStatusTypeEnum applicationStatus; } From 8116bceffe03346ee0c18990660d0e5d72703cfe Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 17 Mar 2025 19:04:34 +0530 Subject: [PATCH 24/30] Changes for evaluation document --- .../dao/ApplicationEvaluationDao.java | 51 +++++++++++-------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 0fd56e6c..787192d6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -261,27 +261,32 @@ public class ApplicationEvaluationDao { for (EvaluationDocumentRequest doc : docRequest) { EvaluationDocumentResponse evaluationDocResponse = new EvaluationDocumentResponse(); if (doc.getFileValue() != null) { - Long fileId = Long.valueOf(doc.getFileValue().toString()); - documentRepository.findByIdAndNotDeleted(fileId).ifPresent(documentEntity -> { - DocumentResponseBean documentResponseBean = new DocumentResponseBean(); - documentResponseBean.setId(documentEntity.getId()); - documentResponseBean.setName(documentEntity.getFileName()); - documentResponseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); - documentResponseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); - documentResponseBean.setSourceId(documentEntity.getSourceId()); - documentResponseBean.setFilePath(documentEntity.getFilePath()); - documentResponseBean.setCreatedDate(documentEntity.getCreatedDate()); - documentResponseBean.setUpdatedDate(documentEntity.getUpdatedDate()); - documentResponseBean.setDocumentAttachmentId(documentEntity.getDocumentAttachmentId()); - evaluationDocResponse.setFileValue(List.of(documentResponseBean)); - evaluationDocResponse.setNameValue(doc.getNameValue()); - evaluationDocResponse.setValid(doc.getValid()); - evaluationDocResponse.setFieldId(doc.getFieldId()); - }); - } - if (evaluationDocResponse.getFileValue() == null) { - continue; + if( Boolean.FALSE.equals(doc.getFileValue().isEmpty())) { + Long fileId = Long.valueOf(doc.getFileValue().toString()); + documentRepository.findByIdAndNotDeleted(fileId).ifPresent(documentEntity -> { + DocumentResponseBean documentResponseBean = new DocumentResponseBean(); + documentResponseBean.setId(documentEntity.getId()); + documentResponseBean.setName(documentEntity.getFileName()); + documentResponseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); + documentResponseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); + documentResponseBean.setSourceId(documentEntity.getSourceId()); + documentResponseBean.setFilePath(documentEntity.getFilePath()); + documentResponseBean.setCreatedDate(documentEntity.getCreatedDate()); + documentResponseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + documentResponseBean.setDocumentAttachmentId(documentEntity.getDocumentAttachmentId()); + evaluationDocResponse.setFileValue(List.of(documentResponseBean)); + }); + } + else { + evaluationDocResponse.setFileValue(null); + } + evaluationDocResponse.setNameValue(doc.getNameValue()); + evaluationDocResponse.setValid(doc.getValid()); + evaluationDocResponse.setFieldId(doc.getFieldId()); } +// if (evaluationDocResponse.getFileValue() == null) { +// continue; +// } evaluationDocResponses.add(evaluationDocResponse); } response.setEvaluationDocument(evaluationDocResponses); @@ -1963,8 +1968,10 @@ public class ApplicationEvaluationDao { for (EvaluationDocumentRequest doc : docRequest) { if (doc.getFileValue() != null) { - Long fileId = Long.valueOf(doc.getFileValue()); - documentService.validateDocument(fileId); + if(Boolean.FALSE.equals(doc.getFileValue().isEmpty())) { + Long fileId = Long.valueOf(doc.getFileValue()); + documentService.validateDocument(fileId); + } existingDocs.add(doc); } } From b9f40d77ca4d68d217f8058c03887cf4d0930da9 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 20 Mar 2025 12:56:54 +0530 Subject: [PATCH 25/30] Done ticket GEPAFINBE-187 and GEPAFINBE-188 --- .../constants/GepafinConstant.java | 3 ++- .../dao/ApplicationEvaluationDao.java | 7 +++++++ .../net/gepafin/tendermanagement/dao/PdfDao.java | 12 ++++++++++-- .../response/ApplicationEvaluationResponse.java | 4 +++- .../resources/db/changelog/db.changelog-1.0.0.xml | 14 ++++++++++++++ 5 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index deee5738..247ad90a 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -490,7 +490,8 @@ public class GepafinConstant { public static final String PREFERRED_CALL_ID="preferredCallId"; public static final String REGION_ID="regionId"; public static final String DELEGATION_TEMPLATE_CONFIDI="DELEGATION_TEMPLATE_CONFIDI"; - + public static final String PDF_TRUE="PDF_TRUE"; + public static final String PDF_FALSE="PDF_FALSE"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 787192d6..ae045358 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -186,8 +186,12 @@ public class ApplicationEvaluationDao { List checklistEntities = callTargetAudienceChecklistRepository .findByCallIdAndLookupDataTypeAndIsDeletedFalse(call.getId(), LookUpDataEntity.LookUpDataTypeEnum.CHECKLIST.getValue()); List applicationFormEntities = applicationFormRepository.findByApplicationId(entity.getApplicationId()); + CompanyEntity company=companyService.validateCompany(entity.getAssignedApplicationsEntity().getApplication().getCompanyId()); + setAmendmentDetails(entity,response); + response.setCompanyVatNumber(company.getVatNumber()); + response.setCompanyCodiceAteo(company.getCodiceAteco()); setCriteriaResponses(entity, response, evaluationCriterias); setChecklistResponses(entity, response, checklistEntities); setFieldResponses(entity, response, applicationFormEntities); @@ -1155,6 +1159,7 @@ public class ApplicationEvaluationDao { call = callRepository.findCallEntityByApplicationId(applicationId); assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); } + CompanyEntity company=companyService.validateCompany(application.getCompanyId()); List evaluationCriterias = evaluationCriteriaRepository .findByCallIdAndLookupDataTypeAndIsDeletedFalse(call.getId(), LookUpDataEntity.LookUpDataTypeEnum.EVALUATION_CRITERIA.getValue()); List checklistEntities = callTargetAudienceChecklistRepository @@ -1173,6 +1178,8 @@ public class ApplicationEvaluationDao { response.setCallEndDate(callEndDate); response.setNumberOfCheck(call.getNumberOfCheck()); response.setAppointmentTemplateId(call.getAppointmentTemplateId()); + response.setCompanyVatNumber(company.getVatNumber()); + response.setCompanyCodiceAteo(company.getCodiceAteco()); 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/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 68129e98..46cae083 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.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.model.request.FieldLabelValuePairRequest; import net.gepafin.tendermanagement.model.response.*; +import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.repositories.HubRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.PdfUtils; @@ -54,6 +55,9 @@ public class PdfDao { @Autowired private HubRepository hubRepository; + @Autowired + private DocumentRepository documentRepository; + public static final Logger log = LoggerFactory.getLogger(PdfDao.class); public byte[] generatePdf(HttpServletRequest request,Long applicationId) { @@ -219,8 +223,10 @@ public class PdfDao { if (fieldValue.trim().equalsIgnoreCase("true")) { // Use images for tick and cross try { + DocumentEntity documentEntity = documentRepository.findBySource(GepafinConstant.PDF_TRUE).get(0); + // img = Image.getInstance("true.jpg"); update code after cherry-pick - img = Image.getInstance("https://mementoresources.s3.eu-west-1.amazonaws.com/gepafin/true.png"); + img = Image.getInstance(documentEntity.getFilePath()); } catch (IOException e) { log.error("Error while uploading image for pdf for true"); } @@ -238,7 +244,9 @@ public class PdfDao { } else if (fieldValue.trim().equalsIgnoreCase("false")) { // Use images for tick and cross try { - img = Image.getInstance("https://mementoresources.s3.eu-west-1.amazonaws.com/gepafin/false.png"); + DocumentEntity documentEntity = documentRepository.findBySource(GepafinConstant.PDF_FALSE).get(0); + + img = Image.getInstance(documentEntity.getFilePath()); } catch (IOException e) { log.error("Error while uploading image for pdf for false"); } 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 6ad84281..6e6d6dad 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -47,5 +47,7 @@ public class ApplicationEvaluationResponse { private Long numberOfCheck; private Long appointmentTemplateId; private EvaluationVersionEnum evaluationVersion; - + private String companyVatNumber; + private String companyCodiceAteo; + } 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 333585c8..8d5230ab 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 @@ -2640,5 +2640,19 @@ + + + + + + + + + + + + + + From 54825e065c192e28c8d4433103f44ccb3d219273 Mon Sep 17 00:00:00 2001 From: Piyush Date: Thu, 20 Mar 2025 13:13:32 +0530 Subject: [PATCH 26/30] Updated email template for confidi --- .../net/gepafin/tendermanagement/dao/UserDao.java | 2 +- .../update_hub_data_for_hub_config_13-03-2025.sql | 2 +- ..._email_template_for_confidi_user_13-03-2025.sql | 14 ++++++++------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 3257954c..37ae9b44 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -142,7 +142,7 @@ public class UserDao { /** This code is responsible for adding a version history log for the "Create user" operation. **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).newData(userEntity).build()); - if(beneficiary == null){ + if(Boolean.FALSE.equals(roleEntity.getRoleType().equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue()))){ sendEmailToOnboardingUser(userEntity, userReq ); } return token; diff --git a/src/main/resources/db/dump/update_hub_data_for_hub_config_13-03-2025.sql b/src/main/resources/db/dump/update_hub_data_for_hub_config_13-03-2025.sql index fafbf66b..41cda43b 100644 --- a/src/main/resources/db/dump/update_hub_data_for_hub_config_13-03-2025.sql +++ b/src/main/resources/db/dump/update_hub_data_for_hub_config_13-03-2025.sql @@ -4,5 +4,5 @@ WHERE unique_uuid = 't7jh5wfg9QXylNaTZkPoE'; -- Update hub table with specific email and phone support values UPDATE hub -SET hub_config = '{"email_support": "email@support.it", "phone_support": "09998888"}' +SET hub_config = '{"email_support": "assistenzaportale@gepafin.it", "phone_support": "3517561769"}' WHERE unique_uuid = 'p4lk3bcx1RStqTaIVVbXs'; \ No newline at end of file diff --git a/src/main/resources/db/dump/update_system_email_template_for_confidi_user_13-03-2025.sql b/src/main/resources/db/dump/update_system_email_template_for_confidi_user_13-03-2025.sql index 0146994f..0fa535d3 100644 --- a/src/main/resources/db/dump/update_system_email_template_for_confidi_user_13-03-2025.sql +++ b/src/main/resources/db/dump/update_system_email_template_for_confidi_user_13-03-2025.sql @@ -6,25 +6,26 @@ SET

    Gentile Utente,

    -

    Le comunichiamo che il Suo account per accedere al portale è stato creato con successo.

    +

    Le comunichiamo che il Suo account per accedere al portale Gepafin è stato creato con successo.

    Di seguito trova le credenziali di accesso:

    - +
    • Indirizzo portale: {{login_url}}
    • Nome utente: {{username}}
    • Password: {{userpassword}}
    -

    Al primo accesso le consigliamo di modificare la password con una nuova di Sua scelta. - Per motivi di sicurezza, Le consigliamo di scegliere una password che:

    +

    Al primo accesso le consigliamo di modificare la password con una nuova di Sua scelta.

    +

    Suggerimenti per la sicurezza della password:

    • Sia composta da almeno 8 caratteri
    • Contenga lettere maiuscole e minuscole
    • Includa numeri e caratteri speciali
    -

    In caso di difficoltà durante laccesso o per qualsiasi chiarimento, può contattare il nostro servizio di assistenza:

    +

    Se non avesse effettuato alcuna richiesta di registrazione, La invitiamo a comunicarcelo tempestivamente contattando il nostro servizio di assistenza.

    +

    Contatti per assistenza:

    +

    La invitiamo a conservare queste informazioni in un luogo sicuro e a non condividerle con terzi.

    Cordiali saluti,

    {{email_signature}}

    @@ -36,3 +37,4 @@ SET WHERE template_name = 'Welcome Email for New User' AND "type" = 'USER_ONBOARDING'; + From e311f5bc7ca6caa9ed72ffb5e1b6dc5ba34614a2 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 20 Mar 2025 15:58:56 +0530 Subject: [PATCH 27/30] Updated the field name companyCodiceAteco --- .../tendermanagement/dao/ApplicationEvaluationDao.java | 8 +++++--- .../model/response/ApplicationEvaluationFormResponse.java | 2 ++ .../model/response/ApplicationEvaluationResponse.java | 2 +- 3 files changed, 8 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 ae045358..17cac4c4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -191,7 +191,7 @@ public class ApplicationEvaluationDao { setAmendmentDetails(entity,response); response.setCompanyVatNumber(company.getVatNumber()); - response.setCompanyCodiceAteo(company.getCodiceAteco()); + response.setCompanyCodiceAteco(company.getCodiceAteco()); setCriteriaResponses(entity, response, evaluationCriterias); setChecklistResponses(entity, response, checklistEntities); setFieldResponses(entity, response, applicationFormEntities); @@ -1179,7 +1179,7 @@ public class ApplicationEvaluationDao { response.setNumberOfCheck(call.getNumberOfCheck()); response.setAppointmentTemplateId(call.getAppointmentTemplateId()); response.setCompanyVatNumber(company.getVatNumber()); - response.setCompanyCodiceAteo(company.getCodiceAteco()); + response.setCompanyCodiceAteco(company.getCodiceAteco()); setCriteriaResponses(entity, application.getId(), response, evaluationCriterias); setChecklistResponses(entity, application.getId(), response, checklistEntities); setFileResponses(entity, application.getId(), response, applicationFormEntities); @@ -2248,6 +2248,7 @@ public class ApplicationEvaluationDao { private ApplicationEvaluationFormResponse processEvaluationForm(ApplicationEvaluationEntity evaluationEntity){ Object convertedResponse = convertToResponse(evaluationEntity); + CompanyEntity company=companyService.validateCompany(evaluationEntity.getAssignedApplicationsEntity().getApplication().getCompanyId()); ApplicationEvaluationFormResponse response = objectMapper.convertValue(convertedResponse, ApplicationEvaluationFormResponse.class); EvaluationFormEntity evaluationFormEntity = evaluationFormRepository.findByCallIdAndIsDeletedFalse(evaluationEntity.getAssignedApplicationsEntity().getApplication().getCall().getId()); @@ -2256,7 +2257,8 @@ public class ApplicationEvaluationDao { if (evaluationFormEntity != null) { response.setApplicationEvaluationFormResponse(convertEvaluationFormToResponse(evaluationFormEntity, evaluationEntity)); } - + response.setCompanyVatNumber(company.getVatNumber()); + response.setCompanyCodiceAteco(company.getCodiceAteco()); return response; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java index 0b12a4a6..38530c8a 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java @@ -46,5 +46,7 @@ public class ApplicationEvaluationFormResponse { private EvaluationVersionEnum evaluationVersion; private Long numberOfCheck; private Long appointmentTemplateId; + private String companyVatNumber; + private String companyCodiceAteco; } 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 6e6d6dad..47b018f9 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -48,6 +48,6 @@ public class ApplicationEvaluationResponse { private Long appointmentTemplateId; private EvaluationVersionEnum evaluationVersion; private String companyVatNumber; - private String companyCodiceAteo; + private String companyCodiceAteco; } From 367f4956ce1ad871e74e32537486c65a568ca5a8 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Thu, 20 Mar 2025 19:53:25 +0530 Subject: [PATCH 28/30] Done ticket GEPAFINBE-190 Updated the password handling code for login odessa api and for all other api's. --- .../constants/GepafinConstant.java | 3 + .../tendermanagement/dao/AppointmentDao.java | 173 +++++++++++++----- src/main/resources/message_en.properties | 2 + src/main/resources/message_it.properties | 4 +- 4 files changed, 134 insertions(+), 48 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 87d6ad3e..b192fba5 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -496,6 +496,9 @@ public class GepafinConstant { public static final String PDF_TRUE="PDF_TRUE"; public static final String PDF_FALSE="PDF_FALSE"; + + public static final String PASSWORD_EXPIRED = "PasswordExpired"; + public static final String PASSWORD_EXPIRED_LOGIN_TO_ODESSA = "password.expired.for.login.to.odessa"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index 876ac53d..5a8ee2be 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -14,6 +14,7 @@ import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.AppointmentApiConstant; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.entities.HubEntity; @@ -39,6 +40,7 @@ import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.service.feignClient.AppointmentApiService; +import net.gepafin.tendermanagement.service.impl.ApplicationEvaluationServiceImpl; import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; @@ -60,6 +62,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -138,6 +141,9 @@ public class AppointmentDao { @Autowired private UserRepository userRepository; + @Autowired + private ApplicationEvaluationServiceImpl applicationEvaluationService; + private final Map executorMap = new ConcurrentHashMap<>(); private final ConcurrentHashMap threadForDocumentMap = new ConcurrentHashMap<>(); @@ -162,10 +168,85 @@ public class AppointmentDao { applicationRepository.save(application); // Start async processing + HubEntity hub = hubRepository.findByHubId(application.getHubId()); + loginToOdessa(hub, application); startAsyncNdgProcessing(applicationId); - throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.NDG_GENERATION_IS_IN_PROGRESS)); } + private HubEntity loginToOdessa(HubEntity hub, ApplicationEntity application) { + try { + //code to generate token with payload having "iat" epoch timestamp and secret key with no expiry and send in below method call + String authJwtToken = Utils.generateAuthTokenForLoginToOdessa(); + log.info("Got the auth for login to odessa {}", authJwtToken); + hub.setAuthToken(authJwtToken); + hubRepository.save(hub); + Map body = Collections.emptyMap(); + ResponseEntity responseLogin = appointmentApiService.loginWithOdessa(authJwtToken, source, context, user, password, body); + if (responseLogin.getStatusCode() == HttpStatus.OK) { + log.info("Login successful to odessa. Parsing response."); + String loginResponseJson = Utils.convertObjectToJson(responseLogin.getBody()); + AppointmentLoginResponse parsedResponse = parseLoginResponse(loginResponseJson); + + // Validate and save token + if (parsedResponse.getTokenId() != null) { + hub.setAppointmentAuthTokenId(parsedResponse.getTokenId()); + hub.setAreaCode(parsedResponse.getAreaCode()); + hubRepository.save(hub); + log.info("Saved new authToken and areaCode for Hub."); + return hub; + } else { + throw new RuntimeException("Login response is missing a valid tokenId for login to odessa system, please try again."); + } + } + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.ERROR_IN_GENERATING_NDG_TRY_AGAIN)); + } + catch (FeignException.Forbidden forbiddenException) { + logForbiddenError(); + + // Extract raw response body + String responseBody = forbiddenException.contentUTF8(); // Extract raw JSON response + + // Parse JSON to check for "PasswordExpired" + try { + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(responseBody); + JsonNode errorsNode = rootNode.path("errors"); + + if (errorsNode.isArray()) { + for (JsonNode error : errorsNode) { + // Check the main errorCode + if (GepafinConstant.PASSWORD_EXPIRED.equals(error.path("errorCode").asText())) { + application.setNdgStatus(GepafinConstant.NDG_FAILED); + applicationRepository.save(application); + throw new CustomValidationException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PASSWORD_EXPIRED_LOGIN_TO_ODESSA)); + } + + // Check inside "subErrors" + JsonNode subErrorsNode = error.path("subErrors"); + if (subErrorsNode.isArray()) { + for (JsonNode subError : subErrorsNode) { + if (GepafinConstant.PASSWORD_EXPIRED.equals(subError.path("errorCode").asText())) { + application.setNdgStatus(GepafinConstant.NDG_FAILED); + applicationRepository.save(application); + throw new CustomValidationException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PASSWORD_EXPIRED_LOGIN_TO_ODESSA)); + } + } + } + } + } + } catch (IOException e) { + log.error("Error parsing JSON response: {}", e.getMessage()); + } + + // Regenerate the token and retry + loginToOdessa(hub, application); + } + catch (Exception e) { + log.error("Failed to authenticate user on Odessa : {}", e.getMessage(), e); + throw new RuntimeException("Authentication failed on Odessa. try again", e); + } + return null; + } private void startAsyncNdgProcessing(Long applicationId) { // Check if a thread is already running for this application @@ -259,18 +340,11 @@ public class AppointmentDao { application.setStatus(ApplicationStatusTypeEnum.NDG.getValue()); applicationRepository.save(application); companyRepository.save(company); + ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(application.getApplicationEvaluationId()); + Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.NDG_GENERATION); + notificationDao.sendNotificationToInstructor(placeHolders, applicationEvaluationEntity, NotificationTypeEnum.NDG_GENERATION); + notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.NDG_GENERATION); log.info("NDG saved successfully for applicationId: {}", application.getId()); - - // /** This code is responsible for adding a version history log for the "update application ndg code, status, and Id visura" - // operation. **/ - // loggingUtil.addVersionHistory( - // VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData) - // .newData(application).build()); - // - // /** This code is responsible for adding a version history log for the "update company ndg code" operation. **/ - // loggingUtil.addVersionHistory( - // VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyData) - // .newData(company).build()); break; } @@ -309,10 +383,6 @@ public class AppointmentDao { private void saveNdgAndIdVisura(ApplicationEntity application, CompanyEntity company, String ndg, String idVisura) { - //cloned for old application and company data - // ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(application); - // CompanyEntity oldCompanyData = Utils.getClonedEntityForData(company); - application.setNdg(ndg); application.setIdVisura(idVisura); application.setNdgStatus(GepafinConstant.NDG_GENERATED); @@ -320,17 +390,10 @@ public class AppointmentDao { company.setNdg(ndg); companyRepository.save(company); applicationRepository.save(application); - Map placeHolders=notificationDao.sendNotificationToBeneficiary(application,NotificationTypeEnum.NDG_GENERATION); + ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(application.getApplicationEvaluationId()); + Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.NDG_GENERATION); + notificationDao.sendNotificationToInstructor(placeHolders, applicationEvaluationEntity, NotificationTypeEnum.NDG_GENERATION); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.NDG_GENERATION); - - // /** This code is responsible for adding a version history log for the "update application ndg code, status, and Id visura" operation. **/ - // loggingUtil.addVersionHistory( - // VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData).newData(application).build()); - // - // /** This code is responsible for adding a version history log for the "update company ndg code" operation. **/ - // loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyData).newData - // (company).build()); - log.info("NDG saved for applicationId: {}, {}", application.getId(), application.getNdg()); } @@ -358,18 +421,12 @@ public class AppointmentDao { private HubEntity authenticateAndSaveToken(HubEntity hub) { - // HubEntity oldHubData = Utils.getClonedEntityForData(hub); try { //code to generate token with payload having "iat" epoch timestamp and secret key with no expiry and send in below method call String authJwtToken = Utils.generateAuthTokenForLoginToOdessa(); log.info("Got the auth for login to odessa {}", authJwtToken); hub.setAuthToken(authJwtToken); hubRepository.save(hub); - - // /** This code is responsible for adding a version history log for the "Updating auth token for login api in hub" operation. **/ - // loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldHubData).newData - // (hub).build()); - // Prepare the request body (adjust if necessary for login API) Map body = Collections.emptyMap(); // Perform login API call @@ -387,13 +444,6 @@ public class AppointmentDao { hub.setAreaCode(parsedResponse.getAreaCode()); hubRepository.save(hub); - // /** This code is responsible for adding a version history log for the "inserting token and areaCode from login odessa response for - // appointment flow api's" - // * operation. **/ - // loggingUtil.addVersionHistory( - // VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldHubData).newData(hub) - // .build()); - log.info("Saved new authToken and areaCode for Hub."); return hub; } else { @@ -404,6 +454,38 @@ public class AppointmentDao { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.ERROR_IN_GENERATING_NDG_TRY_AGAIN)); } catch (FeignException.Forbidden forbiddenException) { logForbiddenError(); + + // Extract raw response body + String responseBody = forbiddenException.contentUTF8(); // Extract raw JSON response + + // Parse JSON to check for "PasswordExpired" + try { + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(responseBody); + JsonNode errorsNode = rootNode.path("errors"); + + if (errorsNode.isArray()) { + for (JsonNode error : errorsNode) { + // Check the main errorCode + if (GepafinConstant.PASSWORD_EXPIRED.equals(error.path("errorCode").asText())) { + throw new CustomValidationException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PASSWORD_EXPIRED_LOGIN_TO_ODESSA)); + } + + // Check inside "subErrors" + JsonNode subErrorsNode = error.path("subErrors"); + if (subErrorsNode.isArray()) { + for (JsonNode subError : subErrorsNode) { + if (GepafinConstant.PASSWORD_EXPIRED.equals(subError.path("errorCode").asText())) { + throw new CustomValidationException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PASSWORD_EXPIRED_LOGIN_TO_ODESSA)); + } + } + } + } + } + } catch (IOException e) { + log.error("Error parsing JSON response: {}", e.getMessage()); + } + // Regenerate the token and retry regenerateTokenAndSave(hub); } catch (Exception e) { @@ -435,14 +517,8 @@ public class AppointmentDao { } private String regenerateTokenAndSave(HubEntity hub) { - - try { hub = authenticateAndSaveToken(hub); return "Bearer " + hub.getAppointmentAuthTokenId(); - } catch (Exception e) { - log.error("Failed to regenerate token from Odessa: {}", e.getMessage()); - throw new RuntimeException("Token regeneration failed from Odessa.", e); - } } private AppointmentLoginResponse createVisura(CompanyEntity company, String authorizationToken, HubEntity hub) { @@ -625,6 +701,7 @@ public class AppointmentDao { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.NDG_NOT_FOUND_FOR_APPLICATION)); } + hub = authenticateAndSaveToken(hub); // Generate authorization token and fetch template data String authorizationToken = getBearerToken(hub); Long appointmentTemplateId = application.getCall().getAppointmentTemplateId(); @@ -787,6 +864,10 @@ public class AppointmentDao { Claims claims = tokenProvider.getClaimsFromToken(tokenProvider.extractTokenFromRequest(request)); Long hubId = Utils.extractHubIdFromPayload(claims.getSubject()); + + // Authenticate the hub before proceeding + HubEntity hub = hubRepository.findByHubId(hubId); + authenticateAndSaveToken(hub); if (systemDoc.getDocumentAttachmentId() != null) { // If the documentAttachmentId is already set, return the response log.info("Document already uploaded with documentAttachmentId: {}", systemDoc.getDocumentAttachmentId()); @@ -825,8 +906,6 @@ public class AppointmentDao { } }); return null; - // Return an immediate response indicating the process is in progress -// throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_UPLOADING_IN_PROGRESS)); } private void uploadDocumentToExternalSystemSync(Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest) { diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 51d4983d..2c27f379 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -396,3 +396,5 @@ validation.failed.checklist=Validation failed for checklist. error.invalid.limit=Limit should be between 1 and 3000. insufficient.score.msg = Insufficient score to pass to the technical and economic-financial evaluation + +password.expired.for.login.to.odessa = Odessa login password has been expired. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 8689fc2c..7b0293bf 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -387,4 +387,6 @@ validation.failed.checklist=Convalida fallita per la checklist. error.invalid.limit=Il limite dovrebbe essere compreso tra 1 e 3000. insufficient.score.msg = Punteggio non sufficiente per passaggio alla valutazione tecnica ed economico finanziaria -validation.table.message=I dati per il campo {0} non sono presenti. \ No newline at end of file +validation.table.message=I dati per il campo {0} non sono presenti. + +password.expired.for.login.to.odessa = La password di accesso a Odessa è scaduta \ No newline at end of file From d5d62ecab3d8bc9ea74ed11316c1a5500eb3a2f5 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Thu, 20 Mar 2025 22:11:10 +0530 Subject: [PATCH 29/30] Updated password in properties for user login to Odessa for production. --- src/main/resources/application-dev.properties | 2 +- src/main/resources/application-local.properties | 2 +- src/main/resources/application-production.properties | 2 +- src/main/resources/application-testing.properties | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index b865c960..fc0e08ce 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -20,7 +20,7 @@ default.hub.uuid=p4lk3bcx1RStqTaIVVbXs #Login to Odessa, Appointment Creation, Upload document Configuration appointment.base.url=https://demo.galileonetwork.it/gateway/rest appointment.portal.user=UtenzaAPIPortal@621 -appointment.portal.password=u13nzaAP1P0rtal +appointment.portal.password=u13nzaAP1P0rtal! appointment.portal.source=GEPAFINPORTAL appointment.portal.context=GEPAFINPORTAL flagDaFirmare=false diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 1f1f0eb0..b67592dc 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -18,7 +18,7 @@ default.hub.uuid=p4lk3bcx1RStqTaIVVbXs appointment.base.url=https://demo.galileonetwork.it/gateway/rest appointment.portal.user=UtenzaAPIPortal@621 -appointment.portal.password=u13nzaAP1P0rtal +appointment.portal.password=u13nzaAP1P0rtal! appointment.portal.source=GEPAFINPORTAL appointment.portal.context=GEPAFINPORTAL flagDaFirmare=false diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index d941e7fc..30cb6bee 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -27,7 +27,7 @@ default.hub.uuid=p4lk3bcx1RStqTaIVVbXs #Login to Odessa, Appointment Creation, Upload document Configuration appointment.base.url=https://prd.galileonetwork.it/gateway/rest appointment.portal.user=UtenzaAPIPortal@621 -appointment.portal.password=u13nzaAP1P0rtal +appointment.portal.password=u13nzaAP1P0rtal! appointment.portal.source=GEPAFINPORTAL appointment.portal.context=GEPAFINPORTAL flagDaFirmare=true diff --git a/src/main/resources/application-testing.properties b/src/main/resources/application-testing.properties index 7c5751c4..c8e93e85 100644 --- a/src/main/resources/application-testing.properties +++ b/src/main/resources/application-testing.properties @@ -16,7 +16,7 @@ default.hub.uuid=p4lk3bcx1RStqTaIVVbXs appointment.base.url=https://demo.galileonetwork.it/gateway/rest appointment.portal.user=UtenzaAPIPortal@621 -appointment.portal.password=u13nzaAP1P0rtal +appointment.portal.password=u13nzaAP1P0rtal! appointment.portal.source=GEPAFINPORTAL appointment.portal.context=GEPAFINPORTAL flagDaFirmare=false From ce21dc23f66489abf3bc8d26a54f8e6c4275c9ad Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 21 Mar 2025 12:06:51 +0530 Subject: [PATCH 30/30] Updated code --- .../net/gepafin/tendermanagement/dao/CompanyDocumentDao.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java index 67bc107c..53a1f410 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java @@ -277,10 +277,6 @@ public class CompanyDocumentDao { Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); } - - URL amazonS3Url = amazonS3.getUrl(bucketName, newS3Path); - String fileUrl = amazonS3Url.toString(); - DocumentEntity entity = new DocumentEntity(); entity.setFilePath(response.getFilePath()); entity.setFileName(response.getFileName());