From c183b69046cc22a019dd3eb03812143105f4f461 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 7 Jan 2025 18:17:23 +0530 Subject: [PATCH 01/25] Fixed issue during user creation from SPID --- src/main/java/net/gepafin/tendermanagement/dao/UserDao.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 1c06ccaf..0ffa0b42 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -190,6 +190,8 @@ public class UserDao { userReq.setHubUuid(userEntity.getHub().getUniqueUuid()); }else { samlSuccessHandler.validateToken(tempToken, userReq.getCodiceFiscale(), userReq.getHubUuid()); + RoleEntity roleEntity = roleDao.getRoleByType(RoleStatusEnum.ROLE_BENEFICIARY); + userReq.setRoleId(roleEntity.getId()); } if (Boolean.FALSE.equals(Utils.isValidEmail(userReq.getEmail()))) { From d95f2833db0ad00ca9d15ac7f4a08b60a23addd5 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Wed, 8 Jan 2025 17:11:45 +0530 Subject: [PATCH 02/25] Added RabbitMQ config for production. --- src/main/resources/application-production.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index 07dd31ff..2cbd72a3 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -32,7 +32,8 @@ appointment.portal.context=GEPAFINPORTAL flagDaFirmare=true # RabbitMQ properties for STOMP broker relay for Notification -spring.rabbitmq.host=rabbitmq.bflows.ai +#spring.rabbitmq.host=rabbitmq.bflows.ai +spring.rabbitmq.host=172.21.0.2 spring.rabbitmq.port=61613 spring.rabbitmq.username=guest spring.rabbitmq.password=guest From 48be636d65bf2a1aefd901ef64ff326d266920ae Mon Sep 17 00:00:00 2001 From: Rinaldo <66477605+rbonazzo-KZ@users.noreply.github.com> Date: Wed, 8 Jan 2025 14:26:35 +0100 Subject: [PATCH 03/25] Update application-production.properties Correct rabbitMQ address for production --- src/main/resources/application-production.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index 2cbd72a3..1a210195 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -33,8 +33,8 @@ flagDaFirmare=true # RabbitMQ properties for STOMP broker relay for Notification #spring.rabbitmq.host=rabbitmq.bflows.ai -spring.rabbitmq.host=172.21.0.2 +spring.rabbitmq.host=172.18.0.5 spring.rabbitmq.port=61613 spring.rabbitmq.username=guest spring.rabbitmq.password=guest -spring.rabbitmq.virtual-host=/ \ No newline at end of file +spring.rabbitmq.virtual-host=/ From 97d7878ec810a1e9f1e57e3a74ffcd04f448181e Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 9 Jan 2025 18:10:31 +0530 Subject: [PATCH 04/25] Removed delega check from create application API --- .../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 e281615f..c8185408 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -219,7 +219,7 @@ public class ApplicationDao { } public ApplicationEntity createApplicationEntity(UserEntity user, CallEntity call, UserWithCompanyEntity userWithCompany) { - validateDelegation(user,userWithCompany); +// validateDelegation(user,userWithCompany); ApplicationEntity entity = new ApplicationEntity(); entity.setUserId(user.getId()); entity.setCompanyId(userWithCompany.getCompanyId()); From e18716ed6289ba010718eb2e2849128d5d6f9664 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 15 Jan 2025 15:01:07 +0530 Subject: [PATCH 05/25] Fixed evaluation issue --- .../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 7cced04a..8c89b510 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -618,7 +618,7 @@ public class ApplicationEvaluationDao { entity.setIsDeleted(false); setIfUpdated(entity::getNote, entity::setNote, req.getNote()); setIfUpdated(entity::getMotivation, entity::setMotivation, req.getMotivation()); - if(Boolean.TRUE.equals(req.getApplicationStatus().equals(ApplicationStatusForEvaluation.APPROVED)) && (req.getAmountAccepted()==null || req.getAmountAccepted().compareTo(BigDecimal.ZERO) < 0)){ + if(req.getApplicationStatus()!=null && (Boolean.TRUE.equals(req.getApplicationStatus().equals(ApplicationStatusForEvaluation.APPROVED)) && (req.getAmountAccepted()==null || req.getAmountAccepted().compareTo(BigDecimal.ZERO) < 0))){ throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.AMOUNT_ACCEPTED_REQUIRED_WHILE_APPROVING_APPLICATION)); } if (req.getAmountAccepted() != null && req.getAmountAccepted().compareTo(BigDecimal.ZERO) > 0) { From 3fff35d0d156b985bf3cae868561642b919d4e40 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 15 Jan 2025 15:11:29 +0530 Subject: [PATCH 06/25] Updated code --- .../tendermanagement/dao/CompanyDao.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java index 1b3a6798..b014b779 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java @@ -143,17 +143,20 @@ public class CompanyDao { entity.setNumberOfEmployees(request.getNumberOfEmployees()); entity.setAnnualRevenue(request.getAnnualRevenue()); entity.setHub(userEntity.getHub()); - Map vatCheckResponse = request.getVatCheckResponse(); if (request.getVatCheckResponse() != null) { - if (vatCheckResponse.containsKey("dettaglio")) { - Map dettaglio = (Map) vatCheckResponse.get("dettaglio"); - if (dettaglio != null) { - if (dettaglio.containsKey("codice_ateco")) { - Object codiceAtecoObj = dettaglio.get("codice_ateco"); - String codiceAteco = (codiceAtecoObj != null) ? codiceAtecoObj.toString() : null; + Map vatCheckResponse = request.getVatCheckResponse(); + Map data = (Map) vatCheckResponse.get("data"); + if (data != null) { + if (data.containsKey("dettaglio")) { + Map dettaglio = (Map) data.get("dettaglio"); + if (dettaglio != null) { + if (dettaglio.containsKey("codice_ateco")) { + Object codiceAtecoObj = dettaglio.get("codice_ateco"); + String codiceAteco = (codiceAtecoObj != null) ? codiceAtecoObj.toString() : null; - if (codiceAteco != null) { - entity.setCodiceAteco(codiceAteco); + if (codiceAteco != null) { + entity.setCodiceAteco(codiceAteco); + } } } } From 491d8495e6d203b6ef057944a084746a115a512a Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 16 Jan 2025 13:20:23 +0530 Subject: [PATCH 07/25] Saml redirect url issue --- .../gepafin/tendermanagement/config/SamlFailureHandler.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java index 52b30dbd..bdbd0801 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java @@ -58,14 +58,16 @@ public class SamlFailureHandler implements AuthenticationFailureHandler { feBaseUrl = hub.getDomainName(); } } - response.sendRedirect(feBaseUrl + "/login"); + String redirectUrl = feBaseUrl + "/login"; + response.sendRedirect(redirectUrl); + logger.info("SAML redirect Url: " + redirectUrl); } catch (Exception e) { logger.error("Error processing SAML failure handler", e); } } public static String extractInResponseTo(String message) { - String regex = "InResponseTo attribute \\[([a-zA-Z0-9\\-]+)\\]"; + String regex = "InResponseTo attribute \\[([a-zA-Z0-9\\-_]+)\\]"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(message); From e7a93c1f4c9f7c3840faf3a0ca9f283fefb8c1ad Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 17 Jan 2025 14:31:38 +0530 Subject: [PATCH 08/25] Resolved conflicts --- .../constants/GepafinConstant.java | 1 + .../tendermanagement/dao/ApplicationDao.java | 151 +++++++++++++++++- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 8 +- 4 files changed, 155 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 7fe87275..9df65dfe 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -369,5 +369,6 @@ public class GepafinConstant { public static final String APPLICATION_PER_STATUS="applicationPerStatus"; + public static final String CALL_END_DATE_PASSED="call.end.date.passed"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 0bc667cf..41efcb9c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -49,7 +49,9 @@ import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; import java.text.MessageFormat; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.*; import java.util.stream.Collectors; import java.util.zip.ZipEntry; @@ -870,7 +872,7 @@ public class ApplicationDao { ApplicationRequest applicationRequest, Long callId, UserEntity userEntity) { CallEntity call = callService.validateCall(callId); UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyEntity.getId()); - + checkCallEndDate(call); // call = callService.validatePublishedCall(call.getId()); // checkIfApplicationExists(call, userWithCompanyEntity, userEntity); ApplicationEntity applicationEntity = createApplicationEntity(userEntity, call, userWithCompanyEntity); @@ -888,7 +890,7 @@ public class ApplicationDao { public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { ApplicationEntity applicationEntity = validateApplication(applicationId); - + checkCallEndDate(applicationEntity.getCall()); //cloned entity for old application data ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity); @@ -1117,7 +1119,7 @@ public class ApplicationDao { public ApplicationSignedDocumentResponse uploadSignedDocument(HttpServletRequest request, Long applicationId, MultipartFile file) { ApplicationEntity applicationEntity = validateApplication(applicationId); - + checkCallEndDate(applicationEntity.getCall()); //cloned entity for old data ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(applicationEntity); @@ -1250,7 +1252,8 @@ public class ApplicationDao { ApplicationEntity applicationEntity = validateApplication(applicationId); ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity); - + checkCallEndDate(applicationEntity.getCall()); + UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.DRAFT.getValue().equals(applicationEntity.getStatus()))) { @@ -1391,4 +1394,144 @@ public class ApplicationDao { throw new RuntimeException("Error while creating ZIP file", e); } } + + public PageableResponseBean> getAllApplicationByPagination(UserEntity userEntity, Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean) { + Integer pageNo = null; + Integer pageLimit = null; + if (applicationPageableRequestBean.getGlobalFilters() != null) { + pageNo = applicationPageableRequestBean.getGlobalFilters().getPage(); + pageLimit = applicationPageableRequestBean.getGlobalFilters().getLimit(); + } + if (pageLimit == null || pageLimit <= 0) { + pageLimit = GepafinConstant.DEFAULT_PAGE_LIMIT; + } + if (pageNo == null || pageNo <= 0) { + pageNo = GepafinConstant.DEFAULT_PAGE; + } + Specification spec = search(callId, companyId, applicationPageableRequestBean, userEntity); + Page entityPage = applicationRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); + // Prepare the response + + + List applicationResponses = entityPage.getContent().stream() + .map(application -> { + ApplicationResponse response = getApplicationResponse(application); + return response; + }) + .collect(Collectors.toList()); + + + PageableResponseBean> pageableResponseBean = new PageableResponseBean<>(); + pageableResponseBean.setBody(applicationResponses); + pageableResponseBean.setCurrentPage(entityPage.getNumber() + 1); // Page numbers typically start from 0, so add 1 for user-friendly indexing + pageableResponseBean.setTotalPages(entityPage.getTotalPages()); + pageableResponseBean.setTotalRecords(entityPage.getTotalElements()); + pageableResponseBean.setPageSize(entityPage.getSize()); + + return pageableResponseBean; + } + + public Specification search(Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean, UserEntity userEntity) { + return (root, query, criteriaBuilder) -> { + + List predicates = getPredicates(applicationPageableRequestBean, criteriaBuilder, root, callId, companyId, userEntity); + SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); + + if (applicationPageableRequestBean.getGlobalFilters() != null + && applicationPageableRequestBean.getGlobalFilters().getSortBy() != null && + applicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName() != null && Boolean.FALSE.equals( + isEmpty(applicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName()))) { + sortBy.setColumnName(applicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName()); + sortBy.setSortDesc(true); + if (applicationPageableRequestBean.getGlobalFilters().getSortBy().getSortDesc() != null) { + sortBy.setSortDesc(applicationPageableRequestBean.getGlobalFilters().getSortBy().getSortDesc()); + } + } + + query.orderBy(criteriaBuilder.desc(root.get(sortBy.getColumnName()))); + if (Boolean.FALSE.equals(sortBy.getSortDesc())) { + query.orderBy(criteriaBuilder.asc(root.get(sortBy.getColumnName()))); + } + return query.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))).getRestriction(); + }; + } + + + private List getPredicates(ApplicationPageableRequestBean applicationPageableRequestBean, + CriteriaBuilder criteriaBuilder, Root root, Long callId, Long companyId, UserEntity userEntity) { + + Integer year = null; + String search = null; + if (applicationPageableRequestBean.getGlobalFilters() != null) { + year = applicationPageableRequestBean.getGlobalFilters().getYear(); + search = applicationPageableRequestBean.getGlobalFilters().getSearch(); + } + List predicates = new ArrayList<>(); + + Boolean isBeneficiary = validator.checkIsBeneficiary(); + if (isBeneficiary) { + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.USER_ID), userEntity.getId())); + } + if (year != null && year > 0) { + int filterYear = applicationPageableRequestBean.getGlobalFilters().getYear(); + +// Create LocalDateTime boundaries for the start and end of the year + LocalDateTime startOfYear = LocalDateTime.of(filterYear, 1, 1, 0, 0); + LocalDateTime endOfYear = LocalDateTime.of(filterYear, 12, 31, 23, 59, 59); + +// Add the range comparison to filter records within the year + predicates.add(criteriaBuilder.between(root.get(GepafinConstant.CREATED_DATE), startOfYear, endOfYear)); + + } + // Search in `title` and `message` (if search term is provided) + if (search != null && !search.isEmpty()) { + Predicate titlePredicate = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.COMMENTS)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(titlePredicate)); + } + + // Filter by `status` (if status list is provided) + if (applicationPageableRequestBean.getStatus() != null && !applicationPageableRequestBean.getStatus().isEmpty()) { + List statusValues = applicationPageableRequestBean.getStatus().stream() + .map(ApplicationStatusTypeEnum::name) // Convert enum to string + .toList(); + predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); + } + + if (callId != null) { + CallEntity call = callService.validateCall(callId); + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.CALL).get(GepafinConstant.ID), callId)); + } + + // Optional companyId filter + if (companyId != null) { + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.COMPANY_ID), companyId)); + } + predicates.add(criteriaBuilder.isFalse(root.get(GepafinConstant.IS_DELETED))); + + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB_ID), userEntity.getHub().getId())); + + + return predicates; + + } + 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_END_DATE_PASSED) + ); + } + } + + } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index c743b3fa..f335111d 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -347,3 +347,4 @@ notification.deleted.successfully=Notification deleted successfully. notification.updated.successfully=Notification updated successfully. user.with.company.not.found = User with company not found for user or company. amount.accepted.required=Amount accepted is required while approving the application. +call.end.date.passed=Call end date and time has been passed. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 14a5dbb5..6f060604 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -304,7 +304,6 @@ beneficiary.call.duplicate = Una chiamata preferita con questo ID di chiamata e user.must.be.associated.with.company.to.create.application=Devi essere associato a un'azienda per poter presentare domanda per questa applicazione. 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. -application.cannot.approved.or.rejected=La domanda non pu� essere approvata o rifiutata perch� l'emendamento � attivo. 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. @@ -338,4 +337,9 @@ notification.sent.successfully=Notifica inviata con successo. notification.deleted.successfully=Notifica eliminata con successo. notification.updated.successfully=Notifica aggiornata con successo. user.with.company.not.found = Utente con azienda non trovato per utente o azienda. -amount.accepted.required=L'importo accettato obbligatorio durante l'approvazione della domanda. +amount.accepted.required=L'importo accettato � obbligatorio durante l'approvazione della domanda. + +user.action.fetched.successfully = Dettagli sull'azione dell'utente recuperati correttamente. +action.context.labels.fetched.successfully = Etichette del contesto dell'azione recuperate correttamente. +amount.accepted.required=L'importo accettato � obbligatorio durante l'approvazione della domanda. +call.end.date.passed=La data e l'ora di fine della chiamata sono state trascorse. From 9ddb7aaf3cf9886bf3af7d8433e0da1287e84b78 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 17 Jan 2025 15:14:22 +0530 Subject: [PATCH 09/25] Resolved Conflicts --- .../constants/GepafinConstant.java | 4 +- .../tendermanagement/dao/ApplicationDao.java | 127 +----------------- .../tendermanagement/dao/FlowFormDao.java | 2 + .../model/response/ApplicationResponse.java | 3 + .../response/NextOrPreviousFormResponse.java | 5 + src/main/resources/message_en.properties | 2 +- src/main/resources/message_it.properties | 2 +- 7 files changed, 16 insertions(+), 129 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 9df65dfe..98cfa8d1 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -367,8 +367,6 @@ public class GepafinConstant { public static final String COUNT="count"; public static final String APPLICATION_PER_CALL="applicationPerCall"; public static final String APPLICATION_PER_STATUS="applicationPerStatus"; - - - public static final String CALL_END_DATE_PASSED="call.end.date.passed"; + public static final String CALL_EXPIRED="call.expired"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 41efcb9c..c3ec4f47 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -186,6 +186,7 @@ public class ApplicationDao { // callService.validatePublishedCall(formEntity.getCall().getId()); validateFormFields(applicationRequestBean,formEntity); ApplicationEntity applicationEntity = validateApplication(applicationId); + checkCallEndDate(applicationEntity.getCall()); validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); if(Boolean.FALSE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.DRAFT.getValue()))) { throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_NOT_IN_DRAFT_STATUS)); @@ -405,6 +406,7 @@ public class ApplicationDao { responseBean.setProgress(progress); responseBean.setCallTitle(applicationEntity.getCall().getName()); responseBean.setCallEndDate(applicationEntity.getCall().getEndDate()); + responseBean.setCallEndTime(applicationEntity.getCall().getEndTime()); responseBean.setModifiedDate(applicationEntity.getCall().getUpdatedDate()); responseBean.setCallId(applicationEntity.getCall().getId()); responseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); @@ -1394,129 +1396,6 @@ public class ApplicationDao { throw new RuntimeException("Error while creating ZIP file", e); } } - - public PageableResponseBean> getAllApplicationByPagination(UserEntity userEntity, Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean) { - Integer pageNo = null; - Integer pageLimit = null; - if (applicationPageableRequestBean.getGlobalFilters() != null) { - pageNo = applicationPageableRequestBean.getGlobalFilters().getPage(); - pageLimit = applicationPageableRequestBean.getGlobalFilters().getLimit(); - } - if (pageLimit == null || pageLimit <= 0) { - pageLimit = GepafinConstant.DEFAULT_PAGE_LIMIT; - } - if (pageNo == null || pageNo <= 0) { - pageNo = GepafinConstant.DEFAULT_PAGE; - } - Specification spec = search(callId, companyId, applicationPageableRequestBean, userEntity); - Page entityPage = applicationRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); - // Prepare the response - - - List applicationResponses = entityPage.getContent().stream() - .map(application -> { - ApplicationResponse response = getApplicationResponse(application); - return response; - }) - .collect(Collectors.toList()); - - - PageableResponseBean> pageableResponseBean = new PageableResponseBean<>(); - pageableResponseBean.setBody(applicationResponses); - pageableResponseBean.setCurrentPage(entityPage.getNumber() + 1); // Page numbers typically start from 0, so add 1 for user-friendly indexing - pageableResponseBean.setTotalPages(entityPage.getTotalPages()); - pageableResponseBean.setTotalRecords(entityPage.getTotalElements()); - pageableResponseBean.setPageSize(entityPage.getSize()); - - return pageableResponseBean; - } - - public Specification search(Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean, UserEntity userEntity) { - return (root, query, criteriaBuilder) -> { - - List predicates = getPredicates(applicationPageableRequestBean, criteriaBuilder, root, callId, companyId, userEntity); - SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); - - if (applicationPageableRequestBean.getGlobalFilters() != null - && applicationPageableRequestBean.getGlobalFilters().getSortBy() != null && - applicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName() != null && Boolean.FALSE.equals( - isEmpty(applicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName()))) { - sortBy.setColumnName(applicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName()); - sortBy.setSortDesc(true); - if (applicationPageableRequestBean.getGlobalFilters().getSortBy().getSortDesc() != null) { - sortBy.setSortDesc(applicationPageableRequestBean.getGlobalFilters().getSortBy().getSortDesc()); - } - } - - query.orderBy(criteriaBuilder.desc(root.get(sortBy.getColumnName()))); - if (Boolean.FALSE.equals(sortBy.getSortDesc())) { - query.orderBy(criteriaBuilder.asc(root.get(sortBy.getColumnName()))); - } - return query.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))).getRestriction(); - }; - } - - - private List getPredicates(ApplicationPageableRequestBean applicationPageableRequestBean, - CriteriaBuilder criteriaBuilder, Root root, Long callId, Long companyId, UserEntity userEntity) { - - Integer year = null; - String search = null; - if (applicationPageableRequestBean.getGlobalFilters() != null) { - year = applicationPageableRequestBean.getGlobalFilters().getYear(); - search = applicationPageableRequestBean.getGlobalFilters().getSearch(); - } - List predicates = new ArrayList<>(); - - Boolean isBeneficiary = validator.checkIsBeneficiary(); - if (isBeneficiary) { - predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.USER_ID), userEntity.getId())); - } - if (year != null && year > 0) { - int filterYear = applicationPageableRequestBean.getGlobalFilters().getYear(); - -// Create LocalDateTime boundaries for the start and end of the year - LocalDateTime startOfYear = LocalDateTime.of(filterYear, 1, 1, 0, 0); - LocalDateTime endOfYear = LocalDateTime.of(filterYear, 12, 31, 23, 59, 59); - -// Add the range comparison to filter records within the year - predicates.add(criteriaBuilder.between(root.get(GepafinConstant.CREATED_DATE), startOfYear, endOfYear)); - - } - // Search in `title` and `message` (if search term is provided) - if (search != null && !search.isEmpty()) { - Predicate titlePredicate = criteriaBuilder.like( - criteriaBuilder.upper(root.get(GepafinConstant.COMMENTS)), - "%" + search.toUpperCase() + "%" - ); - predicates.add(criteriaBuilder.or(titlePredicate)); - } - - // Filter by `status` (if status list is provided) - if (applicationPageableRequestBean.getStatus() != null && !applicationPageableRequestBean.getStatus().isEmpty()) { - List statusValues = applicationPageableRequestBean.getStatus().stream() - .map(ApplicationStatusTypeEnum::name) // Convert enum to string - .toList(); - predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); - } - - if (callId != null) { - CallEntity call = callService.validateCall(callId); - predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.CALL).get(GepafinConstant.ID), callId)); - } - - // Optional companyId filter - if (companyId != null) { - predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.COMPANY_ID), companyId)); - } - predicates.add(criteriaBuilder.isFalse(root.get(GepafinConstant.IS_DELETED))); - - predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB_ID), userEntity.getHub().getId())); - - - return predicates; - - } public void checkCallEndDate(CallEntity call) { LocalDateTime now = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); @@ -1528,7 +1407,7 @@ public class ApplicationDao { if (now.isAfter(callEndDateTime)) { throw new CustomValidationException( Status.BAD_REQUEST, - Translator.toLocale(GepafinConstant.CALL_END_DATE_PASSED) + Translator.toLocale(GepafinConstant.CALL_EXPIRED) ); } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index faec3489..bf68f3b9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -296,6 +296,8 @@ public class FlowFormDao { applicationDao.processForm(formEntity, applicationEntity)); nextOrPreviousFormResponse.setCallId(applicationEntity.getCall().getId()); nextOrPreviousFormResponse.setCallTitle(applicationEntity.getCall().getName()); + nextOrPreviousFormResponse.setCallEndDate(applicationEntity.getCall().getEndDate()); + nextOrPreviousFormResponse.setCallEndTime(applicationEntity.getCall().getEndTime()); nextOrPreviousFormResponse.setCompanyId(applicationEntity.getCompanyId()); nextOrPreviousFormResponse.setCompanyName(company.getCompanyName()); diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java index 1aae69e2..2c659838 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java @@ -5,6 +5,7 @@ import net.gepafin.tendermanagement.model.response.ApplicationFormFieldResponseB import java.math.BigDecimal; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.List; @Data @@ -18,6 +19,8 @@ public class ApplicationResponse{ private LocalDateTime callEndDate; + private LocalTime callEndTime; + private LocalDateTime modifiedDate; private Integer progress; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java index bea417a1..6bed05fc 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java @@ -5,6 +5,7 @@ import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.time.LocalTime; @Data public class NextOrPreviousFormResponse { @@ -20,6 +21,10 @@ public class NextOrPreviousFormResponse { private Long completedSteps; private Long currentStep; + + private LocalDateTime callEndDate; + + private LocalTime callEndTime; private Long companyId; diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index f335111d..101f74f9 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -347,4 +347,4 @@ notification.deleted.successfully=Notification deleted successfully. notification.updated.successfully=Notification updated successfully. user.with.company.not.found = User with company not found for user or company. amount.accepted.required=Amount accepted is required while approving the application. -call.end.date.passed=Call end date and time has been passed. +call.expired=Call has been expired. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 6f060604..c5b07696 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -342,4 +342,4 @@ amount.accepted.required=L'importo accettato � obbligatorio durante l'approvaz user.action.fetched.successfully = Dettagli sull'azione dell'utente recuperati correttamente. action.context.labels.fetched.successfully = Etichette del contesto dell'azione recuperate correttamente. amount.accepted.required=L'importo accettato � obbligatorio durante l'approvazione della domanda. -call.end.date.passed=La data e l'ora di fine della chiamata sono state trascorse. +call.expired=La chiamata � scaduta. From e496d7b19984cdd786d2a63b788cd18c6d3cba49 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 20 Jan 2025 12:17:35 +0530 Subject: [PATCH 10/25] Fixed error while moving file to deleted folder --- .../service/impl/AmazonS3ServiceImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 8221117a..9909f732 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -153,11 +153,17 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { } } + private String decodeS3Key(String key) { + return URLDecoder.decode(key, StandardCharsets.UTF_8); + } + @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); - oldPath = cleanOldPath(oldPath); log.info("Moving file from {} to {} in bucket {}", oldPath, newPath, bucketName); CopyObjectRequest copyRequest = new CopyObjectRequest(bucketName, oldPath, bucketName, newPath); From 69f97a08eea33ae750e88d99127f64221554599a Mon Sep 17 00:00:00 2001 From: harish Date: Tue, 21 Jan 2025 22:39:55 +0530 Subject: [PATCH 11/25] Fixed isRequested amount issue --- .../tendermanagement/dao/ApplicationDao.java | 39 +++++++++---------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index c3ec4f47..e894acb5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -495,27 +495,24 @@ public class ApplicationDao { VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT; List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); - contentResponseBeans.stream() - .filter(content -> "numberinput".equals(content.getName())) - .map(ContentResponseBean::getSettings) - .flatMap(List::stream) - .filter(setting -> "isRequestedAmount".equals(setting.getName()) && Boolean.TRUE.equals(setting.getValue())) - .findFirst() - .ifPresent(setting -> { - Object fieldValue = applicationFormFieldRequestBean.getFieldValue(); - if(fieldValue!=null) { - if (fieldValue instanceof String) { - try { - BigDecimal amountRequested = new BigDecimal((String) fieldValue); - applicationFormEntity.getApplication().setAmountRequested(amountRequested); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("Field value is not a valid number: " + fieldValue, e); - } - } else { - throw new IllegalArgumentException("Field value is not a String: " + fieldValue); - } - } - }); + contentResponseBeans.stream() + .filter(content -> "numberinput".equals(content.getName()) && content.getId().toString().equals(applicationFormFieldRequestBean.getFieldId())) + .map(ContentResponseBean::getSettings) + .flatMap(List::stream) + .filter(setting -> "isRequestedAmount".equals(setting.getName()) && Boolean.TRUE.equals(setting.getValue())) + .findFirst() + .ifPresent(setting -> { + + Object fieldValue = applicationFormFieldRequestBean.getFieldValue(); + if(fieldValue!=null) { + try { + BigDecimal amountRequested = new BigDecimal(fieldValue.toString()); + applicationFormEntity.getApplication().setAmountRequested(amountRequested); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("Field value is not a valid number: " + fieldValue, e); + } + } + }); ApplicationFormFieldEntity oldApplicationFormFieldData = null; From 33844b0f30d854061da574a7702ae600b3487970 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 22 Jan 2025 16:38:46 +0530 Subject: [PATCH 12/25] Added validation for the requested amount in the application. --- .../gepafin/tendermanagement/constants/GepafinConstant.java | 1 + .../java/net/gepafin/tendermanagement/dao/ApplicationDao.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 98cfa8d1..11b0fc10 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -368,5 +368,6 @@ public class GepafinConstant { public static final String APPLICATION_PER_CALL="applicationPerCall"; public static final String APPLICATION_PER_STATUS="applicationPerStatus"; public static final String CALL_EXPIRED="call.expired"; + public static final String AMOUNT_REQUEST_SHOULD_GREATED_THEN_ZERO = "amount.request.should.greated.then.zero"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index e894acb5..de86e69f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1258,6 +1258,9 @@ public class ApplicationDao { if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.DRAFT.getValue().equals(applicationEntity.getStatus()))) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_NOT_IN_DRAFT_STATUS)); } + if (applicationEntity.getAmountRequested() == null || applicationEntity.getAmountRequested().compareTo(BigDecimal.ZERO) <= 0 ) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.AMOUNT_REQUEST_SHOULD_GREATED_THEN_ZERO)); + } List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); Long totalSteps = flowFormDao.calculateTotalSteps(flowEdgesList); Integer completedSteps = flowFormDao.getCompletedSteps(applicationEntity); From a9fdfed85a78d25f0f336fa2618883b1c1dde0c1 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 22 Jan 2025 16:39:10 +0530 Subject: [PATCH 13/25] Resolved conflicts --- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 101f74f9..3762684a 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -348,3 +348,4 @@ notification.updated.successfully=Notification updated successfully. user.with.company.not.found = User with company not found for user or company. amount.accepted.required=Amount accepted is required while approving the application. call.expired=Call has been expired. +amount.request.should.greated.then.zero=Requested amount should not be empty and should be greater than zero. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index c5b07696..4223b4f1 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -343,3 +343,4 @@ user.action.fetched.successfully = Dettagli sull'azione dell'utente recuperati c action.context.labels.fetched.successfully = Etichette del contesto dell'azione recuperate correttamente. amount.accepted.required=L'importo accettato � obbligatorio durante l'approvazione della domanda. call.expired=La chiamata � scaduta. +amount.request.should.greated.then.zero=L'importo richiesto non deve essere vuoto e deve essere maggiore di zero. From 15aac663018c00818efc7e957519443486f74484 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 22 Jan 2025 18:04:46 +0530 Subject: [PATCH 14/25] Fixed motivation field issue --- .../net/gepafin/tendermanagement/dao/EmailNotificationDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 88e6954a..3988b35a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -265,7 +265,7 @@ public class EmailNotificationDao { bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); - bodyPlaceholders.put("{{form_text}}", applicationEvaluationEntity.getNote()); + bodyPlaceholders.put("{{form_text}}", applicationEvaluationEntity.getMotivation()); sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, bodyPlaceholders, null,null); } From 15eea97fe503e56a3d4f76ba6a0441d5388a3a01 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 23 Jan 2025 18:51:31 +0530 Subject: [PATCH 15/25] Updated code for create assigned application --- .../dao/AssignedApplicationsDao.java | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index cc281df7..f9a3476f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -8,7 +8,6 @@ import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.CompanyEntity; -import net.gepafin.tendermanagement.entities.FaqEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; @@ -80,8 +79,13 @@ public class AssignedApplicationsDao { log.info("Assigning application to pre-Instructor with details: {}", applicationId, userId); AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); - if (assignedApplications != null) { + if (assignedApplications != null && assignedApplications.getUserId().equals(userId)) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED)); + } else if(assignedApplications != null) { + assignedApplications = reassignApplication(userId, assignedByUser, assignedApplications); + AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignedApplications); + log.info("Application re-assigned succesfully {}", assignApplicationToInstructorResponse); + return assignApplicationToInstructorResponse; } ApplicationEntity application = applicationService.validateApplication(applicationId); @@ -107,6 +111,30 @@ public class AssignedApplicationsDao { return assignApplicationToInstructorResponse; } + private AssignedApplicationsEntity reassignApplication(Long userId, UserEntity assignedByUser, + AssignedApplicationsEntity assignedApplication) { + + AssignedApplicationsEntity oldAssignedApplicationEntity = Utils.getClonedEntityForData(assignedApplication); + + setIfUpdated(assignedApplication::getAssignedBy, assignedApplication::setAssignedBy, assignedByUser.getId()); + setIfUpdated(assignedApplication::getUserId, assignedApplication::setUserId, userId); + assignedApplication.setAssignedAt(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + Optional entityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplication.getId()); + if(entityOptional.isPresent()) { + ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils.getClonedEntityForData(entityOptional.get()); + setIfUpdated(entityOptional.get()::getUserId, entityOptional.get()::setUserId, userId); + applicationEvaluationRepository.save(entityOptional.get()); + /** This code is responsible for adding a version history log for the "Create Application" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluationEntity).newData(entityOptional.get()).build()); + + }; + assignedApplication = assignedApplicationsRepository.save(assignedApplication); + /** This code is responsible for adding a version history log for the "Create Application" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldAssignedApplicationEntity).newData(assignedApplication).build()); + + return assignedApplication; + } + public AssignedApplicationsEntity createAssignmentEntity(ApplicationEntity application, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest) { AssignedApplicationsEntity assignApplication = new AssignedApplicationsEntity(); assignApplication.setApplication(application); From f64b37b9f592c7796dee13804150ea8395c68e5f Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 29 Jan 2025 13:00:18 +0530 Subject: [PATCH 16/25] Fixed issue for evaluation expiration --- .../tendermanagement/dao/NotificationDao.java | 14 ++++++++++++++ .../ApplicationAmendmentRequestRepository.java | 4 ++-- .../ApplicationEvaluationRepository.java | 2 +- .../scheduler/ApplicationEvaluationScheduler.java | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java index 9acacdb0..5308f163 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java @@ -192,6 +192,20 @@ public class NotificationDao { } } + public void sendNotificationToInstructorManager(Map placeHolders, ApplicationEvaluationEntity applicationEvaluationEntity, NotificationTypeEnum notificationTypeEnum) { + + List userEntities=userRepository.findByRoleEntity_RoleTypeAndHubId(RoleStatusEnum.ROLE_INSTRUCTOR_MANAGER.getValue(),applicationEvaluationEntity.getAssignedApplicationsEntity().getApplication().getHubId()); + for (UserEntity user:userEntities) { + Long instructorId=user.getId(); + ApplicationEntity application = applicationService.validateApplication(applicationEvaluationEntity.getApplicationId()); + if (instructorId != null) { + NotificationReq notificationreq = createNotificationReq(notificationTypeEnum.getValue(), placeHolders, instructorId, application.getUserWithCompany(), + null); + sendNotification(notificationreq); + } + } + } + public List getAllCompanyIdsForUser(Long userId) { return userWithCompanyRepository.findActiveCompanyIdsByUserId(userId); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 3c89993c..1192f334 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -57,7 +57,7 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository 'CLOSE' " + + "AND a.status NOT IN('CLOSE','EXPIRED') " + "AND a.endDate < :currentTime") List findAmendmentsDueForExpiration(LocalDateTime currentTime); @@ -70,7 +70,7 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository 'CLOSE' " + + " AND activeAmendment.status NOT IN('CLOSE','EXPIRED') " + " AND activeAmendment.isDeleted = false) ") Set findEvaluationsWithoutActiveAmendmentsByIds(@Param("applicationEvaluationIds") Set applicationEvaluationIds); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java index cf0b9c66..d8e13228 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java @@ -32,7 +32,7 @@ public interface ApplicationEvaluationRepository extends JpaRepository findAllByIsDeletedFalseAndEndDateBefore(@Param("currentDate") LocalDateTime currentDate); @Query("SELECT a FROM ApplicationEvaluationEntity a " + diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java index e7249645..c43aca10 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java @@ -90,7 +90,7 @@ public class ApplicationEvaluationScheduler { Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_EXPIRED); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_EXPIRED); notificationDao.sendNotificationToInstructor(placeHolders,evaluation,NotificationTypeEnum.EVALUATION_EXPIRED); - + notificationDao.sendNotificationToInstructorManager(placeHolders,evaluation,NotificationTypeEnum.EVALUATION_EXPIRED); // Logging version history for the update operation loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(httpServletRequest) From a065c264033dff187e6d6b6dda7b0fe2a63cb4b7 Mon Sep 17 00:00:00 2001 From: Piyush Date: Fri, 31 Jan 2025 19:04:58 +0530 Subject: [PATCH 17/25] Resolved conflicts --- .../constants/GepafinConstant.java | 40 +++++++++++++++++++ .../dao/EmailNotificationDao.java | 10 ++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 11b0fc10..0601f8e5 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -369,5 +369,45 @@ public class GepafinConstant { public static final String APPLICATION_PER_STATUS="applicationPerStatus"; public static final String CALL_EXPIRED="call.expired"; public static final String AMOUNT_REQUEST_SHOULD_GREATED_THEN_ZERO = "amount.request.should.greated.then.zero"; + + + + public static final String EVALUATION_FORM_CREATED_SUCCESSFULLY = "evaluation.form.created.successfully"; + public static final String EVALUATION_FORM_UPDATED_SUCCESSFULLY = "evaluation.form.updated.successfully"; + public static final String EVALUATION_FORM_DELETED_SUCCESSFULLY = "evaluation.form.deleted.successfully"; + public static final String EVALUATION_FORM_FETCHED_SUCCESSFULLY = "evaluation.form.fetched.successfully"; + + public static final String EVALUATION_FORM_NOT_FOUND = "evaluation.form.not.found"; + + public static final String EVALUATION_V2_STEP_2 = "EVALUATION_V2_STEP_2"; + + public static final String EITHER_APPLICATION_ID_OR_ASSIGNED_APPLICATION_ID_MUST_BE_PROVIDED = "either.applicationId.or.assignedApplicationId.must.be.provided"; + public static final String ASSIGNED_APPLICATION_STATUS_UPDATED_SUCCESSFULLY = "assigned.application.status.updated.successfully"; + + public static final String REQUIRED_REQUESTED_AMOUNT_MSG = "validation.required.requested.amount"; + public static final String CRITERIA_TABLE_COLUMNS="criteria_table_columns"; + + public static final String DOCUMENTATION_INTEGRATION_REQUEST_SVILUPPUMBRIA= "\n" + + " \n" + + "
\n" + + "

RICHIESTA INTEGRAZIONE DOCUMENTALE

\n" + + "

Buongiorno,

\n" + + "

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

\n" + + " {{note}}\n" + + "

Vi invitiamo a fornire quanto sopra richiesto integrando la documentazione caricandola all'interno dello sportello\n" + + " online {{platform_link}} entro e non oltre {{response_days}} giorni dal ricevimento della presente comunicazione,\n" + + " precisando che, in caso di mancata ricezione nei termini indicati, saremo costretti a non prendere in considerazione la Vostra richiesta di finanziamento.\n" + + "

\n" + + "

La documentazione trasmessa e le informazioni fornite saranno processate dall'istruttore assegnatario della pratica.\n" + + "

\n" + + "

Distinti Saluti,

\n" + + "

{{email_signature}}

\n" + + "
\n" + + " \n" + + ""; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 3988b35a..7bc8010d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -94,7 +94,15 @@ public class EmailNotificationDao { subjectPlaceholders.put("{{company_name}}", company.getCompanyName()); // bodyPlaceholders.put("{{legal_mail}}", legalMail); String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); - String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + String body; + if ("t7jh5wfg9QXylNaTZkPoE".equals(hubEntity.getUniqueUuid()) && templateType.equals(SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST)) { + bodyPlaceholders.put("{{email_signature}}", hubEntity.getEmailSignature()); + bodyPlaceholders.put("{{platform_link}}",hubEntity.getDomainName()); + body = Utils.replacePlaceholders(GepafinConstant.DOCUMENTATION_INTEGRATION_REQUEST_SVILUPPUMBRIA, bodyPlaceholders); + } + else { + body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + } return new EmailContentResponse(subject, body, systemEmailTemplateResponse); } From b4061d72574a7e9771881205ec1122d1a57a6519 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 4 Feb 2025 17:43:10 +0530 Subject: [PATCH 18/25] Resolved conflict --- .../constants/GepafinConstant.java | 16 ++++++++++++++++ .../dao/EmailNotificationDao.java | 4 ++++ .../db/changelog/db.changelog-1.0.0.xml | 4 ++++ ...template_application_rejected_04_02_2025.sql | 17 +++++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 src/main/resources/db/dump/update_system_email_template_application_rejected_04_02_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 0601f8e5..0a357530 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -409,5 +409,21 @@ public class GepafinConstant { " \n" + " \n" + ""; + + + public static final String APPLICATION_REJECTED_SVILUPPUMBRIA = "\n" + + " \n" + + "
\n" + + "

Buongiorno,

\n" + + "

Si comunica che, in riferimento alla domanda a valere sul bando “{{call_name}}” di cui al\n" + + " Protocollo n. {{protocol_number}} del {{protocol_date}} alle {{protocol_time}},\n" + + " la stessa è stata sottoposta ad istruttoria di ammissibilità con esito negativo.

\n" + + "

Le motivazioni sono le seguenti: {{form_text}}

\n" + + "

Vi ricordiamo che i Beneficiari che hanno presentato richieste valutate non ammissibili entro 10 giorni dalla data di ricevimento della presente potranno finoltrare richiesta di chiarimenti e/o osservazioni alla scrivente Società ai sensi e per gli effetti dell’art.10 bis della L.241/1990 e s.m.i.

\n" + + "

Distinti Saluti,

\n" + + "

{{email_signature}}

\n" + + "
\n" + + " \n" + + ""; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 7bc8010d..bcdf4069 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -100,6 +100,10 @@ public class EmailNotificationDao { bodyPlaceholders.put("{{platform_link}}",hubEntity.getDomainName()); body = Utils.replacePlaceholders(GepafinConstant.DOCUMENTATION_INTEGRATION_REQUEST_SVILUPPUMBRIA, bodyPlaceholders); } + if ("t7jh5wfg9QXylNaTZkPoE".equals(hubEntity.getUniqueUuid()) && templateType.equals(SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE)) { + bodyPlaceholders.put("{{email_signature}}", hubEntity.getEmailSignature()); + body = Utils.replacePlaceholders(GepafinConstant.APPLICATION_REJECTED_SVILUPPUMBRIA, bodyPlaceholders); + } else { body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); } 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 25ff1bf2..969a2a9d 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 @@ -2203,4 +2203,8 @@ + + + diff --git a/src/main/resources/db/dump/update_system_email_template_application_rejected_04_02_2025.sql b/src/main/resources/db/dump/update_system_email_template_application_rejected_04_02_2025.sql new file mode 100644 index 00000000..67815ab0 --- /dev/null +++ b/src/main/resources/db/dump/update_system_email_template_application_rejected_04_02_2025.sql @@ -0,0 +1,17 @@ +UPDATE gepafin_schema.system_email_template +SET html_content = ' + +
+

Buongiorno,

+

Si comunica che, in riferimento alla domanda a valere sul bando “{{call_name}}” di cui al + Protocollo n. {{protocol_number}} del {{protocol_date}} alle {{protocol_time}}, + la stessa è stata sottoposta ad istruttoria di ammissibilità con esito negativo.

+

Le motivazioni sono le seguenti: {{form_text}}

+

Vi ricordiamo che i Beneficiari che hanno presentato richieste valutate non ammissibili entro 10 giorni dalla data di ricevimento della presente potranno formulare ricorso al Gestore tramite modello disponibile nello sportello online + {{platform_link}}.

+

Distinti Saluti,

+

{{email_signature}}

+
+ + ' +WHERE "type" = 'INADMISSIBILITY_NOTIFICATION'; \ No newline at end of file From a6ef4ab9f8b6b2d7bc60ff08946806a3e6b0a7cf Mon Sep 17 00:00:00 2001 From: Piyush Date: Wed, 5 Feb 2025 12:14:10 +0530 Subject: [PATCH 19/25] Updated email content for DOCUMENTATION_INTEGRATION_REQUEST_SVILUPPUMBRIA --- .../net/gepafin/tendermanagement/constants/GepafinConstant.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 0a357530..9b185c56 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -393,7 +393,7 @@ public class GepafinConstant { "

RICHIESTA INTEGRAZIONE DOCUMENTALE

\n" + "

Buongiorno,

\n" + "

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

\n" + From 709e173d43a2fa1d35c9a7700bbdc94f60fe05a0 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 5 Feb 2025 12:39:03 +0530 Subject: [PATCH 20/25] Fixed issue for email updation in company --- .../java/net/gepafin/tendermanagement/dao/CompanyDao.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java index b014b779..3a527d9f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java @@ -230,8 +230,8 @@ public class CompanyDao { String responseJson = companyRequest.getVatCheckResponse() != null ? Utils.convertMapIntoJsonString(companyRequest.getVatCheckResponse()) : null; setIfUpdated(userWithCompanyEntity::getJson, userWithCompanyEntity::setJson, responseJson); } - setIfUpdated(userWithCompanyEntity::getPec, userWithCompanyEntity::setPec, userWithCompanyEntity.getPec()); - setIfUpdated(userWithCompanyEntity::getEmail, userWithCompanyEntity::setEmail, userWithCompanyEntity.getEmail()); + setIfUpdated(userWithCompanyEntity::getPec, userWithCompanyEntity::setPec, companyRequest.getPec()); + setIfUpdated(userWithCompanyEntity::getEmail, userWithCompanyEntity::setEmail, companyRequest.getEmail()); setIfUpdated(userWithCompanyEntity::getContactName, userWithCompanyEntity::setContactName, companyRequest.getContactName()); setIfUpdated(userWithCompanyEntity::getContactEmail, userWithCompanyEntity::setContactEmail, companyRequest.getContactEmail()); setIfUpdated(userWithCompanyEntity::getIsLegalRepresentant, userWithCompanyEntity::setIsLegalRepresentant, companyRequest.getIsLegalRepresentant()); From 8cce4f483bc85535320a9a41af814dbdd42bf3fa Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 6 Feb 2025 15:03:49 +0530 Subject: [PATCH 21/25] Updated code --- .../net/gepafin/tendermanagement/dao/EmailNotificationDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index bcdf4069..8133e5f7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -100,7 +100,7 @@ public class EmailNotificationDao { bodyPlaceholders.put("{{platform_link}}",hubEntity.getDomainName()); body = Utils.replacePlaceholders(GepafinConstant.DOCUMENTATION_INTEGRATION_REQUEST_SVILUPPUMBRIA, bodyPlaceholders); } - if ("t7jh5wfg9QXylNaTZkPoE".equals(hubEntity.getUniqueUuid()) && templateType.equals(SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE)) { + else if ("t7jh5wfg9QXylNaTZkPoE".equals(hubEntity.getUniqueUuid()) && templateType.equals(SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE)) { bodyPlaceholders.put("{{email_signature}}", hubEntity.getEmailSignature()); body = Utils.replacePlaceholders(GepafinConstant.APPLICATION_REJECTED_SVILUPPUMBRIA, bodyPlaceholders); } From f4c1956cb3d0b077ad59d3334dc7fb6a93807fcd Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 27 Jan 2025 18:24:09 +0530 Subject: [PATCH 22/25] Fixed issue in pdf --- src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index a2e437cd..eda1d70f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -339,8 +339,9 @@ public class PdfDao { for (String key : orderedKeys) { if (stateFieldMap.containsKey(key)) { // Only add data cell if key is in stateFieldMap Object value = row.getOrDefault(key, ""); // Fetch value or use empty string if key not present - String fieldValue= (String) value; - if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ +// String fieldValue= (String) value; + String fieldValue = value != null ? value.toString() : ""; + if(Boolean.TRUE.equals(Utils.isItalianFormattedAmount(fieldValue)) ){ fieldValue= String.valueOf(Utils.convertToItalianFormat(fieldValue)); } // PdfPCell dataCell = new PdfPCell(new Phrase(fieldValue != null ?fieldValue: "", textFont)); From 109a0e1960fe1084002a2533f6bd2fcf686769f1 Mon Sep 17 00:00:00 2001 From: nisha Date: Sat, 8 Feb 2025 12:37:11 +0530 Subject: [PATCH 23/25] Updated default email in production properties --- .../net/gepafin/tendermanagement/dao/ApplicationDao.java | 7 ++++++- src/main/resources/application-production.properties | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index de86e69f..af16c5b8 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1110,8 +1110,13 @@ public class ApplicationDao { } emailLogRequest.setRecipientEmails(hub.getEmail()); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(hub.getEmail()),emailLogRequest); + List listDefaultSystemReceiverEmail = Arrays.stream(defaultSystemReceiverEmail.split(",")) + .map(String::trim) + .filter(email -> !email.isEmpty()) + .toList(); + emailLogRequest.setRecipientEmails(defaultSystemReceiverEmail); - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(defaultSystemReceiverEmail),emailLogRequest); + emailNotificationDao.sendMail(hub.getId(), subject, body, listDefaultSystemReceiverEmail,emailLogRequest); emailLogRequest.setRecipientEmails(rinaldoEmail); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(rinaldoEmail),emailLogRequest); } diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index 1a210195..8c181965 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -16,7 +16,7 @@ spid.ipd.base.url=https://login.regione.umbria.it active.profile.folder=production isMailSendingEnabled = true -default_System_Receiver_Email=c.moretti@gepafin.it +default_System_Receiver_Email=m.gaudino@gepafin.it,f.marinelli@gepafin.it gepafin_email=bandi@pec.gepafin.it rinaldo_email=rinaldo.bonazzo@bflows.net carlo_email=carlo.mancosu@bflows.net From 3b3182cc1fd9f7c3054524e297f1cea08ad1722d Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 11 Feb 2025 18:24:18 +0530 Subject: [PATCH 24/25] Resolved conflict --- .../tendermanagement/dao/ApplicationDao.java | 16 ++++++ .../repositories/ApplicationRepository.java | 56 +++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index af16c5b8..8bc2eb00 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -874,6 +874,10 @@ public class ApplicationDao { checkCallEndDate(call); // call = callService.validatePublishedCall(call.getId()); // checkIfApplicationExists(call, userWithCompanyEntity, userEntity); + HubEntity hubEntity = hubService.valdateHub(call.getHub().getId()); + if(hubEntity.getUniqueUuid().equals(defaultHubUuid)){ + checkIfApplicationExists(call, userWithCompanyEntity, userEntity); + } ApplicationEntity applicationEntity = createApplicationEntity(userEntity, call, userWithCompanyEntity); applicationEntity.setComments(applicationRequest.getComments()); applicationEntity = saveApplicationEntity(applicationEntity); @@ -886,6 +890,18 @@ public class ApplicationDao { // } // } + public void checkIfApplicationExists(CallEntity call, UserWithCompanyEntity userWithCompanyEntity, UserEntity userEntity){ + + List applications = applicationRepository.findByUserIdAndUserWithCompany_IdAndCall_IdAndIsDeletedFalseAndStatusNot( + userEntity.getId(), userWithCompanyEntity.getId(), call.getId(), ApplicationStatusTypeEnum.REJECTED.name() + ); + + if (!applications.isEmpty()) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_EXISTS)); + } + } + + public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { ApplicationEntity applicationEntity = validateApplication(applicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index c46c52c7..d57b7d0c 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -77,4 +77,60 @@ public interface ApplicationRepository extends JpaRepository findApplicationIdsByHubId(@Param("hubId") Long hubId); + + @Query("SELECT a.status, COUNT(a.id) FROM ApplicationEntity a WHERE a.isDeleted = false AND a.userId = :userId AND a.userWithCompany.id = :userWithCompanyId AND a.call.hub.id = :hubId GROUP BY a.status") + List findApplicationsByStatusAndUserIdAndUserWithCompanyId(@Param("hubId") Long hubId, + @Param("userId") Long userId, + @Param("userWithCompanyId") Long userWithCompanyId); + + @Query(""" + SELECT TO_CHAR(a.submissionDate, 'Mon') AS month, + SUM(a.amountRequested) AS totalRequested, + SUM(a.amountAccepted) AS totalApproved + FROM ApplicationEntity a + WHERE a.isDeleted = false + AND a.status = 'APPROVED' + AND a.call.hub.id = :hubId + AND a.userId = :userId + AND a.userWithCompany.id = :userWithCompanyId + GROUP BY TO_CHAR(a.submissionDate, 'Mon'), EXTRACT(YEAR FROM a.submissionDate), EXTRACT(MONTH FROM a.submissionDate) + ORDER BY EXTRACT(YEAR FROM a.submissionDate), EXTRACT(MONTH FROM a.submissionDate) +""") + List findRequestedVsApprovedAmountsPerMonth( + @Param("hubId") Long hubId, + @Param("userId") Long userId, + @Param("userWithCompanyId") Long userWithCompanyId + ); + + @Query("SELECT COUNT(a) FROM ApplicationEntity a " + + "WHERE a.hubId = :hubId " + + "AND a.userId = :userId " + + "AND a.userWithCompany.id = :userWithCompanyId " + + "AND a.isDeleted = false " + + "AND a.status IN :statusList " + + "AND a.submissionDate IS NOT NULL") + Long countSubmittedApplicationsByHubIdAndUserId( + @Param("hubId") Long hubId, + @Param("userId") Long userId, + @Param("userWithCompanyId") Long userWithCompanyId, + @Param("statusList") List statusList + ); + + @Query("SELECT COUNT(a) FROM ApplicationEntity a " + + "WHERE a.hubId = :hubId " + + "AND a.userId = :userId " + + "AND a.userWithCompany.id = :userWithCompanyId " + + "AND a.status = :status " + + "AND a.isDeleted = false") + Long countSubmittedApplicationsByHubIdAndUserIdAndStatus( + @Param("hubId") Long hubId, + @Param("userId") Long userId, + @Param("userWithCompanyId") Long userWithCompanyId, + @Param("status") String status); + @Query("SELECT SUM(a.amountAccepted) FROM ApplicationEntity a WHERE a.hubId = :hubId AND a.userId = :userId AND a.status = 'APPROVED' AND a.userWithCompany.id = :userWithCompanyId AND a.isDeleted = false") + BigDecimal sumAmountRequestedByHubIdAndUserId(@Param("hubId") Long hubId, @Param("userId") Long userId, @Param("userWithCompanyId") Long userWithCompanyId); + + List findByUserIdAndUserWithCompany_IdAndCall_IdAndIsDeletedFalseAndStatusNot( + Long userId, Long userWithCompanyId, Long callId, String status + ); } From ad8a8daf2d87fb9a6aae9527d43fa31d64fc8e2d Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 13 Feb 2025 12:40:47 +0530 Subject: [PATCH 25/25] Done ticket GEPAFINBE-168 --- .../tendermanagement/dao/ApplicationDao.java | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 8bc2eb00..caa7fee0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1119,20 +1119,22 @@ public class ApplicationDao { // mailUtil.sendByMailGun(subject, body, List.of(defaultSystemReceiverEmail), null); // mailUtil.sendByMailGun(subject, body, List.of(gepafinEmail), null); // mailUtil.sendByMailGun(subject, body, List.of(rinaldoEmail), null); - if(validator.isProductionProfileActivated()) { - emailLogRequest.setRecipientEmails(carloEmail); + if(Boolean.TRUE.equals(hub.getUniqueUuid().equals(defaultHubUuid))) { + if (validator.isProductionProfileActivated()) { + emailLogRequest.setRecipientEmails(carloEmail); // mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null); - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(carloEmail),emailLogRequest); - } + emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(carloEmail),emailLogRequest); + } + List listDefaultSystemReceiverEmail = Arrays.stream(defaultSystemReceiverEmail.split(",")) + .map(String::trim) + .filter(email -> !email.isEmpty()) + .toList(); + + emailLogRequest.setRecipientEmails(defaultSystemReceiverEmail); + emailNotificationDao.sendMail(hub.getId(), subject, body, listDefaultSystemReceiverEmail, emailLogRequest); + } emailLogRequest.setRecipientEmails(hub.getEmail()); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(hub.getEmail()),emailLogRequest); - List listDefaultSystemReceiverEmail = Arrays.stream(defaultSystemReceiverEmail.split(",")) - .map(String::trim) - .filter(email -> !email.isEmpty()) - .toList(); - - emailLogRequest.setRecipientEmails(defaultSystemReceiverEmail); - emailNotificationDao.sendMail(hub.getId(), subject, body, listDefaultSystemReceiverEmail,emailLogRequest); emailLogRequest.setRecipientEmails(rinaldoEmail); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(rinaldoEmail),emailLogRequest); }