From b884f5aeffaddc11641ad039d3590d5988178f1a Mon Sep 17 00:00:00 2001 From: piyushkag Date: Tue, 29 Apr 2025 17:50:46 +0530 Subject: [PATCH 01/17] Resolved conflicts. --- .../tendermanagement/dao/AppointmentDao.java | 25 +++++++++---------- .../service/AmazonS3Service.java | 1 + .../service/impl/AmazonS3ServiceImpl.java | 5 ++++ 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index 9f135199..f2a3aca4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -37,6 +37,7 @@ import net.gepafin.tendermanagement.repositories.CompanyRepository; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.repositories.HubRepository; import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.service.feignClient.AppointmentApiService; @@ -141,6 +142,9 @@ public class AppointmentDao { @Autowired private ApplicationEvaluationServiceImpl applicationEvaluationService; + @Autowired + private AmazonS3Service amazonS3Service; + private final Map executorMap = new ConcurrentHashMap<>(); private final ConcurrentHashMap threadForDocumentMap = new ConcurrentHashMap<>(); @@ -720,11 +724,11 @@ public class AppointmentDao { // Build the appointment request body AppointmentCreationRequest appointmentCreationRequest = buildAppointmentCreationRequest(applicationId, createAppointmentRequest, appointmentTemplateId, templateRichiestaData); - log.info("AppointmentCreationRequest : {}", appointmentCreationRequest); + log.info("AppointmentCreationRequest {}", appointmentCreationRequest); String appointmentRequestBody = Utils.convertObjectToJson(appointmentCreationRequest); // Make API call to create the appointment - log.info("Context:{}, Authorization Token : {}, RequestBody : {}", context, authorizationToken, appointmentRequestBody); + log.info("Context:{}, Authorization Token {}, RequestBody {}", context, authorizationToken, appointmentRequestBody); ResponseEntity appointmentResponse = appointmentApiService.createAppointment(authorizationToken, context, appointmentRequestBody); String appointmentId = extractAppointmentIdFromResponse(appointmentResponse); @@ -753,7 +757,7 @@ public class AppointmentDao { private String extractAppointmentIdFromResponse(ResponseEntity appointmentResponse) { if (appointmentResponse.getBody() != null) { - log.info("Appointment API Response : {}", appointmentResponse.getBody()); + log.info("Appointment API Response {}", appointmentResponse.getBody()); Map responseBody = (Map) appointmentResponse.getBody(); if (responseBody.containsKey(GepafinConstant.DATA_STRING)) { Map data = (Map) responseBody.get(GepafinConstant.DATA_STRING); @@ -982,12 +986,12 @@ public class AppointmentDao { private File downloadFileFromS3(String fileUrl) throws Exception { - String key = extractS3KeyFromUrl(fileUrl); - File localFile = new File(GepafinConstant.TEMP_FILE_PATH + extractFileName(key)); + String key = amazonS3Service.extractS3KeyFromUrl(fileUrl); + String fileName = extractFileName(key); + String folderPath = key.substring(0, key.lastIndexOf("/")); + File localFile = new File(GepafinConstant.TEMP_FILE_PATH + fileName); - GetObjectRequest getObjectRequest = new GetObjectRequest(OLD_BUCKET, key); - - try (InputStream s3Stream = s3Client.getObject(getObjectRequest).getObjectContent(); FileOutputStream outputStream = new FileOutputStream(localFile)) { + try (InputStream s3Stream = amazonS3Service.getFile(folderPath, key); FileOutputStream outputStream = new FileOutputStream(localFile)) { s3Stream.transferTo(outputStream); } @@ -995,11 +999,6 @@ public class AppointmentDao { return localFile; } - private String extractS3KeyFromUrl(String url) { - - return url.replace(s3Url, ""); - } - private String extractFileName(String filePath) { String[] parts = filePath.split("/"); diff --git a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java index 642bbcfc..9766d58c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java @@ -21,4 +21,5 @@ AmazonS3Service { UploadFileOnAmazonS3Response copyFile(String fileName, String oldS3Path, String newS3Path); + String extractS3KeyFromUrl(String url); } \ No newline at end of file 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 7566f935..8f87e40c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -217,4 +217,9 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { } } + + public String extractS3KeyFromUrl(String url) { + + return url.replace(s3Url, ""); + } } \ No newline at end of file From 2531c5e951a0a49ecac23a893674721b282c3bb1 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Tue, 29 Apr 2025 17:55:12 +0530 Subject: [PATCH 02/17] Resolved Conflicts. --- .../net/gepafin/tendermanagement/dao/AppointmentDao.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index f2a3aca4..cb83406e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -724,11 +724,11 @@ public class AppointmentDao { // Build the appointment request body AppointmentCreationRequest appointmentCreationRequest = buildAppointmentCreationRequest(applicationId, createAppointmentRequest, appointmentTemplateId, templateRichiestaData); - log.info("AppointmentCreationRequest {}", appointmentCreationRequest); + log.info("AppointmentCreationRequest : {}", appointmentCreationRequest); String appointmentRequestBody = Utils.convertObjectToJson(appointmentCreationRequest); // Make API call to create the appointment - log.info("Context:{}, Authorization Token {}, RequestBody {}", context, authorizationToken, appointmentRequestBody); + log.info("Context:{}, Authorization Token : {}, RequestBody : {}", context, authorizationToken, appointmentRequestBody); ResponseEntity appointmentResponse = appointmentApiService.createAppointment(authorizationToken, context, appointmentRequestBody); String appointmentId = extractAppointmentIdFromResponse(appointmentResponse); @@ -757,7 +757,7 @@ public class AppointmentDao { private String extractAppointmentIdFromResponse(ResponseEntity appointmentResponse) { if (appointmentResponse.getBody() != null) { - log.info("Appointment API Response {}", appointmentResponse.getBody()); + log.info("Appointment API Response : {}", appointmentResponse.getBody()); Map responseBody = (Map) appointmentResponse.getBody(); if (responseBody.containsKey(GepafinConstant.DATA_STRING)) { Map data = (Map) responseBody.get(GepafinConstant.DATA_STRING); From 2283e3169e67ff74004a807f056de102c7434cf6 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 30 Apr 2025 20:30:24 +0530 Subject: [PATCH 03/17] Done ticket GEPAFINBE-215 --- .../gepafin/tendermanagement/dao/FormDao.java | 7 +-- .../tendermanagement/dao/VatCheckDao.java | 45 ++++++++++++++++++- .../model/response/VatCheckResponseBean.java | 3 ++ .../service/impl/CompanyServiceImpl.java | 4 +- 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 598f6477..47859a3b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -420,7 +420,8 @@ public class FormDao { .matchesPattern(value, fieldValidatorBean.getPattern(), fieldLabel) // Only applies if pattern is present .validateCustom(value, fieldValidatorBean.getCustom(), fieldLabel,contentResponseBean); // Add the custom validation here if (fieldValidatorBean.getCustom() != null && fieldValidatorBean.getCustom().equals(GepafinConstant.IS_PIVA)) { - String error = validateVatNumber(value, fieldValidatorBean.getCustom(), fieldLabel); + Long hubId = applicationEntity.getHubId(); + String error = validateVatNumber(value, fieldLabel,hubId); if(error != null) { validator.addError(error); } @@ -504,14 +505,14 @@ public class FormDao { }).filter(value -> !value.isEmpty()).findFirst().orElse(contentResponseBean.getId()); } - public String validateVatNumber(String value,String customRule,String fieldId){ + public String validateVatNumber(String value,String fieldId, Long hubId){ String error=null; if (value!=null && value.matches("^\\d{1,11}$")) { // Map customData=null; try { // Map vatCheckResponse = vatCheckDao.checkVatNumberApi(value); - vatCheckDao.checkVatNumber(value); + vatCheckDao.checkVatNumber(value, hubId); // if (Boolean.FALSE.equals(CollectionUtils.isEmpty(vatCheckResponse))) { // customData = vatCheckResponse; // } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java b/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java index 1c6869ad..342a853e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java @@ -3,12 +3,17 @@ package net.gepafin.tendermanagement.dao; import feign.FeignException; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CompanyEntity; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.VatCheckVersionTypeEnum; import net.gepafin.tendermanagement.model.response.VatCheckResponseBean; +import net.gepafin.tendermanagement.repositories.CompanyRepository; import net.gepafin.tendermanagement.repositories.GlobalConfigRepository; import net.gepafin.tendermanagement.service.feignClient.VatCheckV1Service; import net.gepafin.tendermanagement.service.feignClient.VatCheckV2Service; import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,6 +53,9 @@ public class VatCheckDao { @Autowired private GlobalConfigRepository globalConfigRepository; + @Autowired + private CompanyRepository companyRepository; + public final Logger log = LoggerFactory.getLogger(VatCheckDao.class); public VatCheckResponseBean checkVatNumberV1(String vatNumber) { @@ -56,6 +64,7 @@ public class VatCheckDao { vatCheckResponseBean.setMessage(Translator.toLocale(GepafinConstant.INVALID_VATNUMBER)); if (Boolean.TRUE.equals(Boolean.parseBoolean(isVatCheckGloballyDisabled))) { vatCheckResponseBean.setMessage(Translator.toLocale(GepafinConstant.INVALID_VATNUMBER)); + vatCheckResponseBean.setVersion(VatCheckVersionTypeEnum.V1); return vatCheckResponseBean; } try { @@ -96,6 +105,7 @@ public class VatCheckDao { public static void processValidResponseV1(Map responseMap, VatCheckResponseBean vatCheckResponseBean) { Object dataObj = responseMap.get("data"); + vatCheckResponseBean.setVersion(VatCheckVersionTypeEnum.V1); if (dataObj instanceof Map rawDataMap) { Map responseBody = new LinkedHashMap<>(); rawDataMap.forEach((k, v) -> { @@ -118,9 +128,20 @@ public class VatCheckDao { } - public VatCheckResponseBean checkVatNumber(String vatNumber) { + public VatCheckResponseBean checkVatNumber(String vatNumber, Long hubId) { try { + CompanyEntity company = companyRepository.findByVatNumberAndHubId(vatNumber, hubId); + + if (company != null && Boolean.FALSE.equals(StringUtils.isEmpty(company.getJson()))) { + Map responseMap = Utils.convertJsonStringToMap(company.getJson()); + + VatCheckResponseBean jsonResponse = validateJsonFromDb(responseMap); + if (jsonResponse != null) { + return jsonResponse; + } + } + String vatApiVersion = getVatCheckVersion(); if(!isVatCheckApiV2(vatApiVersion)){ return checkVatNumberV1(vatNumber); @@ -134,6 +155,26 @@ public class VatCheckDao { return vatCheckResponseBean; } } + private VatCheckResponseBean validateJsonFromDb(Map responseMap) { + if (responseMap == null || !responseMap.containsKey("data")) return null; + + Object data = responseMap.get("data"); + + if (data instanceof Map dataMap && !dataMap.isEmpty()) { + VatCheckResponseBean response = new VatCheckResponseBean(); + processValidResponseV1(responseMap, response); + return response; + } + + if (data instanceof List dataList && !dataList.isEmpty()) { + VatCheckResponseBean response = new VatCheckResponseBean(); + processValidResponse(responseMap, response); + return response; + } + + return null; + } + public VatCheckResponseBean checkVatNumberV2(String vatNumber) { @@ -142,6 +183,7 @@ public class VatCheckDao { vatCheckResponseBean.setMessage(Translator.toLocale(GepafinConstant.INVALID_VATNUMBER)); if (Boolean.TRUE.equals(Boolean.parseBoolean(isVatCheckGloballyDisabled))) { vatCheckResponseBean.setMessage(Translator.toLocale(GepafinConstant.INVALID_VATNUMBER)); + vatCheckResponseBean.setVersion(VatCheckVersionTypeEnum.V2); return vatCheckResponseBean; } try { @@ -175,6 +217,7 @@ public class VatCheckDao { public static void processValidResponse(Map responseMap, VatCheckResponseBean vatCheckResponseBean) { + vatCheckResponseBean.setVersion(VatCheckVersionTypeEnum.V2); if (responseMap == null || !responseMap.containsKey("data")) { vatCheckResponseBean.setMessage(Translator.toLocale(GepafinConstant.INVALID_VATNUMBER)); return; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/VatCheckResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/VatCheckResponseBean.java index 611925d3..00e6b93f 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/VatCheckResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/VatCheckResponseBean.java @@ -1,6 +1,8 @@ package net.gepafin.tendermanagement.model.response; import lombok.Getter; import lombok.Setter; +import net.gepafin.tendermanagement.enums.VatCheckVersionTypeEnum; + import java.util.Map; @Getter @@ -9,4 +11,5 @@ public class VatCheckResponseBean { private Boolean valid; private Map vatCheckResponse; private String message; + private VatCheckVersionTypeEnum version; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java index 924f379c..f1d8f890 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java @@ -83,7 +83,9 @@ public class CompanyServiceImpl implements CompanyService { @Override @Transactional(readOnly = true) public VatCheckResponseBean checkVatNumber(HttpServletRequest request, String vatNumber) { - return vatCheckDao.checkVatNumber(vatNumber); + UserEntity userEntity = validator.validateUser(request); + Long hubId = userEntity.getHub().getId(); + return vatCheckDao.checkVatNumber(vatNumber, hubId); } @Override public CompanyEntity validateCompany(Long companyId) { From d03b7d49c41f382c6f3c1f155e488098a8f266ac Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 5 May 2025 18:05:52 +0530 Subject: [PATCH 04/17] Fixed email log issue --- .../tendermanagement/service/impl/SystemEmailService.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailService.java index fde6fd3e..0cc64b89 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/SystemEmailService.java @@ -55,7 +55,7 @@ public class SystemEmailService implements EmailService { emailLogRequest.setEmailBody(body); emailLogRequest.setSendStatus(StatusTypeEnum.SUCCESS.getValue()); emailLogRequest.setRecipientEmails(Utils.listToCommaSeparatedString(recipientEmails)); - + emailLogRequest.setEmailServiceType(EmailServiceTypeEnum.SYSTEM_EMAIL_SERVICE); if (Boolean.FALSE.equals(validator.isTestProfileActivated())) { MessageResponse response = null; try { @@ -73,7 +73,10 @@ public class SystemEmailService implements EmailService { throw new RuntimeException("Failed to send email via Mailgun: " + (response != null ? response.getMessage() : "No response from Mailgun"), e); } - emailLogRequest.setEmailServiceResponse(response.toString()); + if(response != null) { + emailLogRequest.setEmailServiceResponse(response.toString()); + } + emailLogDao.createEmailLog(emailLogRequest); } } From 315e6965f632a548b6edc086934f74eb23da5899 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 9 May 2025 12:29:32 +0530 Subject: [PATCH 05/17] Done ticket GEPAFINBE-218 --- .../java/net/gepafin/tendermanagement/util/Utils.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 343e742a..6347119a 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -291,11 +291,14 @@ public class Utils { return pattern.matcher(email).matches(); } +// public static String randomKey(Integer range) { +// String data = String.valueOf(System.currentTimeMillis()); +// return data.substring(data.length() - range); +// +// } public static String randomKey(Integer range) { - String data = String.valueOf(System.currentTimeMillis()); - return data.substring(data.length() - range); + return UUID.randomUUID().toString().replace("-", "").substring(0, range); } - public static String convertObjectToJsonString(Object object) { try { // Check if the object is a string From 9db2aad0313cb5cdaa0aaeb8254e79733c51859a Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 14 May 2025 16:57:03 +0530 Subject: [PATCH 06/17] Resolved conflicts --- .../dao/AssignedApplicationsDao.java | 11 ++-- .../entities/AssignedApplicationsView.java | 3 + .../db/changelog/db.changelog-1.0.0.xml | 5 ++ ...te_assigned_application_view_14_5_2025.sql | 57 +++++++++++++++++++ 4 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/db/dump/update_assigned_application_view_14_5_2025.sql diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index 17f18c9c..30ebb149 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -315,7 +315,8 @@ public class AssignedApplicationsDao { if (pageNo == null || pageNo <= 0) { pageNo = GepafinConstant.DEFAULT_PAGE; } - Specification spec = searchByPagination( assignedApplicationPageableRequestBean, user,userId); + Long hubId=user.getHub().getId(); + Specification spec = searchByPagination( assignedApplicationPageableRequestBean,hubId,userId); Page entityPage = assignedApplicationsViewRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); // Prepare the response @@ -333,10 +334,10 @@ public class AssignedApplicationsDao { return pageableResponseBean; } - public Specification searchByPagination(AssignedApplicationPageableRequestBean assignedApplicationPageableRequestBean, UserEntity userEntity,Long userId) { + public Specification searchByPagination(AssignedApplicationPageableRequestBean assignedApplicationPageableRequestBean, Long hubId,Long userId) { return (root, query, criteriaBuilder) -> { - List predicates = getPredicates(assignedApplicationPageableRequestBean, criteriaBuilder, root, userEntity,userId); + List predicates = getPredicates(assignedApplicationPageableRequestBean, criteriaBuilder, root, hubId,userId); SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); if (assignedApplicationPageableRequestBean.getGlobalFilters() != null @@ -377,7 +378,7 @@ public class AssignedApplicationsDao { private List getPredicates(AssignedApplicationPageableRequestBean assignedApplicationPageableRequestBean, - CriteriaBuilder criteriaBuilder, Root root, UserEntity userEntity,Long userId) { + CriteriaBuilder criteriaBuilder, Root root,Long hubId,Long userId) { Integer year = null; String search = null; @@ -448,6 +449,8 @@ public class AssignedApplicationsDao { } predicates.add(criteriaBuilder.isFalse(root.get(GepafinConstant.IS_DELETED))); + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB_ID), hubId)); + Utils.applyFiltersByPagination(root, criteriaBuilder, predicates, filters); return predicates; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsView.java b/src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsView.java index a446daff..75d396a9 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsView.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsView.java @@ -58,4 +58,7 @@ public class AssignedApplicationsView{ @Column(name = "IS_DELETED") private Boolean isDeleted; + + @Column(name = "HUB_ID") + private Long hubId; } 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 38e13676..e10adc93 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 @@ -2746,4 +2746,9 @@ + + + + diff --git a/src/main/resources/db/dump/update_assigned_application_view_14_5_2025.sql b/src/main/resources/db/dump/update_assigned_application_view_14_5_2025.sql new file mode 100644 index 00000000..ec2ba975 --- /dev/null +++ b/src/main/resources/db/dump/update_assigned_application_view_14_5_2025.sql @@ -0,0 +1,57 @@ + +DROP VIEW IF EXISTS gepafin_schema.assigned_applications_view ; + +CREATE OR REPLACE VIEW gepafin_schema.assigned_applications_view AS +SELECT + -- From assigned_applications + aa.id AS id, + aa.user_id AS user_id, + aa.status AS status, + aa.created_date AS created_date, + aa.updated_date AS updated_date, + aa.is_deleted AS is_deleted, + + -- From application + a.id AS application_id, + a.hub_id as hub_id, + a.status AS application_status, + a.submission_date AS submission_date, + ae.end_date AS evaluation_end_date, + a.ndg AS ndg, + a.appointment_id AS appointment_id, + + -- From protocol (OneToOne) + p.protocol_number AS protocol_number, + + -- From call (ManyToOne) + cl.name AS call_name, + + -- From company (ManyToOne) + c.company_name AS company_name, + ae.email_send_response AS email_send_response + +FROM gepafin_schema.assigned_applications aa + +-- Join application (ManyToOne from assigned_applications) +LEFT JOIN gepafin_schema.application a + ON aa.application_id = a.id + AND (a.is_deleted IS FALSE OR a.is_deleted IS NULL) + +-- Join application_evaluation (application_id matches + not deleted) +LEFT JOIN gepafin_schema.application_evaluation ae + ON ae.application_id = a.id + AND (ae.is_deleted IS FALSE OR ae.is_deleted IS NULL) + +-- Join protocol (OneToOne from application) +LEFT JOIN gepafin_schema.protocol p + ON a.protocol_number = p.id + +-- Join call (ManyToOne from application) +LEFT JOIN gepafin_schema.call cl + ON a.call_id = cl.id + +-- Join company (ManyToOne from application) +LEFT JOIN gepafin_schema.company c + ON a.company_id = c.id + +WHERE aa.is_deleted IS FALSE OR aa.is_deleted IS NULL; From ce2880304765d1012065b9a4cfed6ecca5ec32c4 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 15 May 2025 13:50:31 +0530 Subject: [PATCH 07/17] Updated code --- .../java/net/gepafin/tendermanagement/dao/ApplicationDao.java | 4 ++-- 1 file changed, 2 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 9648b749..d8877015 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -2180,7 +2180,7 @@ public class ApplicationDao { } validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); - assignedApplicationsRepository.findByApplicationIdAndStatusAndIsDeletedFalse(applicationEntity.getId(), AssignedApplicationEnum.CLOSE.getValue()) + assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationEntity.getId()) .ifPresent(assignedApp -> processAssignedAppAndEvaluation(request, applicationEntity, assignedApp)); return getApplicationResponse(applicationEntity); @@ -2190,7 +2190,7 @@ public class ApplicationDao { } private void processAssignedAppAndEvaluation(HttpServletRequest request, ApplicationEntity applicationEntity, AssignedApplicationsEntity assignedApp) { - applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndStatusAndIsDeletedFalse(assignedApp.getId(), ApplicationEvaluationStatusTypeEnum.CLOSE.getValue()) + applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApp.getId()) .ifPresent(eval -> reopenApplication(request, applicationEntity, assignedApp, eval)); } From e5c8d27f91960c891373fee82af182bf564bdf71 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 14 May 2025 11:36:35 +0530 Subject: [PATCH 08/17] Resolved conflicts --- .../constants/GepafinConstant.java | 1 + .../dao/ApplicationAmendmentRequestDao.java | 4 +- .../tendermanagement/dao/ApplicationDao.java | 82 +++++++++++++++++++ .../enums/UserActionContextEnum.java | 1 + .../ApplicationEvaluationRepository.java | 5 ++ .../repositories/ApplicationRepository.java | 3 + .../AssignedApplicationsRepository.java | 4 + .../service/ApplicationService.java | 2 + .../service/impl/ApplicationServiceImpl.java | 7 +- .../web/rest/api/ApplicationApi.java | 14 ++++ .../api/impl/ApplicationApiController.java | 11 +++ src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 7 +- 13 files changed, 136 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 5c849a47..8b3e8b54 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -537,6 +537,7 @@ public class GepafinConstant { public static final String APPLICATION_STATUS="applicationStatus"; public static final String RINALDO_EMAIL = "rinaldo.bonazzo@bflows.net"; + public static final String READMIT_APPLICATION_SUCCESS = "application.readmit.success"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index daa4391b..b1ac989b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -1072,12 +1072,12 @@ public class ApplicationAmendmentRequestDao { application.setStatus(ApplicationStatusTypeEnum.EVALUATION.getValue()); applicationRepository.save(application); - existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity().setStatus(AssignedApplicationEnum.OPEN.getValue()); - AssignedApplicationsEntity assignedApplicationsEntity = assignedApplicationsDao.validateAssignedApplication( existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getId()); AssignedApplicationsEntity oldAssignedApplicationData = Utils.getClonedEntityForData(assignedApplicationsEntity); + existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity().setStatus(AssignedApplicationEnum.OPEN.getValue()); + assignedApplicationsEntity = assignedApplicationsRepository.save(existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index e95e1c8b..71a9b515 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -2132,6 +2132,88 @@ public class ApplicationDao { tableDataByApp.put(appId, flattenedAll); } } + public ApplicationResponse readmitApplication(HttpServletRequest request, Long applicationId) { + log.info("Re-admiting the Application with id : {}", applicationId); + + ApplicationEntity applicationEntity = fetchRejectedApplication(applicationId); + if(applicationEntity == null){ + throw new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG)); + } + validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); + validateCallEndDate(applicationEntity); + + assignedApplicationsRepository.findByApplicationIdAndStatusAndIsDeletedFalse(applicationEntity.getId(), AssignedApplicationEnum.CLOSE.getValue()) + .ifPresent(assignedApp -> processAssignedAppAndEvaluation(request, applicationEntity, assignedApp)); + + return getApplicationResponse(applicationEntity); + } + private ApplicationEntity fetchRejectedApplication(Long applicationId) { + return applicationRepository.findByIdAndStatusAndIsDeletedFalse(applicationId, ApplicationStatusTypeEnum.REJECTED.getValue()); + } + private void validateCallEndDate(ApplicationEntity applicationEntity) { + checkCallEndDate(applicationEntity.getCall()); + log.info("Call end date verified successfully | callId: {}", applicationEntity.getCall().getId()); + } + + private void processAssignedAppAndEvaluation(HttpServletRequest request, ApplicationEntity applicationEntity, AssignedApplicationsEntity assignedApp) { + applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndStatusAndIsDeletedFalse(assignedApp.getId(), ApplicationEvaluationStatusTypeEnum.CLOSE.getValue()) + .ifPresent(eval -> reopenApplication(request, applicationEntity, assignedApp, eval)); + } + + + private void reopenApplication(HttpServletRequest request, ApplicationEntity applicationEntity, + AssignedApplicationsEntity assignedApp, ApplicationEvaluationEntity evaluationEntity) { + + ApplicationEntity oldApplication = Utils.getClonedEntityForData(applicationEntity); + AssignedApplicationsEntity oldAssignedApp = Utils.getClonedEntityForData(assignedApp); + ApplicationEvaluationEntity oldEvaluation = Utils.getClonedEntityForData(evaluationEntity); + + updateApplicationStatus(applicationEntity); + updateAssignedApplicationStatus(assignedApp); + updateEvaluationEntity(applicationEntity.getHubId(), evaluationEntity); + + saveEntities(applicationEntity, assignedApp, evaluationEntity); + + /** This code is responsible for adding a version history log for the "Update Application" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplication).newData(applicationEntity).build()); + + /** This code is responsible for adding a version history log for the "Update Application Evaluation" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldEvaluation).newData(evaluationEntity).build()); + + /** This code is responsible for adding a version history log for the "Update Assigned Application" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldAssignedApp).newData(assignedApp).build()); + } + + private void updateApplicationStatus(ApplicationEntity applicationEntity) { + applicationEntity.setStatus(ApplicationStatusTypeEnum.EVALUATION.getValue()); + applicationEntity.setDateRejected(null); + } + + private void updateAssignedApplicationStatus(AssignedApplicationsEntity assignedApp) { + assignedApp.setStatus(AssignedApplicationEnum.OPEN.getValue()); + } + + private void updateEvaluationEntity(Long hubId, ApplicationEvaluationEntity evaluationEntity) { + HubEntity hub = hubService.valdateHub(hubId); + Long evaluationDays = (hub != null) ? hub.getEvaluationExpirationDays() : 30L; + + LocalDateTime now = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); + evaluationEntity.setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue()); + evaluationEntity.setClosingDate(null); + evaluationEntity.setActiveDays(null); + evaluationEntity.setEndDate(now.plusDays(evaluationDays)); + evaluationEntity.setStartDate(now); + evaluationEntity.setRemainingDays(evaluationDays); + evaluationEntity.setSuspendedDays(0L); + evaluationEntity.setStopDateTime(null); + } + + private void saveEntities(ApplicationEntity app, AssignedApplicationsEntity assignedApp, ApplicationEvaluationEntity eval) { + applicationRepository.save(app); + assignedApplicationsRepository.save(assignedApp); + applicationEvaluationRepository.save(eval); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index a1f7ee5c..7ee87e08 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -46,6 +46,7 @@ public enum UserActionContextEnum { GET_SIGNED_DOCUMENT("GET_SIGNED_DOCUMENT"), GET_NEXT_PREVIOUS_FORM("GET_NEXT_PREVIOUS_FORM"), DOWNLOAD_APPLICATION_DOC_ZIP("DOWNLOAD_APPLICATION_DOC_ZIP"), + READMIT_APPLICATION("READMIT_APPLICATION"), /** FAQ action context **/ CREATE_FAQ("CREATE_FAQ"), diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java index 9019aad4..306ad3a5 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java @@ -76,5 +76,10 @@ public interface ApplicationEvaluationRepository extends JpaRepository findByAssignedApplicationsEntity_IdAndStatusAndIsDeletedFalse( + Long assignedApplicationId, + String status + ); + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index b5cf7fb9..c760689a 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -178,4 +178,7 @@ public interface ApplicationRepository extends JpaRepository findByApplicationIdAndStatusAndIsDeletedFalse( Long applicationId, String status); + + + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index 24fde801..c7af4f88 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -50,4 +50,6 @@ public interface ApplicationService { public byte[] exportCsv(HttpServletRequest request, Long callId); + public ApplicationResponse readmitApplication(HttpServletRequest request, Long applicationId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index 879c72cf..357661d1 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -170,5 +170,10 @@ public class ApplicationServiceImpl implements ApplicationService { return csvBytes; } - + @Override + @Transactional(rollbackFor = Exception.class) + public ApplicationResponse readmitApplication(HttpServletRequest request, Long applicationId) { + UserEntity userEntity = validator.validateUser(request); + return applicationDao.readmitApplication(request, applicationId); + } } 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 00609f68..a18e6852 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 @@ -238,6 +238,20 @@ public interface ApplicationApi { public ResponseEntity exportCsv( HttpServletRequest request, @Parameter(description = "The call id", required = true) @PathVariable(value = "callId", required = true) Long callId); + @Operation(summary = "Api to re-admit an application", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PutMapping(value = "/{applicationId}/readmit", produces = { "application/json" }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')|| hasRole('ROLE_INSTRUCTOR_MANAGER')|| hasRole('ROLE_PRE_INSTRUCTOR')") + ResponseEntity> readmitApplication(HttpServletRequest request, + @Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId); + } 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 a06f5dc4..840711ae 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 @@ -242,5 +242,16 @@ public class ApplicationApiController implements ApplicationApi { .contentType(MediaType.APPLICATION_OCTET_STREAM) .body(csvBytes); } + @Override + public ResponseEntity> readmitApplication(HttpServletRequest request, Long applicationId) { + /** This code is responsible for creating user action logs for the "re-admit application" operation. **/ + loggingUtil.logUserAction( + UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.READMIT_APPLICATION).build()); + + ApplicationResponse applicationResponse = applicationService.readmitApplication(request, applicationId); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.READMIT_APPLICATION_SUCCESS))); + } } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index e67042ab..237e6e53 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -400,3 +400,4 @@ insufficient.score.msg = Insufficient score to pass to the technical and economi password.expired.for.login.to.odessa = Odessa login password has been expired. invalid.user=Invalid user. +application.readmit.success=Application has been readmitted successfully. \ No newline at end of file diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index fd7f09e1..35247fe3 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -53,7 +53,7 @@ call.update.successfully=Chiamata aggiornata con successo. call.fetch.success=Dettagli della chiamata recuperati con successo. call.not.found=Chiamata non trovata. score.not.null=Il punteggio non pu? essere nullo o zero. -field.not.null={0} non può essere vuoto. +field.not.null={0} non pu� essere vuoto. field.not.empty=la {0} non pu? essere vuota. update_call_status_success_msg=Lo stato della chiamata ? stato aggiornato con successo. status.same.error=Lo stato ? gi? impostato. @@ -389,5 +389,6 @@ error.invalid.limit=Il limite dovrebbe essere compreso tra 1 e 3000. insufficient.score.msg = Punteggio non sufficiente per passaggio alla valutazione tecnica ed economico finanziaria validation.table.message=I dati per il campo {0} non sono presenti. -password.expired.for.login.to.odessa = La password di accesso a Odessa è scaduta -invalid.user=Utente non valido. \ No newline at end of file +password.expired.for.login.to.odessa = La password di accesso a Odessa � scaduta +invalid.user=Utente non valido. +application.readmit.success=L'applicazione è stata riammessa con successo. From 78b2ff40463bb9425944323a42d5d3b22f9efb10 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 14 May 2025 16:02:06 +0530 Subject: [PATCH 09/17] Updated code --- .../net/gepafin/tendermanagement/dao/ApplicationDao.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 71a9b515..2d2fd4a5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -2141,7 +2141,6 @@ public class ApplicationDao { Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG)); } validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); - validateCallEndDate(applicationEntity); assignedApplicationsRepository.findByApplicationIdAndStatusAndIsDeletedFalse(applicationEntity.getId(), AssignedApplicationEnum.CLOSE.getValue()) .ifPresent(assignedApp -> processAssignedAppAndEvaluation(request, applicationEntity, assignedApp)); @@ -2151,10 +2150,6 @@ public class ApplicationDao { private ApplicationEntity fetchRejectedApplication(Long applicationId) { return applicationRepository.findByIdAndStatusAndIsDeletedFalse(applicationId, ApplicationStatusTypeEnum.REJECTED.getValue()); } - private void validateCallEndDate(ApplicationEntity applicationEntity) { - checkCallEndDate(applicationEntity.getCall()); - log.info("Call end date verified successfully | callId: {}", applicationEntity.getCall().getId()); - } private void processAssignedAppAndEvaluation(HttpServletRequest request, ApplicationEntity applicationEntity, AssignedApplicationsEntity assignedApp) { applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndStatusAndIsDeletedFalse(assignedApp.getId(), ApplicationEvaluationStatusTypeEnum.CLOSE.getValue()) From 8664f0096134c1f9743b82497f7bc0eaf52db03b Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 15 May 2025 13:50:31 +0530 Subject: [PATCH 10/17] Updated code --- .../java/net/gepafin/tendermanagement/dao/ApplicationDao.java | 4 ++-- 1 file changed, 2 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 2d2fd4a5..89c8d1e9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -2142,7 +2142,7 @@ public class ApplicationDao { } validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); - assignedApplicationsRepository.findByApplicationIdAndStatusAndIsDeletedFalse(applicationEntity.getId(), AssignedApplicationEnum.CLOSE.getValue()) + assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationEntity.getId()) .ifPresent(assignedApp -> processAssignedAppAndEvaluation(request, applicationEntity, assignedApp)); return getApplicationResponse(applicationEntity); @@ -2152,7 +2152,7 @@ public class ApplicationDao { } private void processAssignedAppAndEvaluation(HttpServletRequest request, ApplicationEntity applicationEntity, AssignedApplicationsEntity assignedApp) { - applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndStatusAndIsDeletedFalse(assignedApp.getId(), ApplicationEvaluationStatusTypeEnum.CLOSE.getValue()) + applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApp.getId()) .ifPresent(eval -> reopenApplication(request, applicationEntity, assignedApp, eval)); } From 6b67263c53c14456ea4717ed3f4620a6596aae05 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 15 May 2025 18:34:05 +0530 Subject: [PATCH 11/17] Done ticket GEPAFINBE-213 --- .../dao/ApplicationAmendmentRequestDao.java | 152 ++++++++++++++---- ...ApplicationAmendmentRequestRepository.java | 2 + .../ApplicationAmendmentScheduler.java | 2 +- 3 files changed, 125 insertions(+), 31 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index daa4391b..3820d9da 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -26,6 +26,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundExceptio import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; @@ -1032,7 +1033,7 @@ public class ApplicationAmendmentRequestDao { public ApplicationAmendmentRequestResponse closeAmendmentRequest(Long id, CloseAmendmentRequest closeAmendmentRequest) { log.info("Closing application amendement with ID: {}", id); - ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); + ApplicationAmendmentRequestEntity existingApplicationAmendment = validatApplicationAmendmentRequestByStatus(id,ApplicationAmendmentRequestEnum.AWAITING.getValue()); //cloned entity for old data and versioning ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(existingApplicationAmendment); List amendmentRequestList = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse( @@ -1042,17 +1043,18 @@ public class ApplicationAmendmentRequestDao { // Check if this is the last amendment being closed boolean isLastRemaining = amendmentRequestList.stream() .filter(amendment -> !amendment.getId().equals(id)) // Exclude the current amendment - .allMatch(amendment -> amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue())); + .allMatch(amendment -> amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue()) || amendment.getStatus().equals(ApplicationAmendmentRequestEnum.EXPIRED.getValue())); + - if (isLastRemaining) { - log.info("The current amendment is the last remaining one to be closed."); - applicationAmendmentRequestDao.calculateEndDateAndSuspensionDays(existingApplicationAmendment.getApplicationEvaluationEntity()); - } setIfUpdated(existingApplicationAmendment::getInternalNote, existingApplicationAmendment::setInternalNote, closeAmendmentRequest.getInternalNote()); setIfUpdated(existingApplicationAmendment::getStatus, existingApplicationAmendment::setStatus, ApplicationAmendmentRequestEnum.CLOSE.getValue()); existingApplicationAmendment.setClosingDate(LocalDateTime.now()); ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment, oldApplicationAmendmentEntity, VersionActionTypeEnum.UPDATE); + if (isLastRemaining) { + log.info("The current amendment is the last remaining one to be closed."); + applicationAmendmentRequestDao.calculateEndDateAndSuspensionDaysOnExpirationOrClosing(existingApplicationAmendment.getApplicationEvaluationEntity()); + } ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment,false); List amendmentRequests = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse( @@ -1104,15 +1106,17 @@ public class ApplicationAmendmentRequestDao { return response; } - public ApplicationAmendmentRequestResponse extendResponseDays(Long id, Long newResponseDays) { - ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validateApplicationAmendmentRequest(id); + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validatApplicationAmendmentRequestByStatus(id,ApplicationAmendmentRequestEnum.EXPIRED.getValue()); if (newResponseDays != null && newResponseDays > 0) { - ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity); + ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity); Long currentResponseDays = applicationAmendmentRequestEntity.getResponseDays() != null ? applicationAmendmentRequestEntity.getResponseDays() : 0L; applicationAmendmentRequestEntity.setResponseDays(currentResponseDays + newResponseDays); - applicationAmendmentRequestEntity.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now().plusDays(applicationAmendmentRequestEntity.getResponseDays()))); + applicationAmendmentRequestEntity.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now().plusDays(newResponseDays))); + applicationAmendmentRequestEntity.setStatus(ApplicationAmendmentRequestEnum.AWAITING.getValue()); + applicationAmendmentRequestEntity.getApplicationEvaluationEntity().setStatus(ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue()); + applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getApplication().setStatus(ApplicationStatusTypeEnum.SOCCORSO.getValue()); applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); /** This code is responsible for adding a version history log for the "Update Application Amendment" operation. **/ @@ -1219,26 +1223,26 @@ public class ApplicationAmendmentRequestDao { return Utils.replacePlaceholders(template.getHtmlContent(), bodyPlaceholders); } - public ApplicationEvaluationEntity calculateEndDateAndSuspensionDays(ApplicationEvaluationEntity applicationEvaluationEntity){ - LocalDateTime currentDate=DateTimeUtil.DateServerToUTC(LocalDateTime.now()); - LocalDateTime endDate=currentDate.plusDays(applicationEvaluationEntity.getRemainingDays()); - Long suspendedDays = ChronoUnit.DAYS.between(applicationEvaluationEntity.getStopDateTime(), currentDate); - - ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils.getClonedEntityForData(applicationEvaluationEntity); - applicationEvaluationEntity.setEndDate(endDate); - if(applicationEvaluationEntity.getSuspendedDays() == null) { - applicationEvaluationEntity.setSuspendedDays(0L); - } - applicationEvaluationEntity.setSuspendedDays(applicationEvaluationEntity.getSuspendedDays()+suspendedDays); - ApplicationEvaluationEntity applicationEvaluation = applicationEvaluationRepository.save(applicationEvaluationEntity); - - /** This code is responsible for adding a version history log for the "Update Application Amendment" operation. **/ - loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluationEntity).newData(applicationEvaluation).build()); - - return applicationEvaluation; - - - } +// public ApplicationEvaluationEntity calculateEndDateAndSuspensionDays(ApplicationEvaluationEntity applicationEvaluationEntity){ +// LocalDateTime currentDate=DateTimeUtil.DateServerToUTC(LocalDateTime.now()); +// LocalDateTime endDate=currentDate.plusDays(applicationEvaluationEntity.getRemainingDays()); +// Long suspendedDays = ChronoUnit.DAYS.between(applicationEvaluationEntity.getStopDateTime(), currentDate); +// +// ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils.getClonedEntityForData(applicationEvaluationEntity); +// applicationEvaluationEntity.setEndDate(endDate); +// if(applicationEvaluationEntity.getSuspendedDays() == null) { +// applicationEvaluationEntity.setSuspendedDays(0L); +// } +// applicationEvaluationEntity.setSuspendedDays(applicationEvaluationEntity.getSuspendedDays()+suspendedDays); +// ApplicationEvaluationEntity applicationEvaluation = applicationEvaluationRepository.save(applicationEvaluationEntity); +// +// /** This code is responsible for adding a version history log for the "Update Application Amendment" operation. **/ +// loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluationEntity).newData(applicationEvaluation).build()); +// +// return applicationEvaluation; +// +// +// } private GetAllAmendmentResponseBean initializeGetAllBasicResponse(ApplicationAmendmentRequestEntity entity) { GetAllAmendmentResponseBean response = new GetAllAmendmentResponseBean(); @@ -1542,5 +1546,93 @@ public class ApplicationAmendmentRequestDao { return applicationAmendmentRequestViewResponse; } + public ApplicationEvaluationEntity calculateEndDateAndSuspensionDaysOnExpirationOrClosing + (ApplicationEvaluationEntity applicationEvaluationEntity) { + + // Fetch all linked amendments + List amendments = + applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(applicationEvaluationEntity.getId()); + + // Recalculate suspension + long suspendedDays = calculateSuspendedDays(amendments); + + // Update end date and save + + ApplicationEvaluationEntity oldEntity = Utils.getClonedEntityForData(applicationEvaluationEntity); + HubEntity hub = hubService.valdateHub(applicationEvaluationEntity.getAssignedApplicationsEntity().getApplication().getHubId()); + Long initialDays = (hub != null) ? hub.getEvaluationExpirationDays() : 30L; + LocalDateTime endDate = applicationEvaluationEntity.getStartDate().plusDays(suspendedDays+initialDays); + applicationEvaluationEntity.setEndDate(endDate); + applicationEvaluationEntity.setSuspendedDays(suspendedDays); + ApplicationEvaluationEntity updated = applicationEvaluationRepository.save(applicationEvaluationEntity); + + loggingUtil.addVersionHistory(VersionHistoryRequest.builder() + .request(request) + .actionType(VersionActionTypeEnum.UPDATE) + .oldData(oldEntity) + .newData(updated) + .build()); + + return updated; + } + + public long calculateSuspendedDays(List amendments) { + List> periods = amendments.stream() + .filter(amendmentRequest -> amendmentRequest.getStartDate() != null) + .map(amendmentRequest -> { + LocalDateTime start = amendmentRequest.getStartDate(); + LocalDateTime end; + + String status = amendmentRequest.getStatus(); + if (Boolean.TRUE.equals(ApplicationAmendmentRequestEnum.CLOSE.getValue().equals(status)) && amendmentRequest.getClosingDate() != null) { + end = amendmentRequest.getClosingDate(); + } else if (Boolean.TRUE.equals(ApplicationAmendmentRequestEnum.EXPIRED.getValue().equals(status)) && amendmentRequest.getEndDate() != null) { + end = amendmentRequest.getStartDate().plusDays(amendmentRequest.getResponseDays()); + }else { + end= amendmentRequest.getEndDate(); + } + + return Pair.of(start, end); + }) + .filter(Objects::nonNull) + .sorted(Comparator.comparing(Pair::getLeft)) + .collect(Collectors.toList()); + + long totalDays = 0; + LocalDateTime currentStart = null; + LocalDateTime currentEnd = null; + + for (Pair period : periods) { + if (currentStart == null) { + currentStart = period.getLeft(); + currentEnd = period.getRight(); + } else if (!period.getLeft().isAfter(currentEnd)) { + // Merge overlapping/touching periods + currentEnd = currentEnd.isAfter(period.getRight()) ? currentEnd : period.getRight(); + } else { + // Non-overlapping: count previous period + totalDays += ChronoUnit.DAYS.between(currentStart.toLocalDate(), currentEnd.toLocalDate()); + currentStart = period.getLeft(); + currentEnd = period.getRight(); + } + } + + if (currentStart != null && currentEnd != null) { + totalDays += ChronoUnit.DAYS.between(currentStart.toLocalDate(), currentEnd.toLocalDate()); + } + + return totalDays; + } + + + + public ApplicationAmendmentRequestEntity validatApplicationAmendmentRequestByStatus(Long id,String status) { + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity= applicationAmendmentRequestRepository.findByIdAndIsDeletedFalseAndStatus(id,status); + if(applicationAmendmentRequestEntity==null){ + throw new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG)); + } + return applicationAmendmentRequestEntity; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index fc492019..4cd6d413 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -150,4 +150,6 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository applicationIds, @Param("statuses") List statuses); + + ApplicationAmendmentRequestEntity findByIdAndIsDeletedFalseAndStatus(Long id,String status); } diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationAmendmentScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationAmendmentScheduler.java index 6a4c7b81..050b4972 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationAmendmentScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationAmendmentScheduler.java @@ -122,7 +122,7 @@ public class ApplicationAmendmentScheduler { .findEvaluationsWithoutActiveAmendmentsByIds(applicationEvaluationIds); evaluationsWithoutActiveAmendmentList.forEach(evaluation -> { try { - applicationAmendmentRequestDao.calculateEndDateAndSuspensionDays(evaluation); + applicationAmendmentRequestDao.calculateEndDateAndSuspensionDaysOnExpirationOrClosing(evaluation); updateEvaluationStatus(evaluation); From 64f5bde4376b6f1c9f3778a3ad03ae2bc7e04529 Mon Sep 17 00:00:00 2001 From: Piyush Date: Mon, 19 May 2025 13:36:11 +0530 Subject: [PATCH 12/17] PEC success emails not saved or included in response --- .../dao/ApplicationAmendmentRequestDao.java | 36 +++++++++++-------- .../dao/ApplicationEvaluationDao.java | 36 ++++++++++++------- .../tendermanagement/dao/EmailDao.java | 6 ++-- .../gepafin/tendermanagement/dao/UserDao.java | 32 ++++++++++++----- .../entities/EmailSendResponseConverter.java | 3 ++ .../ApplicationAmendmentRequestResponse.java | 2 +- .../ApplicationEvaluationFormResponse.java | 1 + .../ApplicationEvaluationResponse.java | 2 +- .../model/response/EmailReminderResponse.java | 4 ++- .../InitiatePasswordResetResponse.java | 4 ++- .../tendermanagement/model/util/JWTToken.java | 6 ++-- .../ApplicationAmendmentRequestService.java | 2 +- .../service/ApplicationEvaluationService.java | 2 +- ...pplicationAmendmentRequestServiceImpl.java | 2 +- .../ApplicationEvaluationServiceImpl.java | 2 +- .../service/impl/AuthenticationService.java | 2 +- .../api/ApplicationAmendmentRequestApi.java | 2 +- .../rest/api/ApplicationEvaluationApi.java | 2 +- ...ApplicationAmendmentRequestController.java | 9 ++--- .../ApplicationEvaluationApiController.java | 4 +-- 20 files changed, 98 insertions(+), 61 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 156bab88..f25b5149 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -308,8 +308,14 @@ public class ApplicationAmendmentRequestDao { if (Boolean.TRUE.equals(applicationAmendmentRequestResponse.getIsSendEmail())) { emailNotificationDao.sendMailToNotifyBeneficiaryRegardingNewAmendment(applicationAmendmentRequestEntity); EmailSendResponse emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); - applicationAmendmentRequestResponse.setEmailSendResponse(emailSendResponse); - saveEmailSendResponse(emailSendResponse, applicationAmendmentRequestEntity); + List responses = List.of(emailSendResponse); + if (!Boolean.TRUE.equals(emailSendResponse.getIsEmailSend())){ + saveEmailSendResponse(emailSendResponse, applicationAmendmentRequestEntity); + applicationAmendmentRequestResponse.setEmailSendResponse(responses); + } + else{ + applicationAmendmentRequestResponse.setEmailSendResponse(Collections.emptyList()); + } } return applicationAmendmentRequestResponse; } @@ -516,6 +522,7 @@ public class ApplicationAmendmentRequestDao { Long hubId = applicationEntity.getHubId(); HubEntity hubEntity = hubService.valdateHub(hubId); + response.setEmailSendResponse(entity.getEmailSendResponse()); response.setId(entity.getId()); response.setApplicationId(entity.getApplicationId()); response.setApplicationEvaluationId(entity.getApplicationEvaluationEntity().getId()); @@ -654,19 +661,12 @@ public class ApplicationAmendmentRequestDao { log.info(" Application amendment deleted with ID: {}", id); } - public ApplicationAmendmentRequestResponseBean getApplicationAmendmentRequestById(Long id) { + public ApplicationAmendmentRequestResponse getApplicationAmendmentRequestById(Long id) { log.info("Fetching application amendment with ID: {}", id); ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validateApplicationAmendmentRequest(id); - ApplicationAmendmentRequestResponse sourceResponse = convertEntityToResponse(applicationAmendmentRequestEntity,true); - ApplicationAmendmentRequestResponseBean targetResponse = Utils.convertSourceObjectToDestinationObject( - sourceResponse, ApplicationAmendmentRequestResponseBean.class - ); - - if (targetResponse != null) { - targetResponse.setEmailSendResponse(applicationAmendmentRequestEntity.getEmailSendResponse()); - } - log.info("Application Amendment fetched successfully by ID: {}", targetResponse); - return targetResponse; + ApplicationAmendmentRequestResponse response = convertEntityToResponse(applicationAmendmentRequestEntity,true); + response.setEmailSendResponse(applicationAmendmentRequestEntity.getEmailSendResponse()); + return response; } public List getAllApplicationAmendmentRequest(HttpServletRequest request, Long userId) { @@ -1205,8 +1205,14 @@ public class ApplicationAmendmentRequestDao { beneficiaryUser.getId(), applicationEntity.getId(), amendment.getId(), applicationEntity.getCall().getId()); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email), emailLogRequest); EmailSendResponse emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); - emailReminderResponse.setEmailSendResponse(emailSendResponse); - saveEmailSendResponse(emailSendResponse, amendment); + List responses = List.of(emailSendResponse); + if (!Boolean.TRUE.equals(emailSendResponse.getIsEmailSend())){ + emailReminderResponse.setEmailSendResponse(responses); + saveEmailSendResponse(emailSendResponse, amendment); + } + else{ + emailReminderResponse.setEmailSendResponse(Collections.emptyList()); + } } else { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.BENEFICIARY_EMAIL_NOT_FOUND_MSG)); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 069bbd40..d12ce836 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1092,7 +1092,7 @@ public class ApplicationEvaluationDao { } validator.validatePreInstructor(request, assignedApplications.getUserId()); } - public ApplicationEvaluationResponseBean getApplicationEvaluationByApplicationId(HttpServletRequest request, UserEntity user, Long applicationID, Long assignedApplicationID) { + public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(HttpServletRequest request, UserEntity user, Long applicationID, Long assignedApplicationID) { Long applicationId; Long assignedApplicationId; validatePreinstructor(request, applicationID, assignedApplicationID); @@ -1131,12 +1131,9 @@ public class ApplicationEvaluationDao { return null; } ApplicationEvaluationEntity entity = entityOptional.get(); - ApplicationEvaluationResponse response = convertToResponse(entity); - ApplicationEvaluationResponseBean targetResponse = Utils.convertSourceObjectToDestinationObject(response, ApplicationEvaluationResponseBean.class); - if (targetResponse != null && entity.getEmailSendResponse() != null) { - targetResponse.setEmailSendResponse(entity.getEmailSendResponse()); - } - return targetResponse; + ApplicationEvaluationResponse applicationEvaluationResponse = convertToResponse(entity); + applicationEvaluationResponse.setEmailSendResponse(entity.getEmailSendResponse()); + return applicationEvaluationResponse; } private List prepareEvaluationDocumentBeanList(ApplicationEvaluationEntity entity) { List docRequest = new ArrayList<>(); @@ -1893,12 +1890,16 @@ public class ApplicationEvaluationDao { ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(application); + List responses = new ArrayList<>(); if(newStatus.equals(ApplicationStatusForEvaluation.ADMISSIBLE) && Boolean.TRUE.equals(application.getStatus().equals(ApplicationStatusTypeEnum.APPOINTMENT.getValue()))){ application.setStatus(newStatus.getValue()); log.info("Status updated to ADMISSIBLE for applicationId: " + application.getId()); emailNotificationDao.sendAdmissibilityNotificationEmailForAdmissibleApplication(application); emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); - saveEmailSendResponseToEvaluation(emailSendResponse,existingEntity); + responses = List.of(emailSendResponse); + if (!Boolean.TRUE.equals(emailSendResponse.getIsEmailSend())) { + saveEmailSendResponseToEvaluation(emailSendResponse, existingEntity); + } } if(newStatus.equals(ApplicationStatusForEvaluation.TECHNICAL_EVALUATION) && Boolean.TRUE.equals(application.getStatus().equals(ApplicationStatusTypeEnum.ADMISSIBLE.getValue()))){ @@ -1945,8 +1946,8 @@ public class ApplicationEvaluationDao { if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.APPROVED.getValue())))) { - application.setDateAccepted(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - application.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + application.setDateAccepted(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + application.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); application = applicationRepository.save(application); // emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application); } @@ -1956,7 +1957,10 @@ public class ApplicationEvaluationDao { application = applicationRepository.save(application); emailNotificationDao.sendInadmissibilityEmailForRejectedApplication(application,existingEntity); emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); - saveEmailSendResponseToEvaluation(emailSendResponse,existingEntity); + responses = List.of(emailSendResponse); + if (!Boolean.TRUE.equals(emailSendResponse.getIsEmailSend())) { + saveEmailSendResponseToEvaluation(emailSendResponse, existingEntity); + } } Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_RESULT); @@ -1964,7 +1968,9 @@ public class ApplicationEvaluationDao { notificationDao.sendNotificationToInstructor(placeHolders,existingEntity,NotificationTypeEnum.EVALUATION_RESULT); ApplicationEvaluationResponse response = convertToResponse(entity); - response.setEmailSendResponse(emailSendResponse); + if (!Boolean.TRUE.equals(emailSendResponse.getIsEmailSend())) { + response.setEmailSendResponse(responses); + } return response; } return null; @@ -2029,6 +2035,7 @@ public class ApplicationEvaluationDao { ApplicationEvaluationEntity entity = applicationEvaluationService.validateApplicationEvaluation(evaluationResponse.getId()); + //Handling Application Evaluation form EvaluationFormEntity evaluationFormEntity = evaluationFormService.validateEvaluationForm(evaluationFormId); validateFormFields(applicationEvaluationFormRequestBean,evaluationFormEntity); @@ -2037,7 +2044,9 @@ public class ApplicationEvaluationDao { validateFormFieldCustom(applicationEvaluationFormRequestBean.getFormFields(),entity,evaluationFormEntity); ApplicationEvaluationFormEntity applicationEvaluationFormEntity = getApplicationEvaluationFormOrCreate(evaluationFormEntity,entity); createOrUpdateMultipleFormFields(applicationEvaluationFormRequestBean.getFormFields(), applicationEvaluationFormEntity, evaluationFormEntity); - return processEvaluationForm(entity); + ApplicationEvaluationFormResponse response = processEvaluationForm(entity); + response.setEmailSendResponse(evaluationResponse.getEmailSendResponse()); + return response; } private ApplicationEvaluationFormEntity getApplicationEvaluationFormOrCreate(EvaluationFormEntity evaluationFormEntity, ApplicationEvaluationEntity applicationEvaluationEntity) { @@ -2282,6 +2291,7 @@ public class ApplicationEvaluationDao { } response.setCompanyVatNumber(company.getVatNumber()); response.setCompanyCodiceAteco(company.getCodiceAteco()); + response.setEmailSendResponse(evaluationEntity.getEmailSendResponse()); return response; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailDao.java index 9b99facb..244df6a4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailDao.java @@ -161,9 +161,10 @@ public class EmailDao { private boolean updateEmailSendResponse(List responses, String scenario) { if (responses == null || responses.isEmpty()) return false; - for (EmailSendResponse response : responses) { + for (Iterator iterator = responses.iterator(); iterator.hasNext(); ) { + EmailSendResponse response = iterator.next(); if (scenario.equals(response.getEmailScenario().getValue())) { - response.setIsEmailSend(true); + iterator.remove(); // remove only the first match return true; } } @@ -172,6 +173,7 @@ public class EmailDao { + public EmailSendResponse buildEmailSendResponseFromRequest(HttpServletRequest request) { Long userActionId = (Long) request.getAttribute(GepafinConstant.USER_ACTION_ID); List emailLogs = emailLogRepository.findByUserActionIdAndEmailServiceType(userActionId,EmailServiceTypeEnum.PEC_SERVICE.getValue()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 234ffa1d..0403fde3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -149,17 +149,25 @@ public class UserDao { /** This code is responsible for adding a version history log for the "Create user" operation. **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).newData(userEntity).build()); - EmailSendResponse emailSendResponse = new EmailSendResponse(); + List responses = new ArrayList<>(); if(Boolean.FALSE.equals(roleEntity.getRoleType().equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue()))){ sendEmailToOnboardingUser(userEntity, userReq ); boolean isEmailSendSuccess = isEmailSentSuccessfully(userEntity.getId()); - emailSendResponse.setIsEmailSend(isEmailSendSuccess); - Long userActionId =(Long)request.getAttribute(GepafinConstant.USER_ACTION_ID); - emailSendResponse.setUserActionId(userActionId); - emailSendResponse.setEmailScenario(EmailScenarioTypeEnum.USER_CREATION); - saveEmailSendResponseToUser(emailSendResponse,userEntity); + EmailSendResponse emailSendResponse = new EmailSendResponse(); + if (Boolean.FALSE.equals(isEmailSendSuccess)){ + emailSendResponse.setIsEmailSend(false); + Long userActionId =(Long)request.getAttribute(GepafinConstant.USER_ACTION_ID); + emailSendResponse.setUserActionId(userActionId); + emailSendResponse.setEmailScenario(EmailScenarioTypeEnum.USER_CREATION); + + saveEmailSendResponseToUser(emailSendResponse,userEntity); + responses = List.of(emailSendResponse); + } + else{ + responses = Collections.emptyList(); + } } - JWTToken token = authService.getJWTTokenBean(userEntity, Boolean.TRUE, loginAttemptEntity.getId(),emailSendResponse); + JWTToken token = authService.getJWTTokenBean(userEntity, Boolean.TRUE, loginAttemptEntity.getId(),responses); return token; } @@ -509,8 +517,14 @@ public class UserDao { sendResetPasswordTokenEmail(user, token); InitiatePasswordResetResponse initiatePasswordResetResponse = new InitiatePasswordResetResponse(); EmailSendResponse emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); - initiatePasswordResetResponse.setEmailSendResponse(emailSendResponse); - saveEmailSendResponseToUser(emailSendResponse,user); + List responses = List.of(emailSendResponse); + if (!Boolean.TRUE.equals(emailSendResponse.getIsEmailSend())){ + initiatePasswordResetResponse.setEmailSendResponse(responses); + saveEmailSendResponseToUser(emailSendResponse,user); + } + else{ + initiatePasswordResetResponse.setEmailSendResponse(Collections.emptyList()); + } return initiatePasswordResetResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EmailSendResponseConverter.java b/src/main/java/net/gepafin/tendermanagement/entities/EmailSendResponseConverter.java index d02a842d..43409886 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/EmailSendResponseConverter.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/EmailSendResponseConverter.java @@ -18,6 +18,9 @@ public class EmailSendResponseConverter implements AttributeConverter attribute) { try { + if (attribute == null) { + attribute = List.of(); + } return objectMapper.writeValueAsString(attribute); } catch (JsonProcessingException e) { throw new IllegalArgumentException("Error converting list to JSON", e); diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java index ace60672..c7f1a2eb 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java @@ -32,5 +32,5 @@ public class ApplicationAmendmentRequestResponse { private String internalNote; private ApplicationAmendmentRequestEnum status; private String emailTemplate; - private EmailSendResponse emailSendResponse; + private List emailSendResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java index 38530c8a..92f7933a 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java @@ -48,5 +48,6 @@ public class ApplicationEvaluationFormResponse { private Long appointmentTemplateId; private String companyVatNumber; private String companyCodiceAteco; + private List emailSendResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java index 187aa1dd..49f07c6f 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -49,6 +49,6 @@ public class ApplicationEvaluationResponse { private EvaluationVersionEnum evaluationVersion; private String companyVatNumber; private String companyCodiceAteco; - private EmailSendResponse emailSendResponse; + private List emailSendResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/EmailReminderResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/EmailReminderResponse.java index d76b4fcd..25b8a3b3 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/EmailReminderResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/EmailReminderResponse.java @@ -5,12 +5,14 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; + @Data @AllArgsConstructor @NoArgsConstructor public class EmailReminderResponse { @JsonProperty("emailSendResponse") - private EmailSendResponse emailSendResponse; + private List emailSendResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/InitiatePasswordResetResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/InitiatePasswordResetResponse.java index c14ef643..129a1744 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/InitiatePasswordResetResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/InitiatePasswordResetResponse.java @@ -5,9 +5,11 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; + @Data @AllArgsConstructor @NoArgsConstructor public class InitiatePasswordResetResponse { - private EmailSendResponse emailSendResponse; + private List emailSendResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java b/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java index a65f7d6e..fdfb3e3a 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java +++ b/src/main/java/net/gepafin/tendermanagement/model/util/JWTToken.java @@ -6,6 +6,8 @@ import lombok.Data; import net.gepafin.tendermanagement.model.response.EmailSendResponse; import net.gepafin.tendermanagement.model.response.LoginResponse; +import java.util.List; + /** * JWTToken */ @@ -18,14 +20,14 @@ public class JWTToken { private LoginResponse loginResponse; @JsonProperty("emailSendResponse") - private EmailSendResponse emailSendResponse; + private List emailSendResponse; public JWTToken(String token, LoginResponse loginResponse) { this.token = token; this.loginResponse = loginResponse; } - public JWTToken(String token, LoginResponse loginResponse, EmailSendResponse emailSendResponse) { + public JWTToken(String token, LoginResponse loginResponse, List emailSendResponse) { this.token = token; this.loginResponse = loginResponse; this.emailSendResponse = emailSendResponse; diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java index 9b4b63ed..b19f77c4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationAmendmentRequestService.java @@ -16,7 +16,7 @@ public interface ApplicationAmendmentRequestService { public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(HttpServletRequest request,Long applicationEvaluationId); public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(HttpServletRequest request, Long applicationEvaluationId , ApplicationAmendmentRequest applicationAmendmentRequest); void deleteApplicationAmendmentRequest(HttpServletRequest request, Long id); - ApplicationAmendmentRequestResponseBean getApplicationAmendmentRequestById(HttpServletRequest request,Long id); + ApplicationAmendmentRequestResponse getApplicationAmendmentRequestById(HttpServletRequest request,Long id); List getAllApplicationAmendmentRequest(HttpServletRequest request, Long userId); ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean); ApplicationAmendmentRequestEntity validateApplicationAmendmentRequest(Long applicationAmendmentId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index 67258e9c..86140ac6 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -19,7 +19,7 @@ public interface ApplicationEvaluationService { void deleteApplicationEvaluation(HttpServletRequest request,Long id); - ApplicationEvaluationResponseBean getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId,Long assignedApplicationId); + ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(HttpServletRequest request,Long applicationId,Long assignedApplicationId); ApplicationEvaluationEntity validateApplicationEvaluation(Long applicationEvaluationId); ApplicationEvaluationEntity validateApplicationEvaluationByApplicationId(Long applicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java index 20a1e455..a680ec1b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -75,7 +75,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override - public ApplicationAmendmentRequestResponseBean getApplicationAmendmentRequestById(HttpServletRequest request,Long id) { + public ApplicationAmendmentRequestResponse getApplicationAmendmentRequestById(HttpServletRequest request,Long id) { ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java index 570487a8..650acdc1 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -57,7 +57,7 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe @Override @Transactional(readOnly = true) - public ApplicationEvaluationResponseBean getApplicationEvaluationByApplicationId( + public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId( HttpServletRequest request, Long applicationId, Long assignedApplicationId) { UserEntity preInstructor = validator.validateUser(request); return applicationEvaluationDao.getApplicationEvaluationByApplicationId( diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index e112d40e..01ad155b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -142,7 +142,7 @@ public class AuthenticationService { loginAttemptEntity.setErrorMsg(errorMsg); loginAttemptDao.createLoginAttempt(loginAttemptEntity); } - public JWTToken getJWTTokenBean(UserEntity user, Boolean rememberMe, Long loginAttemptId, EmailSendResponse emailSendResponse) { + public JWTToken getJWTTokenBean(UserEntity user, Boolean rememberMe, Long loginAttemptId, List emailSendResponse) { UserEntity oldUserEntity = Utils.getClonedEntityForData(user); user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); user = userRepository.save(user); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java index 25b53b3c..5d81ce7e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java @@ -72,7 +72,7 @@ public interface ApplicationAmendmentRequestApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "", produces = "application/json") - ResponseEntity> getApplicationAmendmentRequestById(HttpServletRequest request,@Parameter(description = "The application amendment id", required = true) @RequestParam(value = "id", required = true) Long id); + ResponseEntity> getApplicationAmendmentRequestById(HttpServletRequest request,@Parameter(description = "The application amendment id", required = true) @RequestParam(value = "id", required = true) Long id); @Operation(summary = "Api to get all applications amendment request by preInstructor user Id (deprecated)", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java index 1b60e9d7..4798e078 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -44,7 +44,7 @@ public interface ApplicationEvaluationApi { @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })) }) @GetMapping(value = "/application", produces = MediaType.APPLICATION_JSON_VALUE) - ResponseEntity> getApplicationEvaluationByApplicationId( + ResponseEntity> getApplicationEvaluationByApplicationId( HttpServletRequest request, @Parameter(required = false) @RequestParam(value = "applicationId", required = false) Long applicationId, @Parameter( required = false) @RequestParam(value = "assignedApplicationId", required = false) Long assignedApplicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java index 739c2802..0c8ef489 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationAmendmentRequestController.java @@ -69,14 +69,14 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme } @Override - public ResponseEntity> getApplicationAmendmentRequestById(HttpServletRequest request,Long id) { + public ResponseEntity> getApplicationAmendmentRequestById(HttpServletRequest request,Long id) { log.info("Get Application Amendment Request By Id"); /** This code is responsible for creating user action logs for the "get application amendment by id" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) .actionContext(UserActionContextEnum.GET_AMENDMENT).build()); - ApplicationAmendmentRequestResponseBean applicationAmendmentRequestResponse = applicationAmendmentRequestService.getApplicationAmendmentRequestById(request,id); + ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = applicationAmendmentRequestService.getApplicationAmendmentRequestById(request,id); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applicationAmendmentRequestResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_AMENDMENT_SUCCESS_MSG))); } @@ -185,11 +185,6 @@ public class ApplicationAmendmentRequestController implements ApplicationAmendme EmailReminderResponse emailSendResponse = applicationAmendmentRequestService.sendReminderEmail(request,amendmentId); - if (!emailSendResponse.getEmailSendResponse().getIsEmailSend()) { - return ResponseEntity.status(HttpStatus.OK) - .body(new Response<>(emailSendResponse, Status.EXCEPTION_ERROR, Translator.toLocale(GepafinConstant.REMINDER_EMAIL_FAILED_MSG))); - } - return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(emailSendResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.REMINDER_EMAIL_SENT_SUCCESS_MSG))); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java index 85486435..50eadb36 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java @@ -51,7 +51,7 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation @Override - public ResponseEntity> getApplicationEvaluationByApplicationId( + public ResponseEntity> getApplicationEvaluationByApplicationId( HttpServletRequest request, Long applicationId, Long assignedApplicationId) { @@ -59,7 +59,7 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_APPLICATION_EVALUATION).build()); - ApplicationEvaluationResponseBean response = null; + ApplicationEvaluationResponse response = null; response = applicationEvaluationService.getApplicationEvaluationByApplicationId(request, applicationId,assignedApplicationId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_FETCHED_SUCCESSFULLY))); From ad4e5483b44382d6634fb71a80a05f6d5863ec7d Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 20 May 2025 18:35:41 +0530 Subject: [PATCH 13/17] Add notification scenario check for Beneficiary role --- .../dao/ApplicationEvaluationDao.java | 12 ++++++++++-- .../gepafin/tendermanagement/dao/AppointmentDao.java | 11 +++++++++-- .../scheduler/ApplicationEvaluationScheduler.java | 6 +++++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index d7a03f62..b26a8a2a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -704,7 +704,11 @@ public class ApplicationEvaluationDao { /** This code is responsible for adding a version history log for the "Update Application" operation. **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionType).oldData(oldApplication).newData(application).build()); - Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_CREATION); +// Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_CREATION); + + Map placeHolders = new HashMap<>(); + placeHolders.put("{{call_name}}", application.getCall().getName()); + placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber())); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_CREATION); notificationDao.sendNotificationToInstructor(placeHolders,entity,NotificationTypeEnum.EVALUATION_CREATION); @@ -1943,6 +1947,7 @@ public class ApplicationEvaluationDao { application.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); application = applicationRepository.save(application); // emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application); + notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_RESULT); } if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.REJECTED.getValue())))) { application.setDateRejected(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); @@ -1951,9 +1956,12 @@ public class ApplicationEvaluationDao { emailNotificationDao.sendInadmissibilityEmailForRejectedApplication(application,existingEntity); emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); saveEmailSendResponseToEvaluation(emailSendResponse,existingEntity); + notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_RESULT); } - Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_RESULT); + Map placeHolders = new HashMap<>(); + placeHolders.put("{{call_name}}", application.getCall().getName()); + placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber())); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_RESULT); notificationDao.sendNotificationToInstructor(placeHolders,existingEntity,NotificationTypeEnum.EVALUATION_RESULT); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index cb83406e..d83cb36e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -343,7 +343,11 @@ public class AppointmentDao { applicationRepository.save(application); companyRepository.save(company); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(application.getApplicationEvaluationId()); - Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.NDG_GENERATION); +// Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.NDG_GENERATION); + + Map placeHolders = new HashMap<>(); + placeHolders.put("{{call_name}}", application.getCall().getName()); + placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber())); notificationDao.sendNotificationToInstructor(placeHolders, applicationEvaluationEntity, NotificationTypeEnum.NDG_GENERATION); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.NDG_GENERATION); log.info("NDG saved successfully for applicationId: {}", application.getId()); @@ -393,7 +397,10 @@ public class AppointmentDao { companyRepository.save(company); applicationRepository.save(application); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(application.getApplicationEvaluationId()); - Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.NDG_GENERATION); +// Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.NDG_GENERATION); + Map placeHolders = new HashMap<>(); + placeHolders.put("{{call_name}}", application.getCall().getName()); + placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber())); notificationDao.sendNotificationToInstructor(placeHolders, applicationEvaluationEntity, NotificationTypeEnum.NDG_GENERATION); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.NDG_GENERATION); log.info("NDG saved for applicationId: {}, {}", application.getId(), application.getNdg()); diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java index c43aca10..af4cb6be 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java @@ -24,6 +24,7 @@ import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.LocalTime; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -87,7 +88,10 @@ public class ApplicationEvaluationScheduler { evaluation.setStatus(ApplicationEvaluationStatusTypeEnum.EXPIRED.getValue()); evaluation = applicationEvaluationRepository.save(evaluation); - Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_EXPIRED); +// Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_EXPIRED); + Map placeHolders = new HashMap<>(); + placeHolders.put("{{call_name}}", application.getCall().getName()); + placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber())); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_EXPIRED); notificationDao.sendNotificationToInstructor(placeHolders,evaluation,NotificationTypeEnum.EVALUATION_EXPIRED); notificationDao.sendNotificationToInstructorManager(placeHolders,evaluation,NotificationTypeEnum.EVALUATION_EXPIRED); From 81ee85c6f536fef55e008df2f9ecbe3fd69b0490 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 21 May 2025 14:21:16 +0530 Subject: [PATCH 14/17] updated code --- .../net/gepafin/tendermanagement/dao/AppointmentDao.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index ce99d828..b1166689 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -62,11 +62,7 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; From 6df1cf4ea2f1055db7ac572a6d79f84cab42a063 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 21 May 2025 16:18:09 +0530 Subject: [PATCH 15/17] Added created date and updated date in changeset --- src/main/resources/db/changelog/db.changelog-1.0.0.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 0b4e6cc7..76bfc067 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 @@ -2653,6 +2653,8 @@ + + @@ -2666,12 +2668,16 @@ + + + + From 62274dcbd35c423610ad19061ed9724c1eed2593 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 23 May 2025 15:17:07 +0530 Subject: [PATCH 16/17] Added APOINTMENT status to update application status API --- .../tendermanagement/dao/ApplicationDao.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index f4656197..3a80c27d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -208,6 +208,7 @@ public class ApplicationDao { @Autowired private ApplicationEvaluationDao applicationEvaluationDao; + public final Random random = new Random(); public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { FormEntity formEntity = formService.validateForm(formId); @@ -934,12 +935,16 @@ public class ApplicationDao { } } + public String generateRandomFiveDigitNumber() { + int number = 10000 + random.nextInt(90000); // Generates a number from 10000 to 99999 + return String.valueOf(number); + } public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { log.info("Updating status for Application id : " + applicationId); ApplicationEntity applicationEntity = validateApplication(applicationId); - checkCallEndDate(applicationEntity.getCall()); + log.info("Call end date verified successfully | callId: {}", applicationEntity.getCall().getId()); //cloned entity for old application data ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity); @@ -953,8 +958,16 @@ public class ApplicationDao { if (Boolean.TRUE.equals(applicationEntity.getStatus().equals(status.getValue()))) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_IN_PREVIOUS_STATUS)); } + + if (status.equals(ApplicationStatusTypeEnum.APPOINTMENT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.NDG.getValue()))){ + String appointmentId = generateRandomFiveDigitNumber(); + applicationEntity.setAppointmentId(appointmentId); + applicationEntity.setStatus(ApplicationStatusTypeEnum.APPOINTMENT.getValue()); + } + if (status.equals(ApplicationStatusTypeEnum.SUBMIT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.READY.getValue()))) { // callService.validatePublishedCall(applicationEntity.getCall().getId(), userEntity.getHub().getId()); + checkCallEndDate(applicationEntity.getCall()); Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub()); ProtocolEntity protocolEntity = protocolDao.createProtocolEntity(applicationEntity, protocolNumber, userEntity.getHub().getId(),true); applicationEntity.setProtocol(protocolEntity); @@ -974,10 +987,12 @@ public class ApplicationDao { log.info("Status updated to SUBMIT for applicationId: " + applicationId); } if (status.equals(ApplicationStatusTypeEnum.DRAFT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.AWAITING.getValue()))) { + checkCallEndDate(applicationEntity.getCall()); applicationEntity.setStatus(status.getValue()); log.info("Status updated to DRAFT for applicationId: " + applicationId); } if (status.equals(ApplicationStatusTypeEnum.AWAITING) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.READY.getValue()))) { + checkCallEndDate(applicationEntity.getCall()); ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository.findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); deleteSignedDocumentFromS3(applicationSignedDocument); From 4e34486581b2be825023f4590cd9eb3357525df1 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 26 May 2025 12:46:18 +0530 Subject: [PATCH 17/17] Fixed close amendment issue --- .../dao/ApplicationAmendmentRequestDao.java | 10 +++++++++- .../ApplicationAmendmentRequestRepository.java | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 76ce5d3d..02a92762 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -1050,7 +1050,7 @@ public class ApplicationAmendmentRequestDao { public ApplicationAmendmentRequestResponse closeAmendmentRequest(Long id, CloseAmendmentRequest closeAmendmentRequest) { log.info("Closing application amendement with ID: {}", id); - ApplicationAmendmentRequestEntity existingApplicationAmendment = validatApplicationAmendmentRequestByStatus(id,ApplicationAmendmentRequestEnum.AWAITING.getValue()); + ApplicationAmendmentRequestEntity existingApplicationAmendment = validatApplicationAmendmentRequestByListStatus(id,List.of(ApplicationAmendmentRequestEnum.AWAITING.getValue(),ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED.getValue())); //cloned entity for old data and versioning ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(existingApplicationAmendment); List amendmentRequestList = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse( @@ -1670,4 +1670,12 @@ public class ApplicationAmendmentRequestDao { amendment.setEmailSendResponse(mergedResponses); applicationAmendmentRequestRepository.save(amendment); } + public ApplicationAmendmentRequestEntity validatApplicationAmendmentRequestByListStatus(Long id,List status) { + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalseAndStatusIn(id, status); + if (applicationAmendmentRequestEntity == null) { + throw new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG)); + } + return applicationAmendmentRequestEntity; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 4cd6d413..d063eb37 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -152,4 +152,6 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository applicationIds, @Param("statuses") List statuses); ApplicationAmendmentRequestEntity findByIdAndIsDeletedFalseAndStatus(Long id,String status); + + ApplicationAmendmentRequestEntity findByIdAndIsDeletedFalseAndStatusIn(Long id, List statusList); }