From 0d7306cf7834d0c03ac549e4ae9e865cf209a13b Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 1 Apr 2025 11:42:19 +0530 Subject: [PATCH 01/10] Fixed call date and time check issue --- .../tendermanagement/dao/ApplicationDao.java | 30 ++++++++++--------- .../gepafin/tendermanagement/dao/CallDao.java | 4 +-- .../tendermanagement/util/DateTimeUtil.java | 11 +++++++ 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index d49de7fd..c7592e3e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -941,7 +941,7 @@ public class ApplicationDao { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_IN_PREVIOUS_STATUS)); } if (status.equals(ApplicationStatusTypeEnum.SUBMIT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.READY.getValue()))) { - callService.validatePublishedCall(applicationEntity.getCall().getId(), userEntity.getHub().getId()); +// callService.validatePublishedCall(applicationEntity.getCall().getId(), userEntity.getHub().getId()); Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub()); ProtocolEntity protocolEntity = protocolDao.createProtocolEntity(applicationEntity, protocolNumber, userEntity.getHub().getId(),true); applicationEntity.setProtocol(protocolEntity); @@ -1724,19 +1724,21 @@ public class ApplicationDao { public void checkCallEndDate(CallEntity call) { - LocalDateTime now = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); - - LocalDateTime callEndDateTime = LocalDateTime.of( - call.getEndDate().toLocalDate(), - call.getEndTime() - ); - - if (now.isAfter(callEndDateTime)) { - throw new CustomValidationException( - Status.BAD_REQUEST, - Translator.toLocale(GepafinConstant.CALL_EXPIRED) - ); - } + + callService.validatePublishedCall(call.getId(), call.getHub().getId()); +// LocalDateTime now = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); +// +// LocalDateTime callEndDateTime = LocalDateTime.of( +// call.getEndDate().toLocalDate(), +// call.getEndTime() +// ); +// +// if (now.isAfter(callEndDateTime)) { +// throw new CustomValidationException( +// Status.BAD_REQUEST, +// Translator.toLocale(GepafinConstant.CALL_EXPIRED) +// ); +// } } public void calculationProcessForFormula(ApplicationFormEntity applicationFormEntity, List contentResponseBeans, ApplicationFormFieldRequestBean applicationFormFieldRequestBean,FieldValidator fieldValidator) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 86a19a42..7066021f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -959,8 +959,8 @@ public class CallDao { Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_PUBLISHED)); } - LocalDate currentDate = LocalDate.now(); - LocalTime currentTime = LocalTime.now(); + LocalDate currentDate = DateTimeUtil.LocalDateServerToEurope(LocalDate.now()); + LocalTime currentTime = DateTimeUtil.LocalTimeServerToEurope(LocalTime.now()); if (currentDate.isBefore(callEntity.getStartDate().toLocalDate()) || (currentDate.isEqual(callEntity.getStartDate().toLocalDate()) && currentTime.isBefore(callEntity.getStartTime()))) { diff --git a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java index 1a68818f..87f272c4 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java +++ b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java @@ -4,6 +4,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.stereotype.Component; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; @@ -27,6 +28,16 @@ public class DateTimeUtil { LocalDateTime localDatetime = ldtZoned.withZoneSameInstant(ZoneId.of("Europe/Rome")).toLocalDateTime(); return localDatetime; } + + public static LocalDate LocalDateServerToEurope(LocalDate systemDate) { + ZonedDateTime zonedDateTime = systemDate.atStartOfDay(ZoneId.systemDefault()); + return zonedDateTime.withZoneSameInstant(ZoneId.of("Europe/Rome")).toLocalDate(); + } + + public static LocalTime LocalTimeServerToEurope(LocalTime systemTime) { + ZonedDateTime zonedDateTime = systemTime.atDate(LocalDate.now()).atZone(ZoneId.systemDefault()); + return zonedDateTime.withZoneSameInstant(ZoneId.of("Europe/Rome")).toLocalTime(); + } public static LocalDateTime getPreviousMonthDate(int month) { Calendar c = Calendar.getInstance(); From 51eb7172d3452d23a0f6d4eb5111d96d63f34548 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 1 Apr 2025 18:09:01 +0530 Subject: [PATCH 02/10] Updated code for call exipration --- .../gepafin/tendermanagement/dao/CallDao.java | 56 +++++++------------ .../repositories/CallRepository.java | 5 ++ .../tendermanagement/util/DateTimeUtil.java | 5 -- 3 files changed, 24 insertions(+), 42 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 7066021f..7b43dc3f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -796,6 +796,7 @@ public class CallDao { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL)); } + expirePublishedCalls(request); Specification spec = buildCallSpecification(request, user, companyId, onlyPreferredCall, onlyConfidiCall, callStatusList); List calls = callRepository.findAll(spec); @@ -959,7 +960,7 @@ public class CallDao { Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_PUBLISHED)); } - LocalDate currentDate = DateTimeUtil.LocalDateServerToEurope(LocalDate.now()); + LocalDate currentDate = DateTimeUtil.DateServerToUTC(LocalDateTime.now()).toLocalDate(); LocalTime currentTime = DateTimeUtil.LocalTimeServerToEurope(LocalTime.now()); if (currentDate.isBefore(callEntity.getStartDate().toLocalDate()) || @@ -1000,6 +1001,7 @@ public class CallDao { Translator.toLocale(GepafinConstant.COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL) ); } + expirePublishedCalls(request); Specification spec = search(request,user, callPageableRequestBean); Page entityPage; if (Boolean.TRUE.equals(onlyPreferredCall)) { @@ -1078,7 +1080,6 @@ public class CallDao { private List getPredicates(HttpServletRequest request,CallPageableRequestBean callPageableRequestBean, CriteriaBuilder criteriaBuilder, Root root, UserEntity userEntity) { - expirePublishedCalls(request); Integer year = null; String search = null; Map filters = new HashMap<>(); @@ -1162,42 +1163,24 @@ public class CallDao { } 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) { + + + LocalDate currentDate = DateTimeUtil.DateServerToUTC(LocalDateTime.now()).toLocalDate(); + LocalTime currentTime = DateTimeUtil.LocalTimeServerToEurope(LocalTime.now()); + + List expirdedCallList = callRepository.findExpiredCallsWhichIsPublished(CallStatusEnum.PUBLISH.getValue(), currentDate, currentTime); + + if (!expirdedCallList.isEmpty()) { + + loggingUtil.logUserAction(UserActionRequest.builder() + .request(request) + .actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.UPDATE_EXPIRED_CALL) + .build()); + for (CallEntity call : expirdedCallList) { 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) @@ -1205,9 +1188,8 @@ public class CallDao { .oldData(oldCallEntity) .newData(call) .build()); - } } - callRepository.saveAll(expiredCalls); // Save all modified calls at once + callRepository.saveAll(expirdedCallList); // Save all modified calls at once } } private void applyFilters(Root root, CriteriaBuilder criteriaBuilder, List predicates, Map filters) { diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index 5d2bf7f7..98a199d0 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -7,6 +7,8 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalTime; import java.util.List; @Repository @@ -58,5 +60,8 @@ public interface CallRepository extends JpaRepository, JpaSpec List findByIdInAndStatusInAndConfidi(@Param("ids") List ids, @Param("status") List status,Boolean confidi); public List findByStatusInAndHubIdAndConfidi(List callStatus, Long hubId,Boolean onlyConfidiCall); + + @Query("SELECT c FROM CallEntity c WHERE c.status = :status AND (FUNCTION('DATE', c.endDate) < :endDate OR (FUNCTION('DATE', c.endDate) = :endDate AND c.endTime <= :endTime))") + List findExpiredCallsWhichIsPublished(@Param("status") String status, @Param("endDate") LocalDate endDate, @Param("endTime") LocalTime endTime); } diff --git a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java index 87f272c4..bafd5d6d 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java +++ b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java @@ -28,11 +28,6 @@ public class DateTimeUtil { LocalDateTime localDatetime = ldtZoned.withZoneSameInstant(ZoneId.of("Europe/Rome")).toLocalDateTime(); return localDatetime; } - - public static LocalDate LocalDateServerToEurope(LocalDate systemDate) { - ZonedDateTime zonedDateTime = systemDate.atStartOfDay(ZoneId.systemDefault()); - return zonedDateTime.withZoneSameInstant(ZoneId.of("Europe/Rome")).toLocalDate(); - } public static LocalTime LocalTimeServerToEurope(LocalTime systemTime) { ZonedDateTime zonedDateTime = systemTime.atDate(LocalDate.now()).atZone(ZoneId.systemDefault()); From 2976984402cca3e53da83e70218485d65f127708 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Mon, 24 Mar 2025 19:29:43 +0530 Subject: [PATCH 03/10] Done ticket GEPAFINBE-192 Fixed NDG in-progress response case and updated status code to 200. --- .../config/NdgStatusResetHandler.java | 19 +++++++++++++++++++ .../tendermanagement/dao/AppointmentDao.java | 3 ++- .../repositories/ApplicationRepository.java | 7 +++++++ .../rest/api/impl/AppointmentController.java | 5 ++++- 4 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/config/NdgStatusResetHandler.java diff --git a/src/main/java/net/gepafin/tendermanagement/config/NdgStatusResetHandler.java b/src/main/java/net/gepafin/tendermanagement/config/NdgStatusResetHandler.java new file mode 100644 index 00000000..0e642669 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/NdgStatusResetHandler.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.config; + +import jakarta.annotation.PostConstruct; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.repositories.ApplicationRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class NdgStatusResetHandler { + + @Autowired + private ApplicationRepository applicationRepository; + + @PostConstruct + public void resetNdgStatusOnStartup() { + applicationRepository.resetNdgStatusForInProgress(GepafinConstant.NDG_IN_PROGRESS); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index 5a8ee2be..8bb955f4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -171,8 +171,9 @@ public class AppointmentDao { HubEntity hub = hubRepository.findByHubId(application.getHubId()); loginToOdessa(hub, application); startAsyncNdgProcessing(applicationId); - throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.NDG_GENERATION_IS_IN_PROGRESS)); + return ndgResponse; } + 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 diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 3b817314..b4fdfcaf 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -1,8 +1,10 @@ package net.gepafin.tendermanagement.repositories; +import jakarta.transaction.Transactional; import net.gepafin.tendermanagement.entities.ApplicationEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -170,4 +172,9 @@ public interface ApplicationRepository extends JpaRepository(appointmentLoginResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.NDG_FETCH_SUCCESSFULLY))); + // Determine the appropriate message + String responseMessage = (appointmentLoginResponse.getNdg() == null) ? Translator.toLocale(GepafinConstant.NDG_GENERATION_IS_IN_PROGRESS) : Translator.toLocale(GepafinConstant.NDG_FETCH_SUCCESSFULLY); + // Return response immediately with 200 OK + return ResponseEntity.status(HttpStatus.OK).body(new Response<>(appointmentLoginResponse, Status.SUCCESS, responseMessage)); } @Override From 1917a853bbda93ebb94595bb849fd038557ea160 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Mon, 7 Apr 2025 12:13:32 +0530 Subject: [PATCH 04/10] Done ticket GEPAFINBE-206 Handled the flagDaFirmare flag from the front-end request and removed it from the properties. --- .../net/gepafin/tendermanagement/dao/AppointmentDao.java | 5 +---- src/main/resources/application-dev.properties | 1 - src/main/resources/application-local.properties | 1 - src/main/resources/application-production.properties | 1 - src/main/resources/application-testing.properties | 1 - src/main/resources/application.properties | 2 +- 6 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index 8bb955f4..46af8a26 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -96,9 +96,6 @@ public class AppointmentDao { @Value("${aws.s3.bucket.name}") private String OLD_BUCKET; - @Value("${flagDaFirmare}") - private Boolean flagDaFirmare; - @Autowired private HubRepository hubRepository; @@ -963,7 +960,7 @@ public class AppointmentDao { UploadDocToExternalSystemRequest.Input input = new UploadDocToExternalSystemRequest.Input(); input.setIdTipoProtocollo(docToExternalSystemRequest.getInput().getIdTipoProtocollo()); input.setIdClassificazione(docToExternalSystemRequest.getInput().getIdClassificazione()); - input.setFlagDaFirmare(flagDaFirmare); + input.setFlagDaFirmare(docToExternalSystemRequest.getInput().getFlagDaFirmare()); input.setDescrizione(docToExternalSystemRequest.getInput().getDescrizione()); UploadDocToExternalSystemRequest.Input.Attributes attributes = new UploadDocToExternalSystemRequest.Input.Attributes(); diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index fc0e08ce..58295500 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -23,7 +23,6 @@ appointment.portal.user=UtenzaAPIPortal@621 appointment.portal.password=u13nzaAP1P0rtal! appointment.portal.source=GEPAFINPORTAL appointment.portal.context=GEPAFINPORTAL -flagDaFirmare=false # RabbitMQ properties for STOMP broker relay for Notification #spring.rabbitmq.host=rabbitmq.bflows.ai diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index b67592dc..c49961d5 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -21,7 +21,6 @@ appointment.portal.user=UtenzaAPIPortal@621 appointment.portal.password=u13nzaAP1P0rtal! appointment.portal.source=GEPAFINPORTAL appointment.portal.context=GEPAFINPORTAL -flagDaFirmare=false # RabbitMQ properties for STOMP broker relay for Notification spring.rabbitmq.host=localhost diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index 30cb6bee..65842ebb 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -30,7 +30,6 @@ appointment.portal.user=UtenzaAPIPortal@621 appointment.portal.password=u13nzaAP1P0rtal! appointment.portal.source=GEPAFINPORTAL appointment.portal.context=GEPAFINPORTAL -flagDaFirmare=true # RabbitMQ properties for STOMP broker relay for Notification #spring.rabbitmq.host=rabbitmq.bflows.ai diff --git a/src/main/resources/application-testing.properties b/src/main/resources/application-testing.properties index c8e93e85..6fb983e5 100644 --- a/src/main/resources/application-testing.properties +++ b/src/main/resources/application-testing.properties @@ -19,7 +19,6 @@ appointment.portal.user=UtenzaAPIPortal@621 appointment.portal.password=u13nzaAP1P0rtal! appointment.portal.source=GEPAFINPORTAL appointment.portal.context=GEPAFINPORTAL -flagDaFirmare=false # RabbitMQ properties for STOMP broker relay for Notification spring.rabbitmq.host=rabbitmq.bflows.ai diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 3b9bd853..c1cb62c7 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,7 +4,7 @@ spring.application.name=tendermanagement spring.servlet.multipart.max-file-size=300MB spring.servlet.multipart.max-request-size=300MB -spring.profiles.active=testing +spring.profiles.active=local # JPA Configuration From cfc9db1d89e5bc75a1792d8b8ff1965aa4e98cfd Mon Sep 17 00:00:00 2001 From: piyushkag Date: Mon, 7 Apr 2025 12:15:08 +0530 Subject: [PATCH 05/10] Updated code. --- src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c1cb62c7..3b9bd853 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,7 +4,7 @@ spring.application.name=tendermanagement spring.servlet.multipart.max-file-size=300MB spring.servlet.multipart.max-request-size=300MB -spring.profiles.active=local +spring.profiles.active=testing # JPA Configuration From f5bee331afab83a0828a6701990ab0df47de807d Mon Sep 17 00:00:00 2001 From: piyushkag Date: Thu, 10 Apr 2025 14:55:08 +0530 Subject: [PATCH 06/10] Fixed automatically publish call issue --- .../java/net/gepafin/tendermanagement/dao/CallDao.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 7b43dc3f..94c586b9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -598,8 +598,8 @@ public class CallDao { if (!requestEndDate.equals(storedEndDate)) { // Check if dates are different setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, dates.get(1)); - callEntity.setStatus(CallStatusEnum.PUBLISH.getValue()); - callRepository.save(callEntity); +// callEntity.setStatus(CallStatusEnum.PUBLISH.getValue()); +// callRepository.save(callEntity); isEndDateUpdated = true; } } @@ -611,13 +611,13 @@ public class CallDao { if (!requestEndTime.equals(storedEndTime)) { setIfUpdated(callEntity::getEndTime, callEntity::setEndTime, DateTimeUtil.parseTime(updateCallRequest.getEndTime())); - callEntity.setStatus(CallStatusEnum.PUBLISH.getValue()); - callRepository.save(callEntity); +// callEntity.setStatus(CallStatusEnum.PUBLISH.getValue()); +// callRepository.save(callEntity); isEndTimeUpdated = true; } } if (isEndDateUpdated || isEndTimeUpdated) { - + callRepository.save(callEntity); loggingUtil.logUserAction(UserActionRequest.builder() .request(request) .actionType(UserActionLogsEnum.UPDATE) From cfe5df9941eecce96b20b70e74d7ca5c8acbf30f Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 14 Apr 2025 16:17:14 +0530 Subject: [PATCH 07/10] Resolved conflict --- .../db/changelog/db.changelog-1.0.0.xml | 5 +- .../update_form_field_data_14_04_2025.sql | 84 +++++++++++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/db/dump/update_form_field_data_14_04_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 568c4030..82104fcb 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 @@ -2674,5 +2674,8 @@ - + + + diff --git a/src/main/resources/db/dump/update_form_field_data_14_04_2025.sql b/src/main/resources/db/dump/update_form_field_data_14_04_2025.sql new file mode 100644 index 00000000..aba19419 --- /dev/null +++ b/src/main/resources/db/dump/update_form_field_data_14_04_2025.sql @@ -0,0 +1,84 @@ +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Testo Breve"},{"name":"placeholder","value":""},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 1; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Testo Lungo"},{"name":"placeholder","value":""},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 2; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Testo Formattato"},{"name":"placeholder","value":""},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]', + validators = '{"isRequired":false,"minLength":null,"maxLength":null,"custom":null}' +WHERE id = 3; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Numero"},{"name":"placeholder","value":0},{"name":"step","value":0},{"name":"isRequestedAmount","value":false},{"name":"variable","value":[]},{"name":"formula","value":""},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 4; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Scelta Singola"},{"name":"options","value":[]},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 5; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Menu a Tendina"},{"name":"options","value":[]},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 6; +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Scelta Multipla"},{"name":"options","value":[]},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 7; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Casella di Spunta"},{"name":"isChecklistItem","value":false},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 8; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Data"},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]', + validators = '{"isRequired":false,"custom":null}' +WHERE id = 9; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Caricamento File"},{"name":"mime","value":[]},{"name":"isDelegation","value":false}]', + validators = '{"isRequired":false,"maxSize":100000,"custom":null}' +WHERE id = 10; +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Partita IVA"},{"name":"placeholder","value":""},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 11; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Codice Fiscale"},{"name":"placeholder","value":""},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 12; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"CAP"},{"name":"placeholder","value":""},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 13; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"IBAN"},{"name":"placeholder","value":""},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 14; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Campo Email"},{"name":"placeholder","value":"nome@esempio.it"},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 15; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Campo PEC"},{"name":"placeholder","value":"nome@pec.it"},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 16; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Indirizzo URL"},{"name":"placeholder","value":""},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 17; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Marca da bollo"},{"name":"placeholder","value":"Numero identificativo"},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 18; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Tabella"},{"name":"table_columns","value":{}},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]', + validators = '{"custom":"nonEmptyTables"}' +WHERE id = 20; +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Tabella"},{"name":"criteria_table_columns","value":{}},{"name":"variable","value":[]},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 21; + +UPDATE FORM_FIELD +SET settings = '[{"name":"label","value":"Casella di Spunta"},{"name":"isChecklistItem","value":true},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""}]' +WHERE id = 22; \ No newline at end of file From d68644c366c79f9532654764f05fe135a70ca485 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Thu, 17 Apr 2025 12:27:38 +0530 Subject: [PATCH 08/10] Resolved conflict --- pom.xml | 13 +- .../constants/GepafinConstant.java | 30 ++ .../tendermanagement/dao/ApplicationDao.java | 341 +++++++++++++++++- .../dao/ApplicationEvaluationDao.java | 2 +- .../entities/ApplicationFormView.java | 118 ++++++ .../entities/ApplicationFormViewId.java | 20 + .../ApplicationFormViewRepository.java | 17 + .../service/ApplicationService.java | 4 + .../service/impl/ApplicationServiceImpl.java | 16 + .../gepafin/tendermanagement/util/Utils.java | 26 +- .../web/rest/api/ApplicationApi.java | 23 +- .../api/impl/ApplicationApiController.java | 14 +- .../db/changelog/db.changelog-1.0.0.xml | 5 + .../db/dump/create_application_form_view.sql | 125 +++++++ 14 files changed, 731 insertions(+), 23 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormView.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormViewId.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormViewRepository.java create mode 100644 src/main/resources/db/dump/create_application_form_view.sql diff --git a/pom.xml b/pom.xml index a42534bf..9c84bcc4 100644 --- a/pom.xml +++ b/pom.xml @@ -251,6 +251,13 @@ 0.4.8 + + org.apache.commons + commons-csv + 1.10.0 + + + @@ -271,8 +278,8 @@ liquibase-maven-plugin src/main/resources/application.properties - - - + + + diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index b192fba5..4f15580c 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -499,6 +499,36 @@ public class GepafinConstant { public static final String PASSWORD_EXPIRED = "PasswordExpired"; public static final String PASSWORD_EXPIRED_LOGIN_TO_ODESSA = "password.expired.for.login.to.odessa"; + + public static final String APPLICATION="application"; + public static final String APPLICATION_ID="applicationId"; + public static final String USER_WITH_COMPANY_ID="userWithCompanyId"; + public static final String ASSIGNED_USER_ID="assignedUserId"; + public static final String APPLICATION_USER_ID="applicationUserId"; + public static final String INVALID_USER_ID="invalid.user"; + public static final String COMPANY_NAME="companyName"; + public static final String TABLE_COLUMNS="table_columns"; + public static final String PREDEFINED="predefined"; + public static final String EBABLE_CSV="enableCsv"; + public static final String LABEL_CSV="labelCsv"; + public static final String GET="get"; + public static final String REPORT_COLUMNS="reportColumns"; + public static final String FIELD_TYPE="fieldtype"; + public static final String ENABLE_FORMULA="enableFormula"; + public static final String STATE_FIELD_DATA="stateFieldData"; + public static final String REPORT_ENABLE="reportEnable"; + public static final String TABLE="table"; + public static final String GET_FIELD_TYPE="getFieldType"; + public static final String GET_APPLICATION_FORM_ID="getApplicationFormId"; + public static final String GET_APPLICATION_ID="getApplicationId"; + public static final String GET_ID="getId"; + public static final String GET_CLASS="getClass"; + public static final String GET_FORM_ID="getFormId"; + public static final String GET_FIELD_ID="getFieldId"; + public static final String GET_FIELD_LABEL="getFieldLabel"; + public static final String GET_FIELD_VALUE="getFieldValue"; + public static final String GET_REPORT_ENABLE="getReportEnable"; + public static final String GET_REPORT_HEADER="getReportHeader"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index c7592e3e..d6b66527 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1,10 +1,15 @@ package net.gepafin.tendermanagement.dao; import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.itextpdf.text.BaseColor; +import com.itextpdf.text.Font; +import com.itextpdf.text.FontFactory; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.Root; import jakarta.persistence.criteria.*; +import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; @@ -23,15 +28,14 @@ import net.gepafin.tendermanagement.service.FormService; import net.gepafin.tendermanagement.service.HubService; import net.gepafin.tendermanagement.service.SystemEmailTemplatesService; import net.gepafin.tendermanagement.service.UserService; -import net.gepafin.tendermanagement.util.DateTimeUtil; -import net.gepafin.tendermanagement.util.FieldValidator; -import net.gepafin.tendermanagement.util.LoggingUtil; -import net.gepafin.tendermanagement.util.Utils; -import net.gepafin.tendermanagement.util.Validator; +import net.gepafin.tendermanagement.util.*; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.apache.commons.csv.CSVFormat; +import org.apache.commons.csv.CSVPrinter; +import org.apache.commons.lang3.StringUtils; import org.h2.util.IOUtils; import org.json.JSONObject; import org.slf4j.Logger; @@ -49,17 +53,17 @@ import jakarta.servlet.http.HttpServletRequest; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStreamWriter; +import java.lang.reflect.Method; import java.math.BigDecimal; + import java.sql.Timestamp; import java.text.MessageFormat; -import java.text.NumberFormat; -import java.text.ParseException; +import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.LocalTime; import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -69,7 +73,6 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import static org.apache.commons.lang3.StringUtils.isEmpty; -import static org.hibernate.validator.internal.engine.messageinterpolation.el.RootResolver.FORMATTER; @Component public class ApplicationDao { @@ -195,6 +198,15 @@ public class ApplicationDao { @Autowired private ApplicationEvaluationRepository applicationEvaluationRepository; + @Autowired + private ApplicationFormViewRepository applicationFormViewRepository; + + @Autowired + private FormRepository formRepository; + + @Autowired + private ApplicationEvaluationDao applicationEvaluationDao; + public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { FormEntity formEntity = formService.validateForm(formId); @@ -1878,4 +1890,313 @@ public class ApplicationDao { } return application; } + public List getApplicationFormData(Long callId) { + List applicationFormViews=new ArrayList<>(); + + applicationFormViews= applicationFormViewRepository.findByCallId(callId); + + return applicationFormViews; + } + + private List getStaticGetterMethods() { + List excluded = Arrays.asList( + GepafinConstant.GET_FIELD_TYPE,GepafinConstant.GET_APPLICATION_FORM_ID,GepafinConstant.GET_ID,GepafinConstant.GET_CLASS,GepafinConstant.GET_FORM_ID,GepafinConstant.GET_FIELD_ID,GepafinConstant.GET_FIELD_LABEL,GepafinConstant.GET_FIELD_VALUE,GepafinConstant.GET_REPORT_HEADER,GepafinConstant.GET_REPORT_ENABLE + ); + + Method applicationIdMethod = null; + + List methods = new ArrayList<>(); + + for (Method m : ApplicationFormView.class.getMethods()) { + if (m.getName().equals(GepafinConstant.GET_APPLICATION_ID)) { + applicationIdMethod = m; + } else if (m.getName().startsWith(GepafinConstant.GET) && m.getParameterCount() == 0 && !excluded.contains(m.getName())) { + methods.add(m); + } + } + + methods.sort(Comparator.comparing(Method::getName)); // Sort remaining + + if (applicationIdMethod != null) { + methods.add(0, applicationIdMethod); // Add it to the beginning + } + + return methods; + + } + + private String methodToHeader(Method method) { + String name = method.getName().substring(3); // strip "get" + return Arrays.stream(name.split("(?=[A-Z])")) + .map(String::toLowerCase) + .map(word -> Character.toUpperCase(word.charAt(0)) + word.substring(1)) + .collect(Collectors.joining(" ")); + } + + private String invokeGetter(ApplicationFormView view, Method method) { + try { + Object value = method.invoke(view); + if (value == null) return ""; + + String stringValue; + + if (value instanceof LocalDate) { + stringValue = ((LocalDate) value).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + } else if (value instanceof LocalDateTime) { + stringValue = ((LocalDateTime) value).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } else if (value instanceof Date) { + stringValue = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) value); + } else { + stringValue = value.toString(); + } + + // Wrap it in ="..." to make Excel treat it as a literal string + return "=\"" + stringValue.replace("\"", "\"\"") + "\""; + + } catch (Exception e) { + return ""; + } + } + + + public byte[] exportCsv(Long callId) { + + List results = getApplicationFormData(callId); + + + Map appInfo = new HashMap<>(); + Map> appFieldValues = new LinkedHashMap<>(); + Set tableFieldIds = new HashSet<>(); + Map fieldIdToLabel = new LinkedHashMap<>(); + + for (ApplicationFormView row : results) { + appInfo.putIfAbsent(row.getApplicationId(), row); + String label=row.getReportHeader(); + if(Boolean.TRUE.equals(StringUtils.isEmpty(label))){ + label=row.getFieldLabel(); + } + fieldIdToLabel.putIfAbsent(row.getFieldId(), label); + + if (GepafinConstant.TABLE.equalsIgnoreCase(row.getFieldType())) { + tableFieldIds.add(row.getFieldId()); + continue; + } + + String value = Optional.ofNullable(row.getFieldValue()) + .map(v -> v.startsWith("\"") && v.endsWith("\"") ? v.substring(1, v.length() - 1) : v) + .orElse(""); + + appFieldValues + .computeIfAbsent(row.getApplicationId(), k -> new LinkedHashMap<>()) + .merge(row.getFieldId(), value, (v1, v2) -> v1.equals(v2) ? v1 : String.join(", ", v1, v2)); + } + + Map> tableHeadersByFieldId = new LinkedHashMap<>(); + Map> tableDataByApp = new HashMap<>(); + prepareTableFieldData(results, tableFieldIds, tableHeadersByFieldId, tableDataByApp); + + // Final header construction + List staticMethods = getStaticGetterMethods(); + List staticHeaders = staticMethods.stream().map(this::methodToHeader).toList(); + + List dynamicHeaders = new ArrayList<>(); + for (String fieldId : fieldIdToLabel.keySet()) { + if (tableHeadersByFieldId.containsKey(fieldId)) { + dynamicHeaders.addAll(tableHeadersByFieldId.get(fieldId)); + } else { + dynamicHeaders.add(fieldIdToLabel.get(fieldId)); + } + } + + List allHeaders = new ArrayList<>(staticHeaders); + allHeaders.addAll(dynamicHeaders); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try (CSVPrinter printer = new CSVPrinter(new OutputStreamWriter(out), CSVFormat.DEFAULT.withHeader(allHeaders.toArray(new String[0])))) { + for (Long appId : appFieldValues.keySet()) { + ApplicationFormView appRow = appInfo.get(appId); + Map flatFieldVals = appFieldValues.get(appId); + Map tableVals = tableDataByApp.getOrDefault(appId, Collections.emptyMap()); + + List row = new ArrayList<>(); + for (Method method : staticMethods) { + row.add(invokeGetter(appRow, method)); + } + + for (String fieldId : fieldIdToLabel.keySet()) { + if (tableHeadersByFieldId.containsKey(fieldId)) { + for (String header : tableHeadersByFieldId.get(fieldId)) { + row.add(tableVals.getOrDefault(header, "")); + } + } else { + row.add(flatFieldVals.getOrDefault(fieldId, "")); + } + } + + printer.printRecord(row); + } + + } catch (IOException e) { + throw new RuntimeException("CSV generation failed", e); + } + + return out.toByteArray(); + } + private Map extractTableData(String fieldType, + ContentResponseBean content, String fieldValue) { + + if (content == null) return Map.of(); + + Map result = new LinkedHashMap<>(); + + List> rows = null; + try { + rows = GepafinConstant.CRITERIA_TABLE_COLUMNS.equals(fieldType) + ? Utils.convertJsonToListMap(String.valueOf(PdfUtils.extractRows(fieldValue))) + : Utils.convertJsonToListMap(fieldValue); + } catch (Exception e) { + throw new RuntimeException(e); + } + + Map fieldLabelMap = new LinkedHashMap<>(); + Set predefinedIds = new LinkedHashSet<>(); + Set dynamicIds = new LinkedHashSet<>(); + Set numericFormulaIds = new LinkedHashSet<>(); + + for (SettingResponseBean setting : content.getSettings()) { + String settingName = setting.getName(); + if(settingName.equals(GepafinConstant.REPORT_ENABLE)){ + Boolean enable= (Boolean) setting.getValue(); + if(Boolean.FALSE.equals(enable)){ + return null; + } + } + + if (Boolean.TRUE.equals(GepafinConstant.TABLE_COLUMNS.equals(settingName)) || Boolean.TRUE.equals(GepafinConstant.CRITERIA_TABLE_COLUMNS.equals(settingName))) { + Map valueMap = (Map) setting.getValue(); + if (valueMap == null) continue; + + List> columns = (List>) valueMap.get(GepafinConstant.STATE_FIELD_DATA); + if (columns != null) { + for (Map col : columns) { + String id = String.valueOf(col.get(GepafinConstant.NAME)); + if (Boolean.FALSE.equals(col.get(GepafinConstant.PREDEFINED))) { + if (GepafinConstant.NUMERIC.equals(col.get(GepafinConstant.FIELD_TYPE)) && Boolean.TRUE.equals(col.get(GepafinConstant.ENABLE_FORMULA))) { + numericFormulaIds.add(id); + } + } + } + } + } + + if (Boolean.TRUE.equals(GepafinConstant.REPORT_COLUMNS.equals(settingName))) { + List> reportColumns = (List>) setting.getValue(); + if (reportColumns != null) { + for (Map col : reportColumns) { + Boolean enableCsv = (Boolean) col.get(GepafinConstant.EBABLE_CSV); + if (Boolean.TRUE.equals(enableCsv)) { + String id = String.valueOf(col.get(GepafinConstant.NAME)); + + String fieldCsvLabel = col.get(GepafinConstant.LABEL_CSV) != null + ? String.valueOf(col.get(GepafinConstant.LABEL_CSV)) + : String.valueOf(col.get(GepafinConstant.LABEL)); + + fieldLabelMap.put(id, fieldCsvLabel); + + if (Boolean.TRUE.equals(col.get(GepafinConstant.PREDEFINED))) { + predefinedIds.add(id); + } else { + dynamicIds.add(id); + } + } + } + } + } + } + + + + if (predefinedIds.isEmpty()) { + return null; + } + for (Map row : rows) { + String prefix = predefinedIds.stream() + .map(id -> String.valueOf(row.getOrDefault(id, ""))) + .filter(s -> !s.isBlank()) + .findFirst().orElse(""); + + + for (String dynId : dynamicIds) { + String dynLabel = fieldLabelMap.get(dynId); + for (String preId : predefinedIds.isEmpty() ? List.of("") : predefinedIds) { + String preLabel = fieldLabelMap.get(preId); + String key = dynLabel + " " + (preLabel != null ? preLabel + " " : "") + prefix; + result.put(key, String.valueOf(row.getOrDefault(dynId, ""))); + } + } + } + + // Add totals for numeric formula-enabled columns + for (String dynId : numericFormulaIds) { + double sum = rows.stream() + .mapToDouble(r -> { + try { + return Double.parseDouble(String.valueOf(r.getOrDefault(dynId, "0"))); + } catch (NumberFormatException e) { + return 0.0; + } + }).sum(); + String dynLabel = fieldLabelMap.get(dynId); + result.put("TOTAL " + dynLabel, String.valueOf(sum)); + } + + return result; + } + private void prepareTableFieldData( + List results, + Set tableFieldIds, + Map> tableHeadersByFieldId, + Map> tableDataByApp) { + + if (tableFieldIds.isEmpty()) return; + + Map> groupedByApp = results.stream() + .filter(r -> tableFieldIds.contains(r.getFieldId())) + .collect(Collectors.groupingBy(ApplicationFormView::getApplicationId)); + + for (Map.Entry> entry : groupedByApp.entrySet()) { + Long appId = entry.getKey(); + Map flattenedAll = new LinkedHashMap<>(); + + for (ApplicationFormView row : entry.getValue()) { + formRepository.findById(row.getFormId()).ifPresent(form -> { + List contentList = Utils.convertJsonStringToList(form.getContent(), ContentResponseBean.class); + ContentResponseBean content = contentList.stream() + .filter(c -> c.getId().equals(row.getFieldId())) + .findFirst() + .orElse(null); + + if (content == null) return; + + content.getSettings().stream() + .filter(setting -> GepafinConstant.TABLE_COLUMNS.equals(setting.getName()) + || GepafinConstant.CRITERIA_TABLE_COLUMNS.equals(setting.getName())) + .findFirst() + .ifPresent(setting -> { + Map flattened = extractTableData( + row.getFieldType(), + content, + row.getFieldValue() + ); + if (flattened != null) { + tableHeadersByFieldId.putIfAbsent(row.getFieldId(), new ArrayList<>(flattened.keySet())); + flattenedAll.putAll(flattened); + } + }); + }); + } + + tableDataByApp.put(appId, flattenedAll); + } + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 17cac4c4..7052aad0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1665,7 +1665,7 @@ public class ApplicationEvaluationDao { }); } - private String getLabelFromSettings(ContentResponseBean contentResponseBean) { + public String getLabelFromSettings(ContentResponseBean contentResponseBean) { String label = contentResponseBean.getLabel(); if (contentResponseBean.getSettings() != null) { for (SettingResponseBean setting : contentResponseBean.getSettings()) { diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormView.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormView.java new file mode 100644 index 00000000..b3733afc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormView.java @@ -0,0 +1,118 @@ +package net.gepafin.tendermanagement.entities; + + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; +import org.hibernate.annotations.Immutable; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalTime; + +@Entity +@Immutable +@Table(name = "application_form_view") +@Getter +@Setter +@IdClass(ApplicationFormViewId.class) +public class ApplicationFormView { + + @Id + @Column(name = "id") + private Long id; + + @Column(name = "application_id") + private Long applicationId; + + @Column(name = "call_id") + private Long callId; + + @Column(name = "form_id") + private Long formId; + + @Column(name = "application_form_id") + private Long applicationFormId; + + @Column(name = "field_id") + private String fieldId; + + @Column(name = "field_label") + private String fieldLabel; + + @Column(name = "field_type") + private String fieldType; + + @Column(name = "field_value") + private String fieldValue; + + @Column(name = "report_enable") + private Boolean reportEnable; + + @Column(name = "report_header") + private String reportHeader; + + @Column(name = "status") + private String status; + + @Column(name = "amount_requested") + private BigDecimal amountRequested; + + @Column(name = "amount_accepted") + private BigDecimal amountAccepted; + + @Column(name = "is_deleted") + private boolean isDeleted; + + @Column(name = "hub_id") + private Long hubId; + + @Column(name = "user_id") + private Long userId; + + @Column(name = "evaluation_version") + private String evaluationVersion; + + @Column(name = "company_id") + private Long companyId; + + @Column(name = "company_name") + private String companyName; + + @Column(name = "company_vat_number") + private String companyVatNumber; + + @Column(name = "codice_ateco") + private String codiceAteco; + + @Column(name = "company_codice_fiscale") + private String companyCodiceFiscale; + + @Column(name = "protocol_number") + private Long protocolNumber; + + @Column(name = "user_codice_fiscale") + private String userCodiceFiscale; + + @Column(name = "user_name") + private String userName; + + @Column(name = "legal_representative") + private Boolean legalRepresentative; + + @Column(name = "call_title") + private String callTitle; + + @Column(name = "call_end_date") + private LocalDate callEndDate; + + @Column(name = "call_end_time") + private LocalTime callEndTime; + + @Column(name = "call_start_date") + private LocalDate callStartDate; + + @Column(name = "call_start_time") + private LocalTime callStartTime; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormViewId.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormViewId.java new file mode 100644 index 00000000..37d0cbb7 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormViewId.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.entities; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Objects; + +@Data +public class ApplicationFormViewId implements Serializable { + + private static final long serialVersionUID = 1L; + private Long id; + + public ApplicationFormViewId() { + } + + public ApplicationFormViewId(Long id) { + this.id = id; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormViewRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormViewRepository.java new file mode 100644 index 00000000..ecfe17c7 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationFormViewRepository.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.ApplicationFormView; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ApplicationFormViewRepository extends JpaRepository, JpaSpecificationExecutor { + + @Query("SELECT v FROM ApplicationFormView v WHERE v.callId = :callId AND v.reportEnable = true") + List findByCallId(Long callId); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index 4565668c..24fde801 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.model.request.ApplicationPageableRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationRequest; @@ -46,4 +47,7 @@ public interface ApplicationService { PageableResponseBean> getAllApplicationByPagination(HttpServletRequest request, Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean); public ApplicationEntity validateApplicationWithCompany(Long applicationId,Long companyId); + + public byte[] exportCsv(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 8426390e..ea3f22c2 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -6,6 +6,7 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.ApplicationDao; import net.gepafin.tendermanagement.dao.FlowFormDao; import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.ApplicationPageableRequestBean; @@ -15,6 +16,7 @@ import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ForbiddenAccessException; @@ -38,6 +40,9 @@ public class ApplicationServiceImpl implements ApplicationService { @Autowired private Validator validator; + @Autowired + private CallService callService; + @Override @Transactional(rollbackFor = Exception.class) public ApplicationResponseBean createApplication(HttpServletRequest request, @@ -152,4 +157,15 @@ public class ApplicationServiceImpl implements ApplicationService { public ApplicationEntity validateApplicationWithCompany(Long applicationId,Long companyId) { return applicationDao.validateApplicationWithCompany(applicationId,companyId); } + + @Override + public byte[] exportCsv(HttpServletRequest request, Long callId) { + UserEntity userEntity = validator.validateUser(request); + CallEntity call=callService.validateCall(callId); + validator.validateHubId(request,call.getHub().getId()); + byte[] csvBytes= applicationDao.exportCsv(callId); + + return csvBytes; + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 1838bd57..30ac3687 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -796,4 +796,28 @@ public class Utils { return null; } } -} \ No newline at end of file + public static List> convertJsonToListMap(String jsonString) { + try { + if (jsonString == null || jsonString.trim().isEmpty()) { + return Collections.emptyList(); + } + + ObjectMapper objectMapper = new ObjectMapper(); + String unescaped; + + // First try: parse as if it's double-encoded (escaped string containing a JSON array) + try { + unescaped = objectMapper.readValue(jsonString, String.class); + } catch (Exception e) { + // If that fails, assume it's already a proper JSON array + unescaped = jsonString; + } + + // Now parse the actual JSON array + return objectMapper.readValue(unescaped, new TypeReference>>() {}); + } catch (Exception e) { + e.printStackTrace(); + return Collections.emptyList(); + } + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index 9db1d79e..00609f68 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -2,11 +2,12 @@ package net.gepafin.tendermanagement.web.rest.api; import java.util.List; -import net.gepafin.tendermanagement.model.request.ApplicationPageableRequestBean; -import net.gepafin.tendermanagement.model.request.NotificationRequestBean; +import jakarta.servlet.http.HttpServletResponse; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.*; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -18,10 +19,8 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; -import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.FormActionEnum; -import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -224,5 +223,21 @@ public interface ApplicationApi { ResponseEntity>>> getAllApplicationByPagination(HttpServletRequest request,@Parameter(description = "The call id", required = false) @RequestParam(value = "callId", required = false) Long callId, @Parameter(description = "The company id", required = false) @RequestParam(value = "companyId", required = false) Long companyId, @RequestBody ApplicationPageableRequestBean applicationPageableRequestBean); + @Operation(summary = "Api to download application data as a CSV file using the call ID", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)})) + }) + @GetMapping(value = "/call/{callId}/csv") + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + public ResponseEntity exportCsv( + HttpServletRequest request, @Parameter(description = "The call id", required = true) @PathVariable(value = "callId", required = true) Long callId); + + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java index a9c148bb..a06f5dc4 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java @@ -1,16 +1,14 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; -import net.gepafin.tendermanagement.model.request.ApplicationPageableRequestBean; -import net.gepafin.tendermanagement.model.request.ApplicationRequest; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.FormActionEnum; -import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; -import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.ApplicationService; @@ -236,5 +234,13 @@ public class ApplicationApiController implements ApplicationApi { .getAllApplicationByPagination(request, callId,companyId,applicationPageableRequestBean); return ResponseEntity.status(HttpStatus.OK).body(new Response<>(pageableResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); } + @Override + public ResponseEntity exportCsv(HttpServletRequest request, Long callId) { + byte[] csvBytes =applicationService.exportCsv(request,callId); + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=applications.csv") + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(csvBytes); + } } 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 82104fcb..7e349dea 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 @@ -2678,4 +2678,9 @@ + + + diff --git a/src/main/resources/db/dump/create_application_form_view.sql b/src/main/resources/db/dump/create_application_form_view.sql new file mode 100644 index 00000000..b84eaa25 --- /dev/null +++ b/src/main/resources/db/dump/create_application_form_view.sql @@ -0,0 +1,125 @@ +CREATE OR REPLACE VIEW gepafin_schema.application_form_view AS +SELECT app_data.id, + app_data.call_id, + app_data.application_form_id, + app_data.form_id, + app_data.application_id, + field_data.value ->> 'id' AS field_id, + COALESCE( + (SELECT s.value ->> 'value' + FROM jsonb_array_elements(field_data.value -> 'settings') s(value) + WHERE s.value ->> 'name' = 'label' + LIMIT 1), + field_data.value ->> 'label' + ) AS field_label, + ( + SELECT (s.value ->> 'value')::boolean + FROM jsonb_array_elements(field_data.value -> 'settings') s(value) + WHERE s.value ->> 'name' = 'reportEnable' + LIMIT 1 + ) AS report_enable, + COALESCE( (SELECT s.value ->> 'value' + FROM jsonb_array_elements(field_data.value -> 'settings') s(value) + WHERE s.value ->> 'name' = 'reportHeader' + LIMIT 1), + field_data.value ->> 'reportHeader' + ) AS report_header, + field_data.value ->> 'name' AS field_type, + CASE + WHEN field_data.value ->> 'name' = 'fileupload' THEN + to_jsonb(( + SELECT string_agg(d.file_name, ', ') + FROM unnest(string_to_array(app_data.field_value, ',')) file_ids(file_id) + JOIN gepafin_schema.document d ON d.id::text = file_ids.file_id + WHERE d.is_deleted = false + )) + WHEN field_data.value ->> 'name' IN ('checkboxes', 'select', 'radio') THEN + CASE + WHEN app_data.field_value ~~ '[%' THEN + to_jsonb(( + SELECT string_agg(opt.value ->> 'label', ', ') + FROM jsonb_array_elements_text(app_data.field_value::jsonb) selected_id(value) + CROSS JOIN LATERAL ( + SELECT s.value + FROM jsonb_array_elements(field_data.value -> 'settings') s(value) + WHERE s.value ->> 'name' = 'options' + ) options_setting, + LATERAL jsonb_array_elements(options_setting.value -> 'value') opt(value) + WHERE opt.value ->> 'name' = selected_id.value + )) + ELSE + to_jsonb(( + SELECT opt.value ->> 'label' + FROM ( + SELECT s.value + FROM jsonb_array_elements(field_data.value -> 'settings') s(value) + WHERE s.value ->> 'name' = 'options' + ) options_setting, + LATERAL jsonb_array_elements(options_setting.value -> 'value') opt(value) + WHERE opt.value ->> 'name' = app_data.field_value + LIMIT 1 + )) + END + ELSE + to_jsonb(app_data.field_value) + END AS field_value, + app_data.status, + app_data.amount_requested, + app_data.amount_accepted, + app_data.is_deleted, + app_data.hub_id, + app_data.user_id, + app_data.evaluation_version, + app_data.company_id, + c.company_name, + c.vat_number AS company_vat_number, + c.codice_ateco, + c.codice_fiscale AS company_codice_fiscale, + p.protocol_number, + b.codice_fiscale AS user_codice_fiscale, + COALESCE(NULLIF(TRIM(BOTH FROM CONCAT(COALESCE(u.first_name, ''), ' ', COALESCE(u.last_name, ''))), ''), '') AS user_name, + uwc.is_legal_representant AS legal_representative, + cl.name AS call_title, + cl.end_date AS call_end_date, + cl.end_time AS call_end_time, + cl.start_date AS call_start_date, + cl.start_time AS call_start_time +FROM ( + SELECT a.id AS application_id, + a.call_id, + a.protocol_number, + af.id AS application_form_id, + af.form_id AS form_id, + aff.id AS id, + aff.field_value, + a.status, + a.amount_requested, + a.amount_accepted, + a.is_deleted, + a.hub_id, + a.user_id, + a.evaluation_version, + a.created_date, + a.company_id, + aff.field_id, + f.content + FROM gepafin_schema.application a + JOIN gepafin_schema.application_form af ON af.application_id = a.id + JOIN gepafin_schema.application_form_field aff ON aff.application_form_id = af.id + JOIN gepafin_schema.form f ON f.id = af.form_id + WHERE a.is_deleted = false +) app_data +CROSS JOIN LATERAL ( + SELECT jsonb_array_elements.value + FROM jsonb_array_elements(app_data.content::jsonb) jsonb_array_elements(value) + WHERE jsonb_array_elements.value ->> 'id' = app_data.field_id::text +) field_data(value) +LEFT JOIN gepafin_schema.call cl ON app_data.call_id = cl.id +LEFT JOIN gepafin_schema.company c ON app_data.company_id = c.id +LEFT JOIN gepafin_schema.protocol p ON app_data.protocol_number = p.id +LEFT JOIN gepafin_schema.gepafin_user u ON app_data.user_id = u.id +LEFT JOIN gepafin_schema.user_with_company uwc ON app_data.user_id = uwc.user_id AND app_data.company_id = uwc.company_id AND uwc.is_deleted = false +LEFT JOIN gepafin_schema.beneficiary b ON u.beneficiary_id = b.id +WHERE app_data.id IS NOT NULL + AND app_data.status NOT IN ('DRAFT', 'AWAITING', 'READY') +ORDER BY app_data.id, field_data.value ->> 'id'; \ No newline at end of file From ec1c104f8c05cb274c7208d1e88d7afe70c810b7 Mon Sep 17 00:00:00 2001 From: Piyush Date: Mon, 28 Apr 2025 17:07:17 +0530 Subject: [PATCH 09/10] Resolved conflict --- .../db/changelog/db.changelog-1.0.0.xml | 10 ++++++++++ ...on_template_for_notification_28_04_2025.sql | 9 +++++++++ ...update_system_email_template_28_04_2025.sql | 7 +++++++ src/main/resources/message_it.properties | 18 +++++++++--------- 4 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 src/main/resources/db/dump/update_json_template_for_notification_28_04_2025.sql create mode 100644 src/main/resources/db/dump/update_system_email_template_28_04_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 7e349dea..aa166039 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 @@ -2683,4 +2683,14 @@ dbms="postgresql" path="db/dump/create_application_form_view.sql"/> + + + + + + + + diff --git a/src/main/resources/db/dump/update_json_template_for_notification_28_04_2025.sql b/src/main/resources/db/dump/update_json_template_for_notification_28_04_2025.sql new file mode 100644 index 00000000..8fe353ef --- /dev/null +++ b/src/main/resources/db/dump/update_json_template_for_notification_28_04_2025.sql @@ -0,0 +1,9 @@ +UPDATE notification_type +SET + title = regexp_replace(title, 'emendamento', 'soccorso istruttorio', 'gi'), + json_template = regexp_replace(json_template, 'emendamento', 'soccorso istruttorio', 'gi') +WHERE + title ~* 'emendamento' + OR json_template ~* 'emendamento'; + + diff --git a/src/main/resources/db/dump/update_system_email_template_28_04_2025.sql b/src/main/resources/db/dump/update_system_email_template_28_04_2025.sql new file mode 100644 index 00000000..2e6490dd --- /dev/null +++ b/src/main/resources/db/dump/update_system_email_template_28_04_2025.sql @@ -0,0 +1,7 @@ +UPDATE gepafin_schema.system_email_template +SET + html_content = regexp_replace(html_content, 'emendamento', 'Soccorso Istruttorio', 'gi'), + subject = regexp_replace(subject, 'emendamento', 'Soccorso Istruttorio', 'gi') +WHERE + html_content ~* 'emendamento' + OR subject ~* 'emendamento'; diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 7b0293bf..7a77bd5e 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -288,22 +288,22 @@ application.not.in.draft.status=La domanda non ? in stato DRAFT. get.error.s3=Impossibile recuperare il file da S3. application.data.amendment.success = Recupero riuscito dei dati dell'applicazione per il processo di modifica -delete.application.amendment.success =Emendamento all'applicazione eliminato con successo. +delete.application.amendment.success =Soccorso Istruttorio all'applicazione eliminato con successo. application.amendment.not.found = Richiesta di modifica dell'applicazione non trovata con l'ID indicato. application.amendment.get.success = Dettagli della modifica dell'applicazione recuperati correttamente con l'ID fornito. -application.amendment.update.successfully = Emendamento all'applicazione aggiornato con successo. -application.amendment.closed.successfully = Emendamento alla domanda chiuso con successo. +application.amendment.update.successfully = Soccorso Istruttorio all'applicazione aggiornato con successo. +application.amendment.closed.successfully = Soccorso Istruttorio alla domanda chiuso con successo. response.days.extended.success=Giorni di risposta estesi con successo. -added.comment.to.amendment.request.success = Commento aggiunto con successo alla richiesta di emendamento. +added.comment.to.amendment.request.success = Commento aggiunto con successo alla richiesta di soccorso istruttorio. comment.not.found = Commento non trovato. comment.updated.successfully = Commento aggiornato con successo. comment.deleted.successfully = Commento eliminato con successo. -comment.not.associate.with.amendment = Il commento non ? associato alla richiesta di emendamento. -amendment.found.success = Richiesta di emendamento trovata con successo. -invalid.amendment.for.comment = Richiesta di emendamento non valida per il commento fornito. +comment.not.associate.with.amendment = Il commento non ? associato alla richiesta di soccorso istruttorio. +amendment.found.success = Richiesta di soccorso istruttorio trovata con successo. +invalid.amendment.for.comment = Richiesta di soccorso istruttorio non valida per il commento fornito. DD_MM_YYYY_HH_MM = dd_MM_yyyy HH:mm -create.application.data.amendment.msg =Emendamento alla domanda inviato con successo +create.application.data.amendment.msg =soccorso istruttorio alla domanda inviato con successo beneficiary.email.not.found.msg=L'indirizzo email per il beneficiario non ? stato trovato. Si prega di assicurarsi che il beneficiario abbia un indirizzo email valido. reminder.email.sent.success.msg=Email di promemoria inviata con successo! application.documents.not.found=Nessun documento trovato per la domanda. @@ -312,7 +312,7 @@ user.must.be.associated.with.company.to.create.application=Devi essere associato company.id.required.for.preferred.call=ID azienda obbligatorio quando si richiedono solo chiamate preferite. response.days.not.null=I giorni di risposta non devono essere nulli e maggiori di zero. valid.vatnumber.message=Il numero di partita IVA � valido. -application.cannot.approved.or.rejected=La domanda non pu? essere approvata o rifiutata perch? l'emendamento ? attivo. +application.cannot.approved.or.rejected=La domanda non pu? essere approvata o rifiutata perch? Il Soccorso Istruttorio ? attivo. atleast.one.id.required=Almeno uno tra companyId o applicationId deve essere fornito. From 5fdf05fbbbc3e4bd77a5f56981cb174554f31f12 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Mon, 28 Apr 2025 17:45:23 +0530 Subject: [PATCH 10/10] Updated odessa portal password for production. --- src/main/resources/application-production.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index 65842ebb..cf3396fa 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=Valeria2016!! appointment.portal.source=GEPAFINPORTAL appointment.portal.context=GEPAFINPORTAL