From 80e1eefd29b2aa84431f3b9c69143a169a8f6aa0 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Wed, 4 Dec 2024 21:07:06 +0530 Subject: [PATCH 01/33] Created Appointment creation flow. --- pom.xml | 4 +- .../constants/AppointmentApiConstant.java | 27 + .../constants/GepafinConstant.java | 32 + .../tendermanagement/dao/AppointmentDao.java | 884 ++++++++++++++++++ .../entities/ApplicationEntity.java | 13 + .../entities/CompanyEntity.java | 4 +- .../entities/DocumentEntity.java | 3 + .../tendermanagement/entities/HubEntity.java | 9 + .../enums/UserActionContextEnum.java | 7 +- .../request/AppointmentCreationRequest.java | 42 + .../model/request/AppointmentNdgRequest.java | 20 + .../request/AppointmentVisuraListRequest.java | 14 + .../request/AppointmentVisuraRequest.java | 28 + .../request/CreateAppointmentRequest.java | 17 + .../UploadDocToExternalSystemRequest.java | 23 + .../response/AppointmentCreationResponse.java | 8 + .../response/AppointmentLoginResponse.java | 16 + .../response/DocumentUploadResponse.java | 8 + .../model/response/NdgResponse.java | 8 + .../repositories/HubRepository.java | 10 +- .../service/AppointmentService.java | 16 + .../feignClient/AppointmentApiService.java | 44 + .../service/impl/AppointmentServiceImpl.java | 38 + .../gepafin/tendermanagement/util/Utils.java | 32 + .../web/rest/api/AppointmentApi.java | 60 ++ .../rest/api/impl/AppointmentController.java | 76 ++ src/main/resources/application-dev.properties | 8 + .../resources/application-local.properties | 9 +- .../application-production.properties | 8 + src/main/resources/application.properties | 3 + .../db/changelog/db.changelog-1.0.0.xml | 19 + src/main/resources/message_en.properties | 19 + src/main/resources/message_it.properties | 20 +- 33 files changed, 1519 insertions(+), 10 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/AppointmentNdgRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/AppointmentVisuraListRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/AppointmentVisuraRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/CreateAppointmentRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/UploadDocToExternalSystemRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/AppointmentCreationResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/AppointmentLoginResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/DocumentUploadResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/NdgResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/AppointmentService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/AppointmentServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/AppointmentApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java diff --git a/pom.xml b/pom.xml index f3424e44..93a592ed 100644 --- a/pom.xml +++ b/pom.xml @@ -88,8 +88,8 @@ com.amazonaws - aws-java-sdk-s3 - 1.12.312 + aws-java-sdk + 1.12.563 diff --git a/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java new file mode 100644 index 00000000..15a3444e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java @@ -0,0 +1,27 @@ +package net.gepafin.tendermanagement.constants; + +public class AppointmentApiConstant { + + public static final String ODESSA_LOGIN = "/WSGatewayLogin.apiLogin"; + public static final String GET_NDG_BY_VAT_NUMBER = "/WSAnagrafica.getListaNdg"; + public static final String CREATE_VISURA = "/WSAnagrafica.createVisura"; + public static final String GET_VISURA_LIST = "/WSAnagrafica.getVisuraList"; + public static final String GET_APPOINTMENT_TEMPLATE = "/WSCrmConsulenza.getAppuntamentoTemplate?idAppuntamentoTemplate=7"; + public static final String CREATE_APPOINTMENT_FROM_TEMPLATE = "/WSCrmConsulenza.createAppointmentFromTemplate"; + public static final String UPLOAD_APOOINTMENT_DOCUMENT = "/WSDocumentDetail.createStream"; + + //get ndg number + public static final int TARGET_PAGE_SIZE = 1; + public static final int RECORD_PER_PAGE_SIZE = 10; + +//create visura request Body constant + public static final boolean CREA_ANAGRAFICA = Boolean.TRUE; + public static final boolean SALVA_DOCUMENTI = Boolean.TRUE; + public static final String VISURA_PROVIDER = "cerved"; + public static final String VISURA_TYPE = "StandardReport"; + public static final String VISURA_MODE = "visure"; + public static final String COD_AGENTE = "UtenzaAPIPortal"; + public static final boolean IS_FROM_RATING = Boolean.FALSE; + public static final boolean IS_ANAGRAFICA_LEGAME = Boolean.FALSE; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index dbf39e8f..1cb999b5 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -305,5 +305,37 @@ public class GepafinConstant { public static final String USER_ID = "userId"; public static final String LOGIN_ATTEMPT_ID = "loginAttemptId"; public static final String USER_ACTION_ID = "userActionId"; + + //Appointment + public static final String NDG_IN_PROGRESS = "IN_PROGRESS"; + public static final String NDG_AVAILABLE = "ndg.available"; + public static final String NDG_GENERATION_IS_IN_PROGRESS = "ndg.generation.in.progress"; + public static final String NDG_GENERATED = "NDG_GENERATED"; + public static final String NDG_NOT_FOUND_FOR_APPLICATION = "ndg.not.found.for.this.application.or.invalid"; + public static final String APPOINTMENT_ALREADY_CREATED = "appointment.already.created"; + public static final String EXTERNAL_DOCUMENT_UPLOAD_FAILURE_MSG = "document.not.uploaded.to.external.system.please.try.again"; + public static final String PROVIDE_VALID_APPLICATION_DOC_ID = "provide.valid.application.document.id"; + public static final String DOCUMENT_UPLOADED_SUCCESSFULLY_TO_EXTERNAL_SYSTEM = "document.uploaded.successfully.to.external.system"; + public static final String ERROR_UPLOADING_DOCUMENT = "error.in.uploading.document.check.input"; + public static final String DOCUMENT_ALREADY_UPLOADED = "document.already.uploaded"; + public static final String NDG_NOT_MATCHED_OR_NOT_FOUND = "ndg.not.found.or.not.matched"; + public static final String NO_NDG_FOR_ANOTHER_HUB = "ndg.generation.is.only.for.gepafin"; + public static final String NO_APPOINTMENT_FOR_ANOTHER_HUB = "appointment.creation.is.only.for.gepafin"; + public static final String NO_DOCUMENT_UPLOAD_FOR_ANOTHER_HUB = "upload.document.is.only.for.gepafin"; + public static final String APPOINTMENT_CREATED = "appointment.created.successfully"; + public static final String DATA_STRING = "data"; + public static final String DOCUMENT_ATTACHMENT_ID_STRING = "documentAttachmentId"; + public static final String TEMP_FILE_PATH = "/tmp/"; + public static final String RICHIESTA_CLIENTE_STRING = "richiestaCliente"; + public static final String ID_STRING = "id"; + public static final String NULL_STRING = "null"; + public static final String NDG_STRING = "ndg"; + public static final String ID_VISURA_STRING = "idVisura"; + public static final String NDG_FETCH_SUCCESSFULLY = "ndg.fetch.successfully"; + public static final String AUTH_JWT_SECRET_KEY = "hTa5qe$af/4',BFs"; + public static final String JWT_ALGO_HEADER = "{\"alg\":\"HS256\",\"typ\":\"JWT\"}"; + public static final String HMAC_ALGO = "HmacSHA256"; + public static final String ERROR_IN_GENERATING_NDG_TRY_AGAIN = "error.try.again"; + public static final String POLLING_THREAD_NAME = "Ndg-Polling-Thread-"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java new file mode 100644 index 00000000..dd8b970c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -0,0 +1,884 @@ +package net.gepafin.tendermanagement.dao; + +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.model.GetObjectRequest; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import feign.FeignException; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.AppointmentApiConstant; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.CompanyEntity; +import net.gepafin.tendermanagement.entities.DocumentEntity; +import net.gepafin.tendermanagement.entities.HubEntity; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; +import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; +import net.gepafin.tendermanagement.model.request.AppointmentCreationRequest; +import net.gepafin.tendermanagement.model.request.AppointmentNdgRequest; +import net.gepafin.tendermanagement.model.request.AppointmentVisuraListRequest; +import net.gepafin.tendermanagement.model.request.AppointmentVisuraRequest; +import net.gepafin.tendermanagement.model.request.CreateAppointmentRequest; +import net.gepafin.tendermanagement.model.request.UploadDocToExternalSystemRequest; +import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; +import net.gepafin.tendermanagement.model.response.AppointmentCreationResponse; +import net.gepafin.tendermanagement.model.response.AppointmentLoginResponse; +import net.gepafin.tendermanagement.model.response.DocumentUploadResponse; +import net.gepafin.tendermanagement.model.response.NdgResponse; +import net.gepafin.tendermanagement.repositories.ApplicationRepository; +import net.gepafin.tendermanagement.repositories.CompanyRepository; +import net.gepafin.tendermanagement.repositories.DocumentRepository; +import net.gepafin.tendermanagement.repositories.HubRepository; +import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.service.CompanyService; +import net.gepafin.tendermanagement.service.feignClient.AppointmentApiService; +import net.gepafin.tendermanagement.util.LoggingUtil; +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.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.mock.web.MockMultipartFile; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +@Slf4j +@Component +public class AppointmentDao { + + @Value("${appointment.portal.user}") + private String user; + + @Value("${appointment.portal.password}") + private String password; + + @Value("${appointment.portal.source}") + private String source; + + @Value("${appointment.portal.context}") + private String context; + + @Value("${default.hub.uuid}") + private String defaultHubUuid; + + @Value("${aws.s3.url}") + private String s3Url; + + @Value("${aws.s3.bucket.name}") + private String OLD_BUCKET; + + @Value("${flagDaFirmare}") + private Boolean flagDaFirmare; + + @Autowired + private HubRepository hubRepository; + + @Autowired + private AppointmentApiService appointmentApiService; + + @Autowired + private ApplicationService applicationService; + + @Autowired + private CompanyService companyService; + + @Autowired + private ApplicationRepository applicationRepository; + + @Autowired + private CompanyRepository companyRepository; + + @Autowired + private DocumentDao documentDao; + + @Autowired + private AmazonS3Client s3Client; + + @Autowired + private DocumentRepository documentRepository; + + @Autowired + private HttpServletRequest request; + + @Autowired + private LoggingUtil loggingUtil; + + private final Map executorMap = new ConcurrentHashMap<>(); + + public NdgResponse checkNdgForAppointment(Long applicationId) { + + try { + NdgResponse ndgResponseToReturn = new NdgResponse(); + // Validate application, company, and hub + ApplicationEntity application = applicationService.validateApplication(applicationId); + if (application.getNdgStatus() != null && application.getNdgStatus().equalsIgnoreCase(GepafinConstant.NDG_IN_PROGRESS)) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.NDG_GENERATION_IS_IN_PROGRESS)); + } + //cloned for old application data + ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(application); + + CompanyEntity company = companyService.validateCompany(application.getCompanyId()); + HubEntity hub = hubRepository.findByHubId(application.getHubId()); + + if (!hub.getUniqueUuid().equals(defaultHubUuid)) { + log.info("Ndg cannot be created for another Hub, it is default for Gepafin."); + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.NO_NDG_FOR_ANOTHER_HUB)); + } + + // Check if NDG and idVisura are already present + if (isNdgAndIdVisuraPresent(application)) { + log.info("NDG already exist for applicationId: {}", applicationId); + ndgResponseToReturn.setNdg(application.getNdg()); + return ndgResponseToReturn; + } + + // Authenticate and fetch token if required + if (hub.getAppointmentAuthTokenId() == null && hub.getAreaCode() == null) { + hub = authenticateAndSaveToken(hub); + } + + String authorizationToken = getBearerToken(hub); + + // Try retrieving NDG by VAT number + AppointmentLoginResponse ndgResponse = retrieveNdgByVatNumber(company.getVatNumber(), authorizationToken, hub, application); + //For testing purpose Commenting it + if (isNdgValid(ndgResponse.getNdg())) { + saveNdgAndIdVisura(application, company, ndgResponse.getNdg(), null); + ndgResponseToReturn.setNdg(application.getNdg()); + return ndgResponseToReturn; + } + + return getNdgResponse(company, authorizationToken, hub, application, ndgResponseToReturn, oldApplicationData); + } catch (FeignException e) { + log.error("Error in feign client call during NDG handling: {}", e.getMessage(), e); + Utils.callException(e.status(), e); + } catch (CustomValidationException e) { + log.info("Custom validation exception: {}", e.getMessage()); + throw e; + } catch (Exception e) { + log.error("Error during NDG handling: {}", e.getMessage(), e); + throw new RuntimeException("Error during fetching NDG."); + } + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.ERROR_IN_GENERATING_NDG_TRY_AGAIN)); + } + + private NdgResponse getNdgResponse(CompanyEntity company, String authorizationToken, HubEntity hub, ApplicationEntity application, NdgResponse ndgResponseToReturn, + ApplicationEntity oldApplicationData) { + // Create Visura if NDG is not found + AppointmentLoginResponse visuraResponse = createVisura(company, authorizationToken, hub); + if (isNdgValid(visuraResponse.getNdg())) { + saveNdgAndIdVisura(application, company, visuraResponse.getNdg(), visuraResponse.getIdVisura()); + ndgResponseToReturn.setNdg(application.getNdg()); + } else if (visuraResponse.getIdVisura() != null) { + application.setNdgStatus(GepafinConstant.NDG_IN_PROGRESS); + applicationRepository.save(application); + + /** This code is responsible for adding a version history log for the "Updating ndg status in application" operation. **/ + loggingUtil.addVersionHistory( + VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData).newData(application).build()); + + startNdgPollingTask(application, company, hub); + throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.NDG_GENERATION_IS_IN_PROGRESS)); + } + + return ndgResponseToReturn; + } + + private static String getBearerToken(HubEntity hub) { + + return "Bearer " + hub.getAppointmentAuthTokenId(); + } + + private void startNdgPollingTask(ApplicationEntity application, CompanyEntity company, HubEntity hub) { + //cloned for all data + ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(application); + CompanyEntity oldCompanyData = Utils.getClonedEntityForData(company); + + // Check if a thread is already running for this application + if (executorMap.containsKey(application.getId())) { + log.warn("Polling task already running for applicationId: {}", application.getId()); + return; + } + + // Create a dedicated thread (single-threaded executor) for this application + ExecutorService executor = Executors.newSingleThreadExecutor(runnable -> { + Thread thread = new Thread(runnable); + thread.setName(GepafinConstant.POLLING_THREAD_NAME + application.getId()); + return thread; + }); + executorMap.put(application.getId(), executor); + + // Submit polling task to this thread + executor.submit(() -> { + try { + log.info("Polling task started for applicationId: {} on thread: {}", application.getId(), Thread.currentThread().getName()); + long startTime = System.currentTimeMillis(); + + while (true) { + if (application.getNdg() != null) + break; + try { + String visuraListJson = getVisuraList(application.getIdVisura(), hub.getAppointmentAuthTokenId(), application, hub); + String ndg = parseNdgFromVisuraListResponse(visuraListJson); + + if (isNdgValid(ndg)) { + company.setNdg(ndg); + application.setNdgStatus(GepafinConstant.NDG_GENERATED); + application.setNdg(ndg); + applicationRepository.save(application); + companyRepository.save(company); + + log.info("NDG obtained for applicationId: {} and saved successfully.", application.getId()); + break; // Exit the loop after successful NDG retrieval + } else { + log.warn("NDG not found for applicationId: {} in Visura List API response.", application.getId()); + } + + // Check if polling time has exceeded the limit + if (System.currentTimeMillis() - startTime > TimeUnit.HOURS.toMillis(2)) { + log.warn("Polling timed out for applicationId: {}", application.getId()); + break; + } + + // Wait before the next polling attempt + Thread.sleep(TimeUnit.MINUTES.toMillis(1)); + + } catch (InterruptedException e) { + log.warn("Polling task interrupted for applicationId: {}", application.getId()); + Thread.currentThread().interrupt(); + break; + } catch (Exception e) { + log.error("Error during NDG polling for applicationId: {}", application.getId(), e); + } + } + } finally { + // Cleanup: Shut down the thread for this application + executor.shutdown(); + executorMap.remove(application.getId()); + log.info("Polling task completed and thread shut down for applicationId: {}", application.getId()); + } + }); + /** This code is responsible for adding a version history log for the "Update application ndgCode and ndgStatus" operation. **/ + loggingUtil.addVersionHistory( + VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData).newData(application).build()); + + /** This code is responsible for adding a version history log for the "Update company ndgCode" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyData).newData(company).build()); + } + + private boolean isNdgAndIdVisuraPresent(ApplicationEntity application) { + + String ndg = application.getNdg(); + String idVisura = application.getIdVisura(); + + if (ndg != null && idVisura == null) { + return true; + } else if (ndg == null && idVisura != null) { + return false; + } else + return ndg != null; + } + + private boolean isNdgValid(String ndg) { + + return ndg != null && !ndg.isEmpty(); + } + + private void saveNdgAndIdVisura(ApplicationEntity application, CompanyEntity company, String ndg, String idVisura) { + + //cloned for old application and company data + ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(application); + CompanyEntity oldCompanyData = Utils.getClonedEntityForData(company); + + application.setNdg(ndg); + application.setIdVisura(idVisura); + application.setNdgStatus(GepafinConstant.NDG_GENERATED); + company.setNdg(ndg); + companyRepository.save(company); + applicationRepository.save(application); + + /** This code is responsible for adding a version history log for the "update application ndg code, status, and Id visura" operation. **/ + loggingUtil.addVersionHistory( + VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData).newData(application).build()); + + /** This code is responsible for adding a version history log for the "update company ndg code" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyData).newData(company).build()); + + log.info("NDG saved for applicationId: {}, {}", application.getId(), application.getNdg()); + } + + private String getVisuraList(String idVisura, String authorizationToken, ApplicationEntity application, HubEntity hub) { + + AppointmentVisuraListRequest visuraListRequest = new AppointmentVisuraListRequest(); + AppointmentVisuraListRequest.VisuraFilter filter = new AppointmentVisuraListRequest.VisuraFilter(); + filter.setIdVisura(idVisura); + visuraListRequest.setFilter(filter); + + try { + String requestJson = Utils.convertObjectToJson(visuraListRequest); + ResponseEntity response = appointmentApiService.getVisuraList(requestJson, authorizationToken); + return Utils.convertObjectToJson(response.getBody()); + } catch (FeignException.Forbidden forbiddenException) { + log.error("403 Forbidden received while getting visuraList for Ndg code. Regenerating token..."); + // Regenerate the token and retry + String newAuthorizationToken = regenerateTokenAndSave(hub); + return getVisuraList(idVisura, newAuthorizationToken, application, hub); + } catch (Exception e) { + log.error("Failed to fetch Ndg code: {}", e.getMessage(), e); + throw new RuntimeException("Error fetching Ndg List", e); + } + } + + private HubEntity authenticateAndSaveToken(HubEntity hub) { + + HubEntity oldHubData = Utils.getClonedEntityForData(hub); + try { + //code to generate token with payload having "iat" epoch timestamp and secret key with no expiry and send in below method call + String authJwtToken = Utils.generateAuthTokenForLoginToOdessa(); + log.info("Got the auth for login to odessa {}", authJwtToken); + hub.setAuthToken(authJwtToken); + hubRepository.save(hub); + + /** This code is responsible for adding a version history log for the "Updating auth token for login api in hub" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldHubData).newData(hub).build()); + + // Prepare the request body (adjust if necessary for login API) + Map body = Collections.emptyMap(); + // Perform login API call + ResponseEntity responseLogin = appointmentApiService.loginWithOdessa(authJwtToken, source, context, user, password, body); + + // Handle successful login + if (responseLogin.getStatusCode() == HttpStatus.OK) { + log.info("Login successful to odessa. Parsing response."); + String loginResponseJson = Utils.convertObjectToJson(responseLogin.getBody()); + AppointmentLoginResponse parsedResponse = parseLoginResponse(loginResponseJson); + + // Validate and save token + if (parsedResponse.getTokenId() != null) { + hub.setAppointmentAuthTokenId(parsedResponse.getTokenId()); + hub.setAreaCode(parsedResponse.getAreaCode()); + hubRepository.save(hub); + + /** This code is responsible for adding a version history log for the "inserting token and areaCode from login odessa response for appointment flow api's" + * operation. **/ + loggingUtil.addVersionHistory( + VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldHubData).newData(hub).build()); + + log.info("Saved new authToken and areaCode for Hub."); + return hub; + } else { + throw new RuntimeException("Login response is missing a valid tokenId for login to odessa system, please try again."); + } + } + // Handle non-OK response + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.ERROR_IN_GENERATING_NDG_TRY_AGAIN)); + } catch (Exception e) { + log.error("Failed to authenticate user on Odessa : {}", e.getMessage(), e); + throw new RuntimeException("Authentication failed on Odessa. try again", e); + } + } + + private AppointmentLoginResponse retrieveNdgByVatNumber(String vatNumber, String authorizationToken, HubEntity hub, ApplicationEntity application) { + + try { + // Prepare the NDG request + AppointmentNdgRequest ndgRequest = getAppointmentNdgRequest(vatNumber); + // Call the API to retrieve NDG + ResponseEntity response = appointmentApiService.getNdgByVatNumber(ndgRequest, authorizationToken); + String responseJson = Utils.convertObjectToJson(response.getBody()); + // Parse and return the NDG response + return parseNdgResponse(responseJson); + } catch (FeignException.Forbidden forbiddenException) { + log.error("403 Forbidden received while retrieving NDG. Regenerating token..."); + // Regenerate the token and retry + String newAuthorizationToken = regenerateTokenAndSave(hub); + return retrieveNdgByVatNumber(vatNumber, newAuthorizationToken, hub, application); + } catch (Exception e) { + log.error("Failed to retrieve NDG by VAT number: {}", e.getMessage(), e); + throw new RuntimeException("NDG retrieval failed.", e); + } + } + + private String regenerateTokenAndSave(HubEntity hub) { + + try { + hub = authenticateAndSaveToken(hub); + return "Bearer " + hub.getAppointmentAuthTokenId(); + } catch (Exception e) { + log.error("Failed to regenerate token from Odessa: {}", e.getMessage()); + throw new RuntimeException("Token regeneration failed from Odessa.", e); + } + } + + private AppointmentLoginResponse createVisura(CompanyEntity company, String authorizationToken, HubEntity hub) { + + try { + String visuraRequest = getAppointmentVisuraRequest(company, hub.getAreaCode()); + ResponseEntity response = appointmentApiService.createVisura(visuraRequest, authorizationToken); + String responseJson = Utils.convertObjectToJson(response.getBody()); + return parseVisuraResponse(responseJson); + } catch (FeignException.Forbidden forbiddenException) { + log.error("403 Forbidden received while retrieving NDG. Regenerating token..."); + // Regenerate the token and retry + String newAuthorizationToken = regenerateTokenAndSave(hub); + return createVisura(company, newAuthorizationToken, hub); + } catch (Exception e) { + log.error("Failed to create Visura for Ndg : {}", e.getMessage()); + throw new RuntimeException("Visura creation failed for Ndg.", e); + } + } + + private static AppointmentNdgRequest getAppointmentNdgRequest(String vatNumber) { + + AppointmentNdgRequest request = new AppointmentNdgRequest(); + AppointmentNdgRequest.Filter filter = new AppointmentNdgRequest.Filter(); + filter.setPartitaIva(vatNumber); + + AppointmentNdgRequest.Pagination pagination = new AppointmentNdgRequest.Pagination(); + pagination.setTargetPage(AppointmentApiConstant.TARGET_PAGE_SIZE); + pagination.setRecordsPerPage(AppointmentApiConstant.RECORD_PER_PAGE_SIZE); + + request.setFilter(filter); + request.setPagination(pagination); + return request; + } + + private static String getAppointmentVisuraRequest(CompanyEntity company, String areaCode) { + + AppointmentVisuraRequest visuraRequest = new AppointmentVisuraRequest(); + AppointmentVisuraRequest.VisuraInput input = new AppointmentVisuraRequest.VisuraInput(); + input.setPartitaIva(company.getVatNumber()); + input.setCodiceFiscale(company.getCodiceFiscale()); + input.setCodArea(areaCode); + input.setVisuraMode(AppointmentApiConstant.VISURA_MODE); + input.setVisuraProvider(AppointmentApiConstant.VISURA_PROVIDER); + input.setCodAgente(AppointmentApiConstant.COD_AGENTE); + input.setAnagraficaLegame(AppointmentApiConstant.IS_ANAGRAFICA_LEGAME); + input.setCreaAnagrafica(AppointmentApiConstant.CREA_ANAGRAFICA); + input.setFromRating(AppointmentApiConstant.IS_FROM_RATING); + input.setSalvaDocumenti(AppointmentApiConstant.SALVA_DOCUMENTI); + input.setVisuraType(AppointmentApiConstant.VISURA_TYPE); + visuraRequest.setInput(input); + return Utils.convertObjectToJson(visuraRequest); + } + + private String parseNdgFromVisuraListResponse(String jsonResponse) { + + try { + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(jsonResponse); + JsonNode dataNode = rootNode.get(GepafinConstant.DATA_STRING); + + if (dataNode != null && dataNode.isArray() && dataNode.size() > 0) { + JsonNode firstEntry = dataNode.get(0); + JsonNode ndgClienteNode = firstEntry.get("ndgCliente"); + if (ndgClienteNode != null && ndgClienteNode.get("code") != null) { + String code = ndgClienteNode.get("code").asText(); + return normalizeNullValue(code); + } + } + log.warn("NDG not found in Visura List API response."); + return null; + } catch (Exception e) { + log.error("Failed to parse NDG from Visura List API response: {}", e.getMessage(), e); + throw new RuntimeException("Error parsing NDG from Visura List API response", e); + } + } + + public AppointmentLoginResponse parseLoginResponse(String jsonResponse) { + + try { + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(jsonResponse); + JsonNode dataNode = rootNode.get(GepafinConstant.DATA_STRING); + + if (dataNode != null) { + AppointmentLoginResponse response = new AppointmentLoginResponse(); + response.setTokenId(dataNode.get("tokenId").asText()); + JsonNode areasNode = dataNode.get("areas"); + if (areasNode != null && areasNode.isArray() && areasNode.size() > 0) { + response.setAreaCode(areasNode.get(0).get("code").asText()); + } + response.setCompanyId(dataNode.get("companyId").asLong()); + return response; + } else { + throw new RuntimeException("Invalid JSON structure: Missing 'data' node."); + } + } catch (Exception e) { + throw new RuntimeException("Failed to parse response from loginApi for odessa: " + e.getMessage(), e); + } + } + + public AppointmentLoginResponse parseVisuraResponse(String jsonResponse) { + + try { + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(jsonResponse); + JsonNode dataNode = rootNode.get(GepafinConstant.DATA_STRING); + + if (dataNode != null) { + AppointmentLoginResponse response = new AppointmentLoginResponse(); + response.setIdVisura(normalizeNullValue(dataNode.get(GepafinConstant.ID_VISURA_STRING).asText())); + response.setNdg(normalizeNullValue(dataNode.get(GepafinConstant.NDG_STRING).asText())); + return response; + } else { + throw new RuntimeException("Invalid JSON structure: Missing 'data' node."); + } + } catch (Exception e) { + throw new RuntimeException("Failed to parse response: " + e.getMessage(), e); + } + } + + public AppointmentLoginResponse parseNdgResponse(String jsonResponse) { + + try { + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(jsonResponse); + JsonNode dataArray = rootNode.get(GepafinConstant.DATA_STRING); + if (dataArray == null || !dataArray.isArray() || dataArray.isEmpty()) { + log.info("NDG data is empty or missing in the response."); + AppointmentLoginResponse emptyResponse = new AppointmentLoginResponse(); + emptyResponse.setNdg(null); + return emptyResponse; + } + JsonNode firstDataEntry = dataArray.get(0); + AppointmentLoginResponse response = new AppointmentLoginResponse(); + if (firstDataEntry.has(GepafinConstant.NDG_STRING)) { + response.setNdg(normalizeNullValue(firstDataEntry.get(GepafinConstant.NDG_STRING).asText())); + } + return response; + } catch (Exception e) { + log.error("Failed to parse response: {}", e.getMessage(), e); + throw new RuntimeException("Failed to parse NDG response.", e); + } + } + + private String normalizeNullValue(String value) { + + return (value == null || GepafinConstant.NULL_STRING.equalsIgnoreCase(value.trim())) ? null : value; + } + + public AppointmentCreationResponse createAppointment(Long applicationId, CreateAppointmentRequest createAppointmentRequest) { + // Validate the application + ApplicationEntity application = applicationService.validateApplication(applicationId); + + AppointmentCreationResponse appointmentCreationResponse = new AppointmentCreationResponse(); + + ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(application); + HubEntity hub = hubRepository.findByHubId(application.getHubId()); + + // Check hub UUID and enforce constraints + if (!hub.getUniqueUuid().equals(defaultHubUuid)) { + log.info("Appointment cannot be created for another Hub; default is required for Gepafin."); + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.NO_APPOINTMENT_FOR_ANOTHER_HUB)); + } + + try { + // Pre-check conditions for appointment creation + if (application.getNdg() != null && !Objects.equals(application.getNdgStatus(), GepafinConstant.NDG_IN_PROGRESS) && application.getAppointmentId() != null) { + appointmentCreationResponse.setAppointmentId(application.getAppointmentId()); + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPOINTMENT_ALREADY_CREATED)); + // return appointmentCreationResponse; + } + + if (application.getNdg() == null && Objects.equals(application.getNdgStatus(), GepafinConstant.NDG_IN_PROGRESS)) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.NDG_NOT_FOUND_FOR_APPLICATION)); + } + + // Generate authorization token and fetch template data + String authorizationToken = getBearerToken(hub); + ResponseEntity response = appointmentApiService.getAppointmentTemplateForTemplateCreation(authorizationToken); + + if (response.getStatusCode() != HttpStatus.OK) { + log.error("Failed to retrieve appointment template for appointment creation. Status: {}", response.getStatusCode()); + throw new IllegalStateException("Failed to retrieve appointment template for appointment creation"); + } + + // Parse template data + String responseDataForTemplate = Utils.convertObjectToJson(response.getBody()); + AppointmentCreationRequest templateRichiestaData = parseTemplateResponseData(responseDataForTemplate); + + // Build the appointment request body + AppointmentCreationRequest appointmentCreationRequest = buildAppointmentCreationRequest(applicationId, createAppointmentRequest, hub.getAreaCode(), + templateRichiestaData); + String appointmentRequestBody = Utils.convertObjectToJson(appointmentCreationRequest); + + // Make API call to create the appointment + ResponseEntity appointmentResponse = appointmentApiService.createAppointment(authorizationToken, context, appointmentRequestBody); + String appointmentId = extractAppointmentIdFromResponse(appointmentResponse); + + if (appointmentId != null) { + // Update application with the appointment ID + application.setAppointmentId(appointmentId); + applicationRepository.save(application); + + // Log version history + loggingUtil.addVersionHistory( + VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData).newData(application).build()); + } + + appointmentCreationResponse.setAppointmentId(appointmentId); + return appointmentCreationResponse; + + } catch (FeignException.Forbidden forbiddenException) { + log.error("403 Forbidden received while retrieving template. Regenerating token..."); + regenerateTokenAndSave(hub); + return createAppointment(applicationId, createAppointmentRequest); + } + } + + private String extractAppointmentIdFromResponse(ResponseEntity appointmentResponse) { + + if (appointmentResponse.getBody() != null) { + Map responseBody = (Map) appointmentResponse.getBody(); + if (responseBody.containsKey(GepafinConstant.DATA_STRING)) { + Map data = (Map) responseBody.get(GepafinConstant.DATA_STRING); + if (data != null && data.containsKey(GepafinConstant.ID_STRING)) { + return data.get(GepafinConstant.ID_STRING).toString(); + } + } + } + return null; + } + + public AppointmentCreationRequest parseTemplateResponseData(String jsonResponse) { + + try { + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(jsonResponse); + JsonNode richiestaClienteArray = rootNode.path(GepafinConstant.DATA_STRING).path(GepafinConstant.RICHIESTA_CLIENTE_STRING); + + AppointmentCreationRequest appointmentCreationRequest = new AppointmentCreationRequest(); + AppointmentCreationRequest.Input input = new AppointmentCreationRequest.Input(); + + // Map `richiestaCliente` array + List richiestaClienteList = new ArrayList<>(); + if (richiestaClienteArray.isArray()) { + for (JsonNode richiestaNode : richiestaClienteArray) { + richiestaClienteList.add(objectMapper.treeToValue(richiestaNode, AppointmentCreationRequest.RichiestaCliente.class)); + } + } + + input.setRichiestaCliente(richiestaClienteList); + appointmentCreationRequest.setInput(input); + return appointmentCreationRequest; + + } catch (Exception e) { + log.error("Error parsing template response: {}", e.getMessage(), e); + throw new IllegalStateException("Failed to parse template response", e); + } + } + + public AppointmentCreationRequest buildAppointmentCreationRequest(Long applicationId, CreateAppointmentRequest createAppointmentRequest, String areaCode, + AppointmentCreationRequest templateRichiestaData) { + + ApplicationEntity application = applicationService.validateApplication(applicationId); + CreateAppointmentRequest.Nota nota = createAppointmentRequest.getNota(); + + AppointmentCreationRequest appointmentCreationRequest = new AppointmentCreationRequest(); + AppointmentCreationRequest.Input input = new AppointmentCreationRequest.Input(); + + // Set Input Fields + input.setId(areaCode); + input.setNdg(application.getNdg()); + + // Populate richiestaCliente from template data + List richiestaClienteList = new ArrayList<>(); + for (AppointmentCreationRequest.RichiestaCliente templateRichiesta : templateRichiestaData.getInput().getRichiestaCliente()) { + AppointmentCreationRequest.RichiestaCliente richiestaCliente = new AppointmentCreationRequest.RichiestaCliente(); + BeanUtils.copyProperties(templateRichiesta, richiestaCliente); + + // Add specific `nota` + AppointmentCreationRequest.Nota requestNota = new AppointmentCreationRequest.Nota(); + requestNota.setTitolo(nota.getTitolo()); + requestNota.setTesto(nota.getTesto()); + richiestaCliente.setNota(requestNota); + + richiestaClienteList.add(richiestaCliente); + } + + input.setRichiestaCliente(richiestaClienteList); + appointmentCreationRequest.setInput(input); + return appointmentCreationRequest; + } + + public DocumentUploadResponse uploadDocumentToExternalSystem(Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest, Long applicationId) { + + DocumentUploadResponse response = new DocumentUploadResponse(); + DocumentEntity systemDoc = documentDao.validateDocument(documentId); + + ApplicationEntity application = getApplicationEntityForDocument(applicationId, systemDoc); + + //cloned for old document data + DocumentEntity oldDocumentEntity = Utils.getClonedEntityForData(systemDoc); + + if (!docToExternalSystemRequest.getInput().getAttributes().getNdg().equalsIgnoreCase(application.getNdg())) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.NDG_NOT_MATCHED_OR_NOT_FOUND)); + } + + Long hubId = application.getHubId(); + HubEntity hub = hubRepository.findByHubId(hubId); + + if (!hub.getUniqueUuid().equals(defaultHubUuid)) { + log.info("Document cannot be uploaded for another Hub, it is default for Gepafin."); + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.NO_DOCUMENT_UPLOAD_FOR_ANOTHER_HUB)); + } + log.info("Got Document in system {}", systemDoc); + + String oldUrl = systemDoc.getFilePath(); + log.info("Processing {}", oldUrl); + + String authorizationToken = getBearerToken(hub); + try { + File localFile = downloadFileFromS3(oldUrl); + MultipartFile multipartFile = convertFileToMultipartFile(localFile); + + UploadDocToExternalSystemRequest externalSystemRequest = new UploadDocToExternalSystemRequest(); + + UploadDocToExternalSystemRequest.Input input = getUploadDocumentInput(docToExternalSystemRequest); + externalSystemRequest.setInput(input); + + String uploadDocRequest = Utils.convertObjectToJson(externalSystemRequest); + ResponseEntity uploadedDocumentData = appointmentApiService.uploadDocumentToExternalSystemForAppointment(authorizationToken, context, uploadDocRequest, + multipartFile); + String responseData = Utils.convertObjectToJson(uploadedDocumentData.getBody()); + DocumentUploadResponse parsedDocumentUploadResponse = parseDocumentUploadResponse(responseData); + + if (parsedDocumentUploadResponse == null) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.ERROR_UPLOADING_DOCUMENT)); + } + + systemDoc.setDocumentAttachmentId(parsedDocumentUploadResponse.getDocumentAttachmentId()); + documentRepository.save(systemDoc); + + /** This code is responsible for adding a version history log for the "Update document with document attachment id" operation. **/ + loggingUtil.addVersionHistory( + VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldDocumentEntity).newData(systemDoc).build()); + + log.info("Document uploaded successfully to external system : {}", parsedDocumentUploadResponse); + response.setDocumentAttachmentId(systemDoc.getDocumentAttachmentId()); + return response; + } catch (FeignException.Forbidden forbiddenException) { + log.error("403 Forbidden received while uploading document to external system. Regenerating token..."); + + regenerateTokenAndSave(hub); + return uploadDocumentToExternalSystem(systemDoc.getSourceId(), docToExternalSystemRequest, applicationId); + } catch (Exception e) { + log.error("Exception in uploading document to external system {}", e.getMessage()); + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.EXTERNAL_DOCUMENT_UPLOAD_FAILURE_MSG)); + } + } + private ApplicationEntity getApplicationEntityForDocument(Long applicationId, DocumentEntity systemDoc) { + + if (systemDoc.getDocumentAttachmentId() != null) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.DOCUMENT_ALREADY_UPLOADED)); + } + + ApplicationEntity application; + + if (systemDoc.getSource().equalsIgnoreCase(DocumentSourceTypeEnum.APPLICATION.getValue()) && Objects.equals(systemDoc.getSourceId(), applicationId)) { + application = applicationService.validateApplication(systemDoc.getSourceId()); + } else { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.PROVIDE_VALID_APPLICATION_DOC_ID)); + } + return application; + } + + private UploadDocToExternalSystemRequest.Input getUploadDocumentInput(UploadDocToExternalSystemRequest docToExternalSystemRequest) { + + UploadDocToExternalSystemRequest.Input input = new UploadDocToExternalSystemRequest.Input(); + input.setIdTipoProtocollo(docToExternalSystemRequest.getInput().getIdTipoProtocollo()); + input.setIdClassificazione(docToExternalSystemRequest.getInput().getIdClassificazione()); + input.setFlagDaFirmare(flagDaFirmare); + input.setDescrizione(docToExternalSystemRequest.getInput().getDescrizione()); + + UploadDocToExternalSystemRequest.Input.Attributes attributes = new UploadDocToExternalSystemRequest.Input.Attributes(); + attributes.setNdg(docToExternalSystemRequest.getInput().getAttributes().getNdg()); + attributes.setEmail(docToExternalSystemRequest.getInput().getAttributes().getEmail()); + + input.setAttributes(attributes); + return input; + } + + public static MultipartFile convertFileToMultipartFile(File file) throws IOException { + + FileInputStream input = new FileInputStream(file); + return new MockMultipartFile(file.getName(), file.getName(), MediaType.APPLICATION_OCTET_STREAM_VALUE, input); + } + + private File downloadFileFromS3(String fileUrl) throws Exception { + + String key = extractS3KeyFromUrl(fileUrl); + File localFile = new File(GepafinConstant.TEMP_FILE_PATH + extractFileName(key)); + + GetObjectRequest getObjectRequest = new GetObjectRequest(OLD_BUCKET, key); + + try (InputStream s3Stream = s3Client.getObject(getObjectRequest).getObjectContent(); FileOutputStream outputStream = new FileOutputStream(localFile)) { + s3Stream.transferTo(outputStream); + } + + log.info("Downloaded file from old S3 bucket: {}", key); + return localFile; + } + + private String extractS3KeyFromUrl(String url) { + + return url.replace(s3Url, ""); + } + + private String extractFileName(String filePath) { + + String[] parts = filePath.split("/"); + return parts[parts.length - 1]; + + } + + public DocumentUploadResponse parseDocumentUploadResponse(String jsonResponse) { + + try { + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode rootNode = objectMapper.readTree(jsonResponse); + + // Navigate to the "data" node + JsonNode dataNode = rootNode.get(GepafinConstant.DATA_STRING); + if (dataNode != null) { + DocumentUploadResponse response = new DocumentUploadResponse(); + + // Extract "documentAttachmentId" + JsonNode documentAttachmentIdNode = dataNode.get(GepafinConstant.DOCUMENT_ATTACHMENT_ID_STRING); + if (documentAttachmentIdNode != null) { + response.setDocumentAttachmentId(documentAttachmentIdNode.asText()); + } else { + throw new RuntimeException("Invalid JSON structure: Missing 'documentAttachmentId' node."); + } + + return response; + } else { + return null; + } + } catch (Exception e) { + throw new RuntimeException("Failed to parse response: " + e.getMessage(), e); + } + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java index 6e65bf83..39e26f4b 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java @@ -42,4 +42,17 @@ public class ApplicationEntity extends BaseEntity { @ManyToOne @JoinColumn(name = "USER_WITH_COMPANY_ID") private UserWithCompanyEntity userWithCompany; + + @Column(name = "NDG") + private String ndg; + + @Column(name = "ID_VISURA") + private String idVisura; + + @Column(name = "NDG_STATUS") + private String ndgStatus; + + @Column(name = "APPOINTMENT_ID") + private String appointmentId; + } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java index ed50268f..e3709ef7 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java @@ -62,5 +62,7 @@ public class CompanyEntity extends BaseEntity{ @ManyToOne @JoinColumn(name = "HUB_ID") private HubEntity hub; - + + @Column(name = "NDG") + private String ndg; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java index fc15a82d..d15a65e6 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java @@ -29,4 +29,7 @@ public class DocumentEntity extends BaseEntity{ @Column(name ="IS_DELETED", nullable = false) private Boolean isDeleted = false; + @Column(name="DOCUMENT_ATTACHMENT_ID") + private String documentAttachmentId; + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java index 2e219acf..52aa6cc2 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java @@ -54,4 +54,13 @@ public class HubEntity extends BaseEntity{ @Column(name = "EMAIL_SERVICE_CONFIG") private String emailServiceConfig; + + @Column(name = "AUTH_TOKEN") + private String authToken; + + @Column(name = "APPOINTMENT_AUTH_TOKEN_ID") + private String appointmentAuthTokenId; + + @Column(name = "AREA_CODE") + private String areaCode; } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 7023b40b..94fabe89 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -151,7 +151,12 @@ public enum UserActionContextEnum { /** scheduler action context **/ AMENDMENT_EXPIRATION_SCHEDULER("AMENDMENT_EXPIRATION_SCHEDULER"), - EVALUATION_EXPIRATION_SCHEDULER("EVALUATION_EXPIRATION_SCHEDULER"); + EVALUATION_EXPIRATION_SCHEDULER("EVALUATION_EXPIRATION_SCHEDULER"), + + /** appointment action context **/ + CHECK_OR_CREATE_NDG_CODE("CHECK_OR_CREATE_NDG_CODE"), + CREATE_APPOINTMENT("CREATE_APPOINTMENT"), + UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM("UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java new file mode 100644 index 00000000..a877a620 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java @@ -0,0 +1,42 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +import java.util.List; + +@Data +public class AppointmentCreationRequest { + + private Input input; + + @Data + public static class Input { + private String id; + private String ndg; + private List richiestaCliente; + } + + @Data + public static class RichiestaCliente { + private String codAbi; + private String codCab; + private Integer durataMesiFinanziamento; + private Integer idMotivazione; + private String idNota; + private String importoAgevolato; + private Double importoBreveTermine; + private String importoMedioLungoTermine; + private String codTipoProdotto; + private String codCategoriaProdotto; + private String codFormaTecnica; + private String codProdotto; + private String codOperazione; + private Nota nota; + } + + @Data + public static class Nota { + private String titolo; + private String testo; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentNdgRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentNdgRequest.java new file mode 100644 index 00000000..639c8b5d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentNdgRequest.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class AppointmentNdgRequest { + private Filter filter; + private Pagination pagination; + + @Data + public static class Filter { + private String partitaIva; + } + + @Data + public static class Pagination { + private int targetPage; + private int recordsPerPage; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentVisuraListRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentVisuraListRequest.java new file mode 100644 index 00000000..da5b8720 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentVisuraListRequest.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class AppointmentVisuraListRequest { + + private AppointmentVisuraListRequest.VisuraFilter filter; + + @Data + public static class VisuraFilter { + private String idVisura; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentVisuraRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentVisuraRequest.java new file mode 100644 index 00000000..59546ee6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentVisuraRequest.java @@ -0,0 +1,28 @@ +package net.gepafin.tendermanagement.model.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.Setter; + +@Data +public class AppointmentVisuraRequest { + private VisuraInput input; + + @Data + public static class VisuraInput { + private String codiceFiscale; + private String partitaIva; + private boolean creaAnagrafica; + private boolean salvaDocumenti; + private String visuraProvider; + private String visuraType; + private String visuraMode; + private String codArea; + private String codAgente; + @JsonProperty("isFromRating") + private boolean isFromRating; + @JsonProperty("isAnagraficaLegame") + private boolean isAnagraficaLegame; + } +} + diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateAppointmentRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateAppointmentRequest.java new file mode 100644 index 00000000..667ba581 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateAppointmentRequest.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class CreateAppointmentRequest { + private Double importoBreveTermine; + private Integer durataMesiFinanziamento; + private Nota nota; + + @Data + public static class Nota { + private String titolo; + + private String testo; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UploadDocToExternalSystemRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/UploadDocToExternalSystemRequest.java new file mode 100644 index 00000000..bd3a3097 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UploadDocToExternalSystemRequest.java @@ -0,0 +1,23 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class UploadDocToExternalSystemRequest { + private Input input; + + @Data + public static class Input { + private Long idTipoProtocollo; + private Long idClassificazione; + private Boolean flagDaFirmare; + private String descrizione; + private Attributes attributes; + + @Data + public static class Attributes { + private String ndg; + private String email; + } + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AppointmentCreationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AppointmentCreationResponse.java new file mode 100644 index 00000000..80dd3ba0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AppointmentCreationResponse.java @@ -0,0 +1,8 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class AppointmentCreationResponse { + private String appointmentId; +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AppointmentLoginResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AppointmentLoginResponse.java new file mode 100644 index 00000000..1d3b9c56 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AppointmentLoginResponse.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class AppointmentLoginResponse { + + private String tokenId; + private String areaCode; + private Long companyId; + private String codecFiscale; + private String vatNumber; + private String ndg; + private String message; + private String idVisura; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/DocumentUploadResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/DocumentUploadResponse.java new file mode 100644 index 00000000..956ef1cb --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/DocumentUploadResponse.java @@ -0,0 +1,8 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class DocumentUploadResponse { + private String documentAttachmentId; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/NdgResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/NdgResponse.java new file mode 100644 index 00000000..991828c5 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/NdgResponse.java @@ -0,0 +1,8 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class NdgResponse { + private String ndg; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java index cc54295a..e371d148 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java @@ -1,15 +1,17 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.HubEntity; - import java.util.Optional; - import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface HubRepository extends JpaRepository { - Optional findByUniqueUuid(String hubUuid); - + Optional findByUniqueUuid(String hubUuid); + + @Query("SELECT h FROM HubEntity h WHERE h.id = :hubId") + HubEntity findByHubId(@Param("hubId") Long hubId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/AppointmentService.java b/src/main/java/net/gepafin/tendermanagement/service/AppointmentService.java new file mode 100644 index 00000000..512014f3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/AppointmentService.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.CreateAppointmentRequest; +import net.gepafin.tendermanagement.model.request.UploadDocToExternalSystemRequest; +import net.gepafin.tendermanagement.model.response.AppointmentCreationResponse; +import net.gepafin.tendermanagement.model.response.DocumentUploadResponse; +import net.gepafin.tendermanagement.model.response.NdgResponse; + +public interface AppointmentService { + NdgResponse checkNdgForAppointment(HttpServletRequest request, Long applicationId); + + AppointmentCreationResponse createAppointmentForApplication(HttpServletRequest request, Long applicationId, CreateAppointmentRequest createAppointmentRequest); + + DocumentUploadResponse uploadDocToExternalSystem(HttpServletRequest request, Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest, Long applicationId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java new file mode 100644 index 00000000..b193713b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java @@ -0,0 +1,44 @@ +package net.gepafin.tendermanagement.service.feignClient; + +import net.gepafin.tendermanagement.constants.AppointmentApiConstant; +import net.gepafin.tendermanagement.model.request.AppointmentNdgRequest; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Map; + +@FeignClient(value = "appointment-api-service", url = "${appointment.base.url}") +public interface AppointmentApiService { + + @PostMapping(value = AppointmentApiConstant.ODESSA_LOGIN, consumes = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity loginWithOdessa(@RequestHeader("auth") String authToken, @RequestHeader("source") String source, @RequestHeader("context") String context, + @RequestHeader("user") String user, @RequestHeader("password") String password, @RequestBody(required = false) Map body); + + @PostMapping(value = AppointmentApiConstant.GET_NDG_BY_VAT_NUMBER, consumes = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity getNdgByVatNumber(@RequestBody AppointmentNdgRequest ndgRequest, @RequestHeader("Authorization") String token); + + @PostMapping(value = AppointmentApiConstant.CREATE_VISURA, consumes = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity createVisura(@RequestBody String visuraRequest, @RequestHeader("Authorization") String token); + + @GetMapping(value = AppointmentApiConstant.GET_VISURA_LIST, consumes = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity getVisuraList(@RequestBody String visuraRequest, @RequestHeader("Authorization") String token); + + @GetMapping(value = AppointmentApiConstant.GET_APPOINTMENT_TEMPLATE, consumes = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity getAppointmentTemplateForTemplateCreation(@RequestHeader("Authorization") String token); + + @PostMapping(value = AppointmentApiConstant.CREATE_APPOINTMENT_FROM_TEMPLATE, consumes = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity createAppointment(@RequestHeader("Authorization") String token, @RequestHeader("context") String context, String appointmentCreationRequest); + + @PostMapping(value = AppointmentApiConstant.UPLOAD_APOOINTMENT_DOCUMENT, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + ResponseEntity uploadDocumentToExternalSystemForAppointment(@RequestHeader("Authorization") String token, @RequestHeader("context") String context, + @RequestPart("input") String uploadDocumentRequest, @RequestPart("file") MultipartFile file); +} + + diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AppointmentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AppointmentServiceImpl.java new file mode 100644 index 00000000..f9c1ba85 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AppointmentServiceImpl.java @@ -0,0 +1,38 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.AppointmentDao; +import net.gepafin.tendermanagement.model.request.CreateAppointmentRequest; +import net.gepafin.tendermanagement.model.request.UploadDocToExternalSystemRequest; +import net.gepafin.tendermanagement.model.response.AppointmentCreationResponse; +import net.gepafin.tendermanagement.model.response.DocumentUploadResponse; +import net.gepafin.tendermanagement.model.response.NdgResponse; +import net.gepafin.tendermanagement.service.AppointmentService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class AppointmentServiceImpl implements AppointmentService { + + @Autowired + private AppointmentDao appointmentDao; + + @Override + public NdgResponse checkNdgForAppointment(HttpServletRequest request, Long applicationId) { + + return appointmentDao.checkNdgForAppointment(applicationId); + } + + @Override + public AppointmentCreationResponse createAppointmentForApplication(HttpServletRequest request, Long applicationId, CreateAppointmentRequest createAppointmentRequest) { + + return appointmentDao.createAppointment(applicationId, createAppointmentRequest); + } + + @Override + public DocumentUploadResponse uploadDocToExternalSystem(HttpServletRequest request, Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest, + Long applicationId) { + + return appointmentDao.uploadDocumentToExternalSystem(documentId, docToExternalSystemRequest, applicationId); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 7524c306..b7383161 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -51,6 +51,7 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.crypto.Cipher; +import javax.crypto.Mac; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; @@ -580,4 +581,35 @@ public class Utils { // Clear the RequestContextHolder after task execution RequestContextHolder.resetRequestAttributes(); } + + public static String generateAuthTokenForLoginToOdessa() { + + try { + // Your weak secret key + String secretKey = GepafinConstant.AUTH_JWT_SECRET_KEY; + + // Header + String header = GepafinConstant.JWT_ALGO_HEADER; + String encodedHeader = Base64.getUrlEncoder().withoutPadding().encodeToString(header.getBytes(StandardCharsets.UTF_8)); + + // Payload + String payload = "{\"iat\":" + (System.currentTimeMillis() / 1000) + "}"; + String encodedPayload = Base64.getUrlEncoder().withoutPadding().encodeToString(payload.getBytes(StandardCharsets.UTF_8)); + + // Combine header and payload + String dataToSign = encodedHeader + "." + encodedPayload; + + // Sign the token manually + Mac mac = Mac.getInstance(GepafinConstant.HMAC_ALGO); + SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), GepafinConstant.HMAC_ALGO); + mac.init(secretKeySpec); + byte[] signatureBytes = mac.doFinal(dataToSign.getBytes(StandardCharsets.UTF_8)); + String signature = Base64.getUrlEncoder().withoutPadding().encodeToString(signatureBytes); + + // Return the final JWT + return dataToSign + "." + signature; + } catch (Exception e) { + throw new RuntimeException("Failed to generate JWT token", e); + } + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/AppointmentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AppointmentApi.java new file mode 100644 index 00000000..04616f92 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AppointmentApi.java @@ -0,0 +1,60 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.CreateAppointmentRequest; +import net.gepafin.tendermanagement.model.request.UploadDocToExternalSystemRequest; +import net.gepafin.tendermanagement.model.response.AppointmentCreationResponse; +import net.gepafin.tendermanagement.model.response.DocumentUploadResponse; +import net.gepafin.tendermanagement.model.response.NdgResponse; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +public interface AppointmentApi { + + @Operation(summary = "API to check or create ndg.", responses = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/application/{applicationId}/check-ndg", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> checkNdgForAppointment(HttpServletRequest request, + @Parameter(description = "The application id", required = true) @PathVariable(value = "applicationId", required = true) Long applicationId); + + @Operation(summary = "API to create appointment.", responses = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PostMapping(value = "/application/{applicationId}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> createAppointment(HttpServletRequest request, + @Parameter(description = "The application id", required = true) @PathVariable(value = "applicationId", required = true) Long applicationId, + @RequestBody CreateAppointmentRequest createAppointmentRequest); + + @Operation(summary = "API to Upload document to external system.", responses = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PostMapping(value = "/application/{applicationId}/document/{documentId}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> uploadDocumentToExternalSystem(HttpServletRequest request, + @Parameter(description = "The document id", required = true) @PathVariable(value = "documentId", required = true) Long documentId, + @Parameter(description = "The application id", required = true) @PathVariable(value = "applicationId", required = true) Long applicationId, + @RequestBody UploadDocToExternalSystemRequest docToExternalSystemRequest); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java new file mode 100644 index 00000000..a8986626 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java @@ -0,0 +1,76 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.enums.UserActionLogsEnum; +import net.gepafin.tendermanagement.model.request.CreateAppointmentRequest; +import net.gepafin.tendermanagement.model.request.UploadDocToExternalSystemRequest; +import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.response.AppointmentCreationResponse; +import net.gepafin.tendermanagement.model.response.DocumentUploadResponse; +import net.gepafin.tendermanagement.model.response.NdgResponse; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.AppointmentService; +import net.gepafin.tendermanagement.util.LoggingUtil; +import net.gepafin.tendermanagement.web.rest.api.AppointmentApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/appointment}") +@Slf4j +public class AppointmentController implements AppointmentApi { + + @Autowired + private AppointmentService appointmentService; + + @Autowired + private LoggingUtil loggingUtil; + + @Override + public ResponseEntity> checkNdgForAppointment(HttpServletRequest request, Long applicationId) { + + /** This code is responsible for creating user action logs for the "checking or creating ndg" operation. **/ + loggingUtil.logUserAction( + UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT).actionContext(UserActionContextEnum.CHECK_OR_CREATE_NDG_CODE).build()); + + NdgResponse appointmentLoginResponse = appointmentService.checkNdgForAppointment(request, applicationId); + + return ResponseEntity.status(HttpStatus.OK).body(new Response<>(appointmentLoginResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.NDG_FETCH_SUCCESSFULLY))); + } + + @Override + public ResponseEntity> createAppointment(HttpServletRequest request, Long applicationId, + CreateAppointmentRequest createAppointmentRequest) { + + /** This code is responsible for creating user action logs for the "create appointment" operation. **/ + loggingUtil.logUserAction( + UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT).actionContext(UserActionContextEnum.CREATE_APPOINTMENT).build()); + + AppointmentCreationResponse appointmentCreationResponse = appointmentService.createAppointmentForApplication(request, applicationId, createAppointmentRequest); + + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(appointmentCreationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPOINTMENT_CREATED))); + } + + @Override + public ResponseEntity> uploadDocumentToExternalSystem(HttpServletRequest request, Long documentId, Long applicationId, + UploadDocToExternalSystemRequest docToExternalSystemRequest) { + + /** This code is responsible for creating user action logs for the "Upload document to external system" operation. **/ + loggingUtil.logUserAction( + UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPLOAD).actionContext(UserActionContextEnum.UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM).build()); + + DocumentUploadResponse documentUploadResponse = appointmentService.uploadDocToExternalSystem(request, documentId, docToExternalSystemRequest, applicationId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(documentUploadResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_UPLOADED_SUCCESSFULLY_TO_EXTERNAL_SYSTEM))); + + } +} diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 8fa5c7a6..f99634bc 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -15,3 +15,11 @@ gepafin_email=rinaldo.bonazzo@bflows.net rinaldo_email=rinaldo.bonazzo@bflows.net carlo_email=test@test.test default.hub.uuid=p4lk3bcx1RStqTaIVVbXs + +#Login to Odessa, Appointment Creation, Upload document Configuration +appointment.base.url=https://demo.galileonetwork.it/gateway/rest +appointment.portal.user=UtenzaAPIPortal@621 +appointment.portal.password=u13nzaAP1P0rtal +appointment.portal.source=GEPAFINPORTAL +appointment.portal.context=GEPAFINPORTAL +flagDaFirmare=false \ No newline at end of file diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 76aca344..37bcabad 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -13,4 +13,11 @@ default_System_Receiver_Email=test@test.test gepafin_email=test@test.test rinaldo_email=test@test.test carlo_email=test@test.test -default.hub.uuid=p4lk3bcx1RStqTaIVVbXs \ No newline at end of file +default.hub.uuid=p4lk3bcx1RStqTaIVVbXs + +appointment.base.url=https://demo.galileonetwork.it/gateway/rest +appointment.portal.user=UtenzaAPIPortal@621 +appointment.portal.password=u13nzaAP1P0rtal +appointment.portal.source=GEPAFINPORTAL +appointment.portal.context=GEPAFINPORTAL +flagDaFirmare=false \ No newline at end of file diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index b3704a3d..2007e166 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -22,3 +22,11 @@ rinaldo_email=rinaldo.bonazzo@bflows.net carlo_email=carlo.mancosu@bflows.net default.hub.uuid=p4lk3bcx1RStqTaIVVbXs # TEST DEPLOY Configuration + +#Login to Odessa, Appointment Creation, Upload document Configuration +appointment.base.url=https://demo.galileonetwork.it/gateway/rest +appointment.portal.user=UtenzaAPIPortal@621 +appointment.portal.password=u13nzaAP1P0rtal +appointment.portal.source=GEPAFINPORTAL +appointment.portal.context=GEPAFINPORTAL +flagDaFirmare=true \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index fb109ba7..60f61aec 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -65,3 +65,6 @@ default.email.signature=Gepafin S.p.a default.hub.pdf.banner=https://mementoresources.s3.amazonaws.com/gepafin/staging/template/gepafin-logo.jpg +#feign client config +spring.cloud.openfeign.client.config.default.connectTimeout=300000 +spring.cloud.openfeign.client.config.default.readTimeout=300000 \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 9c061c37..eb77049e 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 @@ -1972,5 +1972,24 @@ path="db/dump/update_system_email_template_for_updating_amendment_mail_notification_mail_04_12_2024_1.sql"/> + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index d6aa4578..7fee26b5 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -313,3 +313,22 @@ company.id.required.for.preferred.call=Company ID is required when requesting on response.days.not.null=Response days should not be null and greater than zero. application.cannot.approved.or.rejected=Application cannot be approved and rejected because amendment is active. + +#Appointment flow messages +ndg.generated = NDG Generated. +ndg.available = NDG Available. +ndg.generation.in.progress = NDG generation is in progress. +ndg.fetch.successfully = NDG fetch successfully. +appointment.already.created = Appointment Already Created. +ndg.not.found.for.this.application.or.invalid = Ndg not found for this application or invalid. +provide.valid.application.document.id = Provide valid application document id. +document.uploaded.successfully.to.external.system = Document uploaded successfully to external system. +error.in.uploading.document.check.input = Error in uploading document check input data or try again. +document.already.uploaded = Document already uploaded. +document.not.uploaded.to.external.system.please.try.again = Document not uploaded to external system, please try again. +ndg.not.found.or.not.matched = The provided NDG does not match the application NDG, or the NDG has not been generated. +ndg.generation.is.only.for.gepafin = NDG generation is only available for GEPAFIN Hub. +appointment.creation.is.only.for.gepafin = Appointment creation is only allowed for GEPAFIN Hub. +upload.document.is.only.for.gepafin = Document cant be uploaded, this is only available for GEPAFIN Hub. +appointment.created.successfully = Appointment created successfully. +error.try.again = Service call error while performing the operation. Please try again. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 051ed432..a380f93f 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -306,4 +306,22 @@ beneficiary.call.duplicate = Una chiamata preferita con questo ID di chiamata e user.must.be.associated.with.company.to.create.application=Devi essere associato a un'azienda per poter presentare domanda per questa applicazione. company.id.required.for.preferred.call=ID azienda obbligatorio quando si richiedono solo chiamate preferite. response.days.not.null=I giorni di risposta non devono essere nulli e maggiori di zero. -application.cannot.approved.or.rejected=La domanda non può essere approvata o rifiutata perché l'emendamento è attivo. +application.cannot.approved.or.rejected=La domanda non pu� essere approvata o rifiutata perch� l'emendamento � attivo. + +#Appointment flow messages +ndg.available = NDG disponibile. +ndg.generation.in.progress = La generazione NDG � in corso. +ndg.fetch.successfully = Recupero NDG riuscito. +appointment.already.created = Appuntamento gi� creato. +ndg.not.found.for.this.application.or.invalid = NDG non trovato per questa applicazione o non valido. +provide.valid.application.document.id = Fornisci un ID documento applicativo valido. +document.uploaded.successfully.to.external.system = Documento caricato con successo nel sistema esterno. +error.in.uploading.document.check.input = Errore nel caricamento del documento. Controlla i dati inseriti o riprova. +document.already.uploaded = Documento gi� caricato. +document.not.uploaded.to.external.system.please.try.again = Documento non caricato nel sistema esterno, riprova. +ndg.not.found.or.not.matched = L'NDG fornito non corrisponde all'NDG dell'applicazione o non � stato generato. +ndg.generation.is.only.for.gepafin = La generazione dell'NDG � disponibile solo per GEPAFIN. +appointment.creation.is.only.for.gepafin = La creazione degli appuntamenti � consentita solo per GEPAFIN. +upload.document.is.only.for.gepafin = Il documento non pu� essere caricato, questa operazione � disponibile solo per il Hub GEPAFIN. +appointment.created.successfully = Appuntamento creato con successo. +error.try.again = Errore di chiamata di servizio durante l'esecuzione dell'operazione. Riprovare. From 9151d1596928e0407087e09547471a49a1e71f21 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Thu, 5 Dec 2024 20:05:17 +0530 Subject: [PATCH 02/33] Added three more status for application on NDG, Appointment creation and Admissible. --- .../net/gepafin/tendermanagement/dao/ApplicationDao.java | 3 +++ .../net/gepafin/tendermanagement/dao/AppointmentDao.java | 5 +++++ .../tendermanagement/enums/ApplicationStatusTypeEnum.java | 5 ++++- 3 files changed, 12 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 e3726e41..7e37d9a5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -829,6 +829,9 @@ public class ApplicationDao { if (status.equals(ApplicationStatusTypeEnum.DRAFT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.AWAITING.getValue()))) { applicationEntity.setStatus(status.getValue()); } + if(status.equals(ApplicationStatusTypeEnum.ADMISSIBLE) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.APPOINTMENT.getValue()))){ + applicationEntity.setStatus(status.getValue()); + } applicationEntity = applicationRepository.save(applicationEntity); if (!status.equals(ApplicationStatusTypeEnum.SUBMIT)) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index dd8b970c..c78638b0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -14,6 +14,7 @@ import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.entities.HubEntity; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.AppointmentCreationRequest; @@ -192,6 +193,7 @@ public class AppointmentDao { ndgResponseToReturn.setNdg(application.getNdg()); } else if (visuraResponse.getIdVisura() != null) { application.setNdgStatus(GepafinConstant.NDG_IN_PROGRESS); + application.setStatus(ApplicationStatusTypeEnum.NDG.getValue()); applicationRepository.save(application); /** This code is responsible for adding a version history log for the "Updating ndg status in application" operation. **/ @@ -245,6 +247,7 @@ public class AppointmentDao { if (isNdgValid(ndg)) { company.setNdg(ndg); application.setNdgStatus(GepafinConstant.NDG_GENERATED); + application.setStatus(ApplicationStatusTypeEnum.NDG.getValue()); application.setNdg(ndg); applicationRepository.save(application); companyRepository.save(company); @@ -314,6 +317,7 @@ public class AppointmentDao { application.setNdg(ndg); application.setIdVisura(idVisura); application.setNdgStatus(GepafinConstant.NDG_GENERATED); + application.setStatus(ApplicationStatusTypeEnum.NDG.getValue()); company.setNdg(ndg); companyRepository.save(company); applicationRepository.save(application); @@ -631,6 +635,7 @@ public class AppointmentDao { if (appointmentId != null) { // Update application with the appointment ID application.setAppointmentId(appointmentId); + application.setStatus(ApplicationStatusTypeEnum.APPOINTMENT.getValue()); applicationRepository.save(application); // Log version history diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java index db6fe287..b6fd00b3 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java @@ -12,7 +12,10 @@ public enum ApplicationStatusTypeEnum { SOCCORSO("SOCCORSO"), APPROVED("APPROVED"), REJECTED("REJECTED"), - EVALUATION("EVALUATION"); + EVALUATION("EVALUATION"), + APPOINTMENT("APPOINTMENT"), + NDG("NDG"), + ADMISSIBLE("ADMISSIBLE"); private String value; From 1790bbf52b0cee742afd1914241c0903aa428638 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 5 Dec 2024 21:12:30 +0530 Subject: [PATCH 03/33] updated code for company delegation --- .../constants/GepafinConstant.java | 1 + .../tendermanagement/dao/DelegationDao.java | 33 ++++++++++++++++--- .../service/CompanyService.java | 2 +- .../service/impl/CompanyServiceImpl.java | 5 ++- .../web/rest/api/CompanyApi.java | 5 +-- .../rest/api/impl/CompanyApiController.java | 7 ++-- src/main/resources/message_en.properties | 2 ++ src/main/resources/message_it.properties | 1 + 8 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index dbf39e8f..d60b0da7 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -305,5 +305,6 @@ public class GepafinConstant { public static final String USER_ID = "userId"; public static final String LOGIN_ATTEMPT_ID = "loginAttemptId"; public static final String USER_ACTION_ID = "userActionId"; + public static final String ATLEAST_ONE_ID_REQUIRED="atleast.one.id.required"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index f5006e2f..17920473 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -5,13 +5,14 @@ import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; -import java.util.Optional; import java.util.function.Function; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; +import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; import net.gepafin.tendermanagement.repositories.UserWithCompanyRepository; +import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; @@ -82,6 +83,12 @@ public class DelegationDao { @Autowired private HttpServletRequest request; + @Autowired + private ApplicationService applicationService; + + @Autowired + private ApplicationEvaluationRepository applicationEvaluationRepository; + public ByteArrayOutputStream generateDocument(Map placeholders, String templateName) { try { String s3Folder = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.TEMPLATE, 0L, 0L,0L); @@ -257,10 +264,28 @@ public class DelegationDao { } } - public CompanyDelegationResponse getCompanyDelegation(UserEntity userEntity, Long companyId) { - UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyId); + public CompanyDelegationResponse getCompanyDelegation(HttpServletRequest request, Long companyId, Long applicationId) { + if(companyId==null && applicationId==null){ + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.ATLEAST_ONE_ID_REQUIRED)); + } + if(validator.checkIsPreInstructor()) { + ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElseThrow(()-> + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_EVALUATION_NOT_FOUND, companyId)); + + validator.validateUserWithCompany(); + } else { + validator.validateUserWithCompany(); + } + + Long userId=userEntity.getId(); + if(applicationId != null) { + ApplicationEntity application = applicationService.validateApplication(applicationId); + userId=application.getUserId(); + companyId=application.getCompanyId(); + } + UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userId,companyId); UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository - .findByUserIdAndUserWithCompanyIdAndStatus(userEntity.getId(), userWithCompanyEntity.getId(), + .findByUserIdAndUserWithCompanyIdAndStatus(userId, userWithCompanyEntity.getId(), UserCompanyDelegationStatusEnum.ACTIVE.getValue()); companyDao.getUserWithCompany(userEntity.getId(), companyId); if(userCompanyDelegationEntity == null) { diff --git a/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java b/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java index 2896419a..a1120587 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java @@ -38,7 +38,7 @@ public interface CompanyService { CompanyDelegationResponse uploadCompanyDelegation(HttpServletRequest request, Long companyId, MultipartFile file); - CompanyDelegationResponse getCompanyDelegation(HttpServletRequest request, Long companyId); + CompanyDelegationResponse getCompanyDelegation(HttpServletRequest request, Long companyId,Long applicationId); void deleteCompanyDelegation(HttpServletRequest request, Long companyId); UserWithCompanyEntity getUserWithCompanyEntity(Long userId,Long companyId); 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 3f5e326f..2bddb1cf 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java @@ -110,9 +110,8 @@ public class CompanyServiceImpl implements CompanyService { @Override @Transactional - public CompanyDelegationResponse getCompanyDelegation(HttpServletRequest request, Long companyId) { - UserEntity userEntity =validator.validateUser(request); - return delegationDao.getCompanyDelegation(userEntity, companyId); + public CompanyDelegationResponse getCompanyDelegation(HttpServletRequest request, Long companyId,Long applicationId) { + return delegationDao.getCompanyDelegation(request, companyId,applicationId); } @Override @Transactional(rollbackFor = Exception.class) diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java index bc016334..baf1671e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java @@ -128,9 +128,10 @@ public interface CompanyApi { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @GetMapping(value = "{companyId}/delegation", produces = { "application/json" }) + @GetMapping(value = "delegation", produces = { "application/json" }) ResponseEntity> getCompanyDelegation(HttpServletRequest request, - @Parameter(description = "The company id", required = true) @PathVariable("companyId") Long companyId); + @Parameter(description = "The company ID") @RequestParam(value = "companyId", required = false) Long companyId, + @Parameter(description = "The application ID") @RequestParam(value = "applicationId", required = false) Long applicationId); @Operation(summary = "Api to delete company delegation", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java index ef73e985..127edbe1 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java @@ -8,6 +8,7 @@ import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.util.LoggingUtil; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -152,13 +153,13 @@ public class CompanyApiController implements CompanyApi{ @Override public ResponseEntity> getCompanyDelegation(HttpServletRequest request, - Long companyId) { + Long companyId,Long applicationId) { log.info("get company delegation with companyId: {}", companyId); /** This code is responsible for creating user action logs for the "Get company delegation" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_COMPANY_DELEGATION).build()); - - CompanyDelegationResponse companyDelegationResponse = companyService.getCompanyDelegation(request, companyId); + + CompanyDelegationResponse companyDelegationResponse = companyService.getCompanyDelegation(request, companyId,applicationId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(companyDelegationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELEGATION_FETCH_SUCCESS))); } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index d6aa4578..68d7a49b 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -313,3 +313,5 @@ company.id.required.for.preferred.call=Company ID is required when requesting on response.days.not.null=Response days should not be null and greater than zero. application.cannot.approved.or.rejected=Application cannot be approved and rejected because amendment is active. + +atleast.one.id.required=At least one of companyId or applicationId must be provided \ No newline at end of file diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 051ed432..30ffc1ac 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -307,3 +307,4 @@ user.must.be.associated.with.company.to.create.application=Devi essere associato company.id.required.for.preferred.call=ID azienda obbligatorio quando si richiedono solo chiamate preferite. response.days.not.null=I giorni di risposta non devono essere nulli e maggiori di zero. application.cannot.approved.or.rejected=La domanda non può essere approvata o rifiutata perché l'emendamento è attivo. +atleast.one.id.required=Almeno uno tra companyId o applicationId deve essere fornito. \ No newline at end of file From 473669860bbc4815c9342e241c1a6fac54f05ab8 Mon Sep 17 00:00:00 2001 From: rajeshkhore Date: Thu, 5 Dec 2024 21:42:51 +0530 Subject: [PATCH 04/33] Added application protocol in amendement template --- .../gepafin/tendermanagement/dao/EmailNotificationDao.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 4bf99110..42eb2ee0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -152,9 +152,9 @@ public class EmailNotificationDao { ApplicationEntity applicationEntity = applicationService.validateApplication(applicationAmendmentRequestEntity.getApplicationId()); Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - bodyPlaceholders.put("{{protocol_number}}", applicationAmendmentRequestEntity.getProtocol().getProtocolNumber().toString()); - bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatLocalDateTime(applicationAmendmentRequestEntity.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY)); - bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationAmendmentRequestEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); + bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); + bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY)); + bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); bodyPlaceholders.put("{{response_days}}", applicationAmendmentRequestEntity.getResponseDays().toString()); try { From cbaf25801f1c214365992533f4acafe3c60d3e24 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 5 Dec 2024 22:12:24 +0530 Subject: [PATCH 05/33] updated code for get company delegation --- .../tendermanagement/dao/ApplicationDao.java | 12 ++++- .../dao/ApplicationEvaluationDao.java | 7 +++ .../tendermanagement/dao/DelegationDao.java | 46 ++++++++++--------- .../service/ApplicationEvaluationService.java | 2 + .../ApplicationEvaluationServiceImpl.java | 5 ++ 5 files changed, 49 insertions(+), 23 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index e3726e41..1240aa90 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -14,6 +14,7 @@ import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.AmazonS3Service; +import net.gepafin.tendermanagement.service.ApplicationEvaluationService; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.service.DocumentService; @@ -159,7 +160,7 @@ public class ApplicationDao { private HttpServletRequest request; @Autowired - private TokenProvider tokenProvider; + private ApplicationEvaluationService applicationEvaluationService; public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { FormEntity formEntity = formService.validateForm(formId); @@ -1110,7 +1111,14 @@ public class ApplicationDao { public ApplicationSignedDocumentResponse getSignedDocument(HttpServletRequest request, Long applicationId) { ApplicationEntity applicationEntity = validateApplication(applicationId); - validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); +// validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); + + if (validator.checkIsPreInstructor()) { + ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluationByApplicationId(applicationId); + validator.validatePreInstructor(request, applicationEvaluationEntity.getUserId()); + } else { + validator.validateUserId(request, applicationEntity.getUserId()); + } ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 7c25401b..b8fc0b35 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1396,5 +1396,12 @@ public class ApplicationEvaluationDao { } return null; } + + public ApplicationEvaluationEntity validateApplicationEvaluationByApplicationId(Long applicationId) { + return applicationEvaluationRepository + .findByApplicationIdAndIsDeletedFalse(applicationId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_EVALUATION_NOT_FOUND))); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index 17920473..670f9444 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -34,6 +34,7 @@ import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.repositories.UserCompanyDelegationRepository; import net.gepafin.tendermanagement.service.AmazonS3Service; +import net.gepafin.tendermanagement.service.ApplicationEvaluationService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; @@ -87,7 +88,7 @@ public class DelegationDao { private ApplicationService applicationService; @Autowired - private ApplicationEvaluationRepository applicationEvaluationRepository; + private ApplicationEvaluationService applicationEvaluationService; public ByteArrayOutputStream generateDocument(Map placeholders, String templateName) { try { @@ -265,29 +266,11 @@ public class DelegationDao { } public CompanyDelegationResponse getCompanyDelegation(HttpServletRequest request, Long companyId, Long applicationId) { - if(companyId==null && applicationId==null){ - throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.ATLEAST_ONE_ID_REQUIRED)); - } - if(validator.checkIsPreInstructor()) { - ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElseThrow(()-> - throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_EVALUATION_NOT_FOUND, companyId)); - - validator.validateUserWithCompany(); - } else { - validator.validateUserWithCompany(); - } - Long userId=userEntity.getId(); - if(applicationId != null) { - ApplicationEntity application = applicationService.validateApplication(applicationId); - userId=application.getUserId(); - companyId=application.getCompanyId(); - } - UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userId,companyId); + UserWithCompanyEntity userWithCompanyEntity= validateUserAndGetUserWithCompany(request, companyId, applicationId); UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository - .findByUserIdAndUserWithCompanyIdAndStatus(userId, userWithCompanyEntity.getId(), + .findByUserIdAndUserWithCompanyIdAndStatus(userWithCompanyEntity.getUserId(), userWithCompanyEntity.getId(), UserCompanyDelegationStatusEnum.ACTIVE.getValue()); - companyDao.getUserWithCompany(userEntity.getId(), companyId); if(userCompanyDelegationEntity == null) { throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DELEGATION_NOT_FOUND)); @@ -295,6 +278,27 @@ public class DelegationDao { return convertUserCompanyDelegationToCompanyDelegationResponse(userCompanyDelegationEntity); } + private UserWithCompanyEntity validateUserAndGetUserWithCompany(HttpServletRequest request, Long companyId, + Long applicationId) { + Long userId = null; + if (companyId == null && applicationId == null) { + throw new CustomValidationException(Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.ATLEAST_ONE_ID_REQUIRED)); + } + if (applicationId != null) { + ApplicationEntity application = applicationService.validateApplication(applicationId); + userId = application.getUserId(); + companyId = application.getCompanyId(); + } + if (validator.checkIsPreInstructor()) { + ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluationByApplicationId(applicationId); + validator.validatePreInstructor(request, applicationEvaluationEntity.getUserId()); + } else if (validator.checkIsBeneficiary()) { + userId = validator.validateUser(request).getId(); + } + return companyService.getUserWithCompany(userId, companyId); + } + public void deleteCompanyDelegation(UserEntity userEntity, Long companyId) { UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyId); UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index c9f72e6a..c7bde2db 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -16,4 +16,6 @@ public interface ApplicationEvaluationService { 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/ApplicationEvaluationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java index 30cdaf80..0a6feb1f 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -93,4 +93,9 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe public ApplicationEvaluationEntity validateApplicationEvaluation(Long applicationEvaluationId) { return applicationEvaluationDao.validateApplicationEvaluation(applicationEvaluationId); } + + @Override + public ApplicationEvaluationEntity validateApplicationEvaluationByApplicationId(Long applicationId) { + return applicationEvaluationDao.validateApplicationEvaluationByApplicationId(applicationId); + } } From 3f6475ba0ad520cd25ef72c6e2a1d5cae0f03b67 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 6 Dec 2024 12:49:07 +0530 Subject: [PATCH 06/33] Done ticket GEPAFINBE-122 --- .../dao/ApplicationEvaluationDao.java | 143 +++++++++++------- .../ApplicationEvaluationResponse.java | 2 + .../service/impl/AmazonS3ServiceImpl.java | 9 +- 3 files changed, 99 insertions(+), 55 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 7c25401b..72e114d1 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -12,10 +12,7 @@ import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; -import net.gepafin.tendermanagement.service.ApplicationService; -import net.gepafin.tendermanagement.service.AssignedApplicationsService; -import net.gepafin.tendermanagement.service.CallService; -import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.service.*; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.util.Utils; @@ -93,6 +90,9 @@ public class ApplicationEvaluationDao { @Autowired private HttpServletRequest request; + @Autowired + private CompanyService companyService; + private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); @@ -156,28 +156,32 @@ public class ApplicationEvaluationDao { private void setCriteriaResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List evaluationCriterias) { List criteriaResponsesFromEntity = entity.getCriteria() != null ? - Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { - }) : + Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() {}) : new ArrayList<>(); - List criteriaResponsesFromDB = getCriteriaResponse(entity.getApplicationId()); addMissingCriteriaResponses(criteriaResponsesFromEntity, criteriaResponsesFromDB, entity.getApplicationId()); - criteriaResponsesFromEntity.forEach(criteriaResponse -> { - EvaluationCriteriaEntity matchingEvaluationCriteria = evaluationCriterias.stream() - .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())).findFirst().orElse(null); - if (matchingEvaluationCriteria != null) { - criteriaResponse.setLabel(matchingEvaluationCriteria.getLookupData().getValue()); - criteriaResponse.setMaxScore(matchingEvaluationCriteria.getScore()); - - List mappedFields = getMappedFieldsForCriteria(matchingEvaluationCriteria.getId(), entity.getApplicationId()); - criteriaResponse.setCriteriaMappedFields(mappedFields); - } - }); + criteriaResponsesFromEntity = criteriaResponsesFromEntity.stream() + .filter(criteriaResponse -> { + EvaluationCriteriaEntity matchingEvaluationCriteria = evaluationCriterias.stream() + .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())) // Find matching criteria by ID + .findFirst() + .orElse(null); + if (matchingEvaluationCriteria != null) { + criteriaResponse.setLabel(matchingEvaluationCriteria.getLookupData().getValue()); + criteriaResponse.setMaxScore(matchingEvaluationCriteria.getScore()); + List mappedFields = getMappedFieldsForCriteria(matchingEvaluationCriteria.getId(), entity.getApplicationId()); + criteriaResponse.setCriteriaMappedFields(mappedFields); + return true; + } + return false; + }) + .collect(Collectors.toList()); response.setCriteria(criteriaResponsesFromEntity); } + private void addMissingCriteriaResponses(List criteriaResponsesFromEntity, List criteriaResponsesFromDB, Long applicationId) { Set existingCriteriaIds = criteriaResponsesFromEntity.stream().map(CriteriaResponse::getId).collect(Collectors.toSet()); @@ -299,27 +303,30 @@ public class ApplicationEvaluationDao { private void setChecklistResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List checklistEntities) { - List checklistResponsesFromEntity = entity.getChecklist() != null ? - Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() { - }) : + Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() {}) : new ArrayList<>(); - List checklistResponsesFromDB = getChecklistResponse(entity.getApplicationId()); addMissingChecklistResponses(checklistResponsesFromEntity, checklistResponsesFromDB); - checklistResponsesFromEntity.forEach(checklistResponse -> { - CallTargetAudienceChecklistEntity matchingChecklist = checklistEntities.stream().filter(checklistEntity -> checklistEntity.getId().equals(checklistResponse.getId())) - .findFirst().orElse(null); - - if (matchingChecklist != null) { - checklistResponse.setLabel(matchingChecklist.getLookupData().getValue()); - } - }); + checklistResponsesFromEntity = checklistResponsesFromEntity.stream() + .filter(checklistResponse -> { + CallTargetAudienceChecklistEntity matchingChecklist = checklistEntities.stream() + .filter(checklistEntity -> checklistEntity.getId().equals(checklistResponse.getId())) // Find matching checklist by ID + .findFirst() + .orElse(null); + if (matchingChecklist != null) { + checklistResponse.setLabel(matchingChecklist.getLookupData().getValue()); + return true; + } + return false; + }) + .collect(Collectors.toList()); response.setChecklist(checklistResponsesFromEntity); } + private void addMissingChecklistResponses(List checklistResponsesFromEntity, List checklistResponsesFromDB) { Set existingChecklistIds = checklistResponsesFromEntity.stream().map(ChecklistResponse::getId).collect(Collectors.toSet()); @@ -333,26 +340,31 @@ public class ApplicationEvaluationDao { private void setFieldResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List applicationFormEntities) { - List fieldResponsesFromEntity = entity.getFile() != null ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() { - }) : new ArrayList<>(); + List fieldResponsesFromEntity = entity.getFile() != null ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() {}) : new ArrayList<>(); List fieldResponsesFromDB = getFieldResponses(entity.getApplicationId()); addMissingFieldResponses(fieldResponsesFromEntity, fieldResponsesFromDB); Set processedFieldIds = new HashSet<>(); + List validFieldResponses = new ArrayList<>(); fieldResponsesFromEntity.forEach(fieldResponse -> { if (processedFieldIds.contains(fieldResponse.getId())) { return; } + final Boolean[] allDocumentsDeleted = {true}; + List documentResponseBeans = new ArrayList<>(); + applicationFormEntities.forEach(applicationForm -> { FormEntity formEntity = applicationForm.getForm(); if (formEntity != null) { -// List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); + // Convert the form to a list of content response beans List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); contentResponseBeans.forEach(contentResponseBean -> { + // Check if this is a file upload field that matches the current field response if ("fileupload".equals(contentResponseBean.getName()) && contentResponseBean.getId().equals(fieldResponse.getId())) { String label = null; + // Set the label if available if (contentResponseBean.getSettings() != null) { for (SettingResponseBean setting : contentResponseBean.getSettings()) { if ("label".equals(setting.getName())) { @@ -371,36 +383,43 @@ public class ApplicationEvaluationDao { ApplicationFormFieldEntity formField = optionalFormField.get(); if (formField.getFieldValue() != null) { String[] documentIds = formField.getFieldValue().split(","); - List documentResponseBeans = new ArrayList<>(); for (String docId : documentIds) { - if (Boolean.FALSE.equals(docId.isEmpty())){ + if (!docId.trim().isEmpty()) { Long documentId = Long.valueOf(docId.trim()); + documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { - DocumentResponseBean responseBean = new DocumentResponseBean(); - responseBean.setId(documentEntity.getId()); - responseBean.setName(documentEntity.getFileName()); - responseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); - responseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); - responseBean.setSourceId(documentEntity.getSourceId()); - responseBean.setFilePath(documentEntity.getFilePath()); - responseBean.setCreatedDate(documentEntity.getCreatedDate()); - responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); - documentResponseBeans.add(responseBean); + if (documentEntity != null && !documentEntity.getIsDeleted()) { + DocumentResponseBean responseBean = new DocumentResponseBean(); + responseBean.setId(documentEntity.getId()); + responseBean.setName(documentEntity.getFileName()); + responseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); + responseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); + responseBean.setSourceId(documentEntity.getSourceId()); + responseBean.setFilePath(documentEntity.getFilePath()); + responseBean.setCreatedDate(documentEntity.getCreatedDate()); + responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + documentResponseBeans.add(responseBean); + allDocumentsDeleted[0] = false; + } }); } } - - fieldResponse.setFileDetail(documentResponseBeans); } } - processedFieldIds.add(fieldResponse.getId()); } }); } }); + + if (Boolean.FALSE.equals(allDocumentsDeleted[0]) && Boolean.FALSE.equals(documentResponseBeans.isEmpty())) { + fieldResponse.setFileDetail(documentResponseBeans); + validFieldResponses.add(fieldResponse); + } + + processedFieldIds.add(fieldResponse.getId()); }); - response.setFiles(fieldResponsesFromEntity); + response.setFiles(validFieldResponses); } private void addMissingFieldResponses(List fieldResponsesFromEntity, List fieldResponsesFromDB) { @@ -417,6 +436,9 @@ public class ApplicationEvaluationDao { private void setApplicationDetails(ApplicationEvaluationResponse response, ApplicationEvaluationEntity entity) { ApplicationEntity application = applicationService.validateApplication(entity.getApplicationId() != null ? entity.getApplicationId() : null); + AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository + .findByApplicationIdAndIsDeletedFalse(entity.getApplicationId()).orElse(null); + UserEntity user = userService.validateUser(application.getUserId()); CallEntity call = callRepository.findCallEntityByApplicationId(entity.getApplicationId()); @@ -426,12 +448,21 @@ public class ApplicationEvaluationDao { String beneficiary = String.join(" ", firstName, lastName).trim(); response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); response.setBeneficiary(beneficiary); + response.setSubmissionDate(application.getSubmissionDate()); response.setMinScore(call.getThreshold() != null ? call.getThreshold() : null); response.setCallName(application.getCall().getName() != null ? application.getCall().getName() : null); response.setProtocolNumber((application.getProtocol() != null && application.getProtocol().getProtocolNumber() != null) ? application.getProtocol().getProtocolNumber() : null); - response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null); + if (assignedApplications != null) { + response.setAssignedAt(assignedApplications.getAssignedAt()); + } + response.setEvaluationEndDate(entity.getEndDate()); + LocalDateTime callEndDate = application.getCall().getEndDate(); response.setCallEndDate(callEndDate); + if (application.getCompanyId() != null) { + CompanyEntity company = companyService.validateCompany(application.getCompanyId()); + response.setCompanyName(company.getCompanyName()); + } } @@ -961,16 +992,24 @@ public class ApplicationEvaluationDao { private void setApplicationDetails(ApplicationEvaluationResponse response, Long applicationId, UserEntity user) { ApplicationEntity application = applicationService.validateApplication(applicationId); + AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository + .findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); userService.validateUser(application.getUserId()); String firstName = user.getFirstName() != null ? user.getFirstName() : ""; String lastName = user.getLastName() != null ? user.getLastName() : ""; String beneficiary = String.join(" ", firstName, lastName).trim(); response.setBeneficiary(beneficiary); - + response.setSubmissionDate(application.getSubmissionDate()); response.setCallName(application.getCall().getName() != null ? application.getCall().getName() : null); response.setProtocolNumber((application.getProtocol() != null && application.getProtocol().getProtocolNumber() != null) ? application.getProtocol().getProtocolNumber() : null); - response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null); + if (assignedApplications != null) { + response.setAssignedAt(assignedApplications.getAssignedAt()); + } + if (application.getCompanyId() != null) { + CompanyEntity company = companyService.validateCompany(application.getCompanyId()); + response.setCompanyName(company.getCompanyName()); + } } private Optional findFormFieldValue(Long applicationId, String formFieldId) { 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 8d144e50..3e5c3834 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -30,4 +30,6 @@ public class ApplicationEvaluationResponse { private LocalDateTime submissionDate; private LocalDateTime evaluationEndDate; private LocalDateTime callEndDate; + private String companyName; + private LocalDateTime assignedAt; } 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 3ff04c70..3af50f6c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -29,6 +29,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; +import java.net.URL; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -87,9 +88,11 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { if(Boolean.FALSE.equals(isTestProfileActivated())) { amazonS3.putObject(bucketName, path, inputStream, objectMetadata); } - path =s3Url + s3Folder +"/"+ fileName; - log.info("File '{}' uploaded successfully to Amazon S3 with URL: {}", fileName, path); - return path; + //getting actual encoded s3 file path + URL amazonS3Url = amazonS3.getUrl(bucketName, path); + String fileUrl = amazonS3Url.toString(); + log.info("File '{}' uploaded successfully to Amazon S3 with URL: {}", fileName, fileUrl); + return fileUrl; } @Override From f8be8992587d0c6aab79d9fc6667953d52ec64db Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 6 Dec 2024 15:35:47 +0530 Subject: [PATCH 07/33] Updated code --- .../tendermanagement/dao/ApplicationEvaluationDao.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 43440acb..72ba3ad2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -443,8 +443,8 @@ public class ApplicationEvaluationDao { CallEntity call = callRepository.findCallEntityByApplicationId(entity.getApplicationId()); - String firstName = user.getFirstName() != null ? user.getFirstName() : ""; - String lastName = user.getLastName() != null ? user.getLastName() : ""; + String firstName = user.getBeneficiary().getFirstName() != null ? user.getBeneficiary().getFirstName() : ""; + String lastName = user.getBeneficiary().getLastName() != null ? user.getBeneficiary().getLastName() : ""; String beneficiary = String.join(" ", firstName, lastName).trim(); response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); response.setBeneficiary(beneficiary); @@ -995,8 +995,9 @@ public class ApplicationEvaluationDao { AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository .findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); userService.validateUser(application.getUserId()); - String firstName = user.getFirstName() != null ? user.getFirstName() : ""; - String lastName = user.getLastName() != null ? user.getLastName() : ""; + + String firstName = user.getBeneficiary().getFirstName() != null ? user.getBeneficiary().getFirstName() : ""; + String lastName = user.getBeneficiary().getLastName() != null ? user.getBeneficiary().getLastName() : ""; String beneficiary = String.join(" ", firstName, lastName).trim(); response.setBeneficiary(beneficiary); From b1b4eec87eb6bcdfe30dbc99296b1fd69820d255 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Fri, 6 Dec 2024 18:51:57 +0530 Subject: [PATCH 08/33] Added ndg and appointmentId field in evaluation response and ndg status of failure. --- .../tendermanagement/constants/GepafinConstant.java | 1 + .../tendermanagement/dao/ApplicationEvaluationDao.java | 4 ++++ .../net/gepafin/tendermanagement/dao/AppointmentDao.java | 7 ++++++- .../model/response/ApplicationEvaluationResponse.java | 2 ++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 63be4b25..b553df9f 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -312,6 +312,7 @@ public class GepafinConstant { public static final String NDG_AVAILABLE = "ndg.available"; public static final String NDG_GENERATION_IS_IN_PROGRESS = "ndg.generation.in.progress"; public static final String NDG_GENERATED = "NDG_GENERATED"; + public static final String NDG_FAILED = "FAILED"; public static final String NDG_NOT_FOUND_FOR_APPLICATION = "ndg.not.found.for.this.application.or.invalid"; public static final String APPOINTMENT_ALREADY_CREATED = "appointment.already.created"; public static final String EXTERNAL_DOCUMENT_UPLOAD_FAILURE_MSG = "document.not.uploaded.to.external.system.please.try.again"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 72ba3ad2..4a10804f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -448,6 +448,8 @@ public class ApplicationEvaluationDao { String beneficiary = String.join(" ", firstName, lastName).trim(); response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); response.setBeneficiary(beneficiary); + response.setNdg(application.getNdg() != null ? application.getNdg() : null); + response.setAppointmentId(application.getAppointmentId() != null ? application.getAppointmentId() : null); response.setSubmissionDate(application.getSubmissionDate()); response.setMinScore(call.getThreshold() != null ? call.getThreshold() : null); response.setCallName(application.getCall().getName() != null ? application.getCall().getName() : null); @@ -1002,6 +1004,8 @@ public class ApplicationEvaluationDao { String beneficiary = String.join(" ", firstName, lastName).trim(); response.setBeneficiary(beneficiary); response.setSubmissionDate(application.getSubmissionDate()); + response.setNdg(application.getNdg() != null ? application.getNdg() : null); + response.setAppointmentId(application.getAppointmentId() != null ? application.getAppointmentId() : null); response.setCallName(application.getCall().getName() != null ? application.getCall().getName() : null); response.setProtocolNumber((application.getProtocol() != null && application.getProtocol().getProtocolNumber() != null) ? application.getProtocol().getProtocolNumber() : null); if (assignedApplications != null) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index 1a443313..ef594da5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -134,7 +134,7 @@ public class AppointmentDao { // Validate application, company, and hub ApplicationEntity application = applicationService.validateApplication(applicationId); if (application.getNdgStatus() != null && application.getNdgStatus().equalsIgnoreCase(GepafinConstant.NDG_IN_PROGRESS)) { - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.NDG_GENERATION_IS_IN_PROGRESS)); + throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.NDG_GENERATION_IS_IN_PROGRESS)); } //cloned for old application data ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(application); @@ -261,6 +261,11 @@ public class AppointmentDao { // Check if polling time has exceeded the limit if (System.currentTimeMillis() - startTime > TimeUnit.HOURS.toMillis(2)) { log.warn("Polling timed out for applicationId: {}", application.getId()); + // Mark NDG status as FAILED for this application + application.setNdgStatus(GepafinConstant.NDG_FAILED); + application.setStatus(ApplicationStatusTypeEnum.NDG.getValue()); + applicationRepository.save(application); + log.info("NDG status marked as FAILED for applicationId: {}", application.getId()); break; } 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 3e5c3834..ca3eaa71 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -32,4 +32,6 @@ public class ApplicationEvaluationResponse { private LocalDateTime callEndDate; private String companyName; private LocalDateTime assignedAt; + private String ndg; + private String appointmentId; } From 3c8efcdc26eaff3a2011733da7debae28167eaad Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 9 Dec 2024 12:31:27 +0530 Subject: [PATCH 09/33] Updated code --- .../gepafin/tendermanagement/dao/ApplicationEvaluationDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 4a10804f..a14e7f62 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -112,7 +112,7 @@ public class ApplicationEvaluationDao { entity.setRemainingDays(30L); entity.setSuspendedDays(0L); entity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - entity.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now().plusDays(30))); + entity.setEndDate(DateTimeUtil.DateServerToUTC(application.getSubmissionDate().plusDays(30))); entity.setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue()); return entity; } From 69979ee4a39f3d868a0678b15b34310334661a4b Mon Sep 17 00:00:00 2001 From: piyushkag Date: Mon, 9 Dec 2024 16:33:15 +0530 Subject: [PATCH 10/33] Added document attachment id in application evaluation response. --- .../dao/ApplicationAmendmentRequestDao.java | 1 + .../tendermanagement/dao/ApplicationEvaluationDao.java | 6 ++++++ .../model/response/DocumentResponseBean.java | 2 ++ 3 files changed, 9 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index c9c19708..41d43b1e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -397,6 +397,7 @@ public class ApplicationAmendmentRequestDao { responseBean.setFilePath(documentEntity.getFilePath()); responseBean.setCreatedDate(documentEntity.getCreatedDate()); responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + responseBean.setDocumentAttachmentId(documentEntity.getDocumentAttachmentId()); return responseBean; }) .toList(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index a14e7f62..924999f2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -286,6 +286,7 @@ public class ApplicationEvaluationDao { responseBean.setFilePath(documentEntity.getFilePath()); responseBean.setCreatedDate(documentEntity.getCreatedDate()); responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + responseBean.setDocumentAttachmentId(documentEntity.getDocumentAttachmentId()); documentResponseBeans.add(responseBean); }); } @@ -399,6 +400,7 @@ public class ApplicationEvaluationDao { responseBean.setFilePath(documentEntity.getFilePath()); responseBean.setCreatedDate(documentEntity.getCreatedDate()); responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + responseBean.setDocumentAttachmentId(documentEntity.getDocumentAttachmentId()); documentResponseBeans.add(responseBean); allDocumentsDeleted[0] = false; } @@ -902,6 +904,7 @@ public class ApplicationEvaluationDao { responseBean.setFilePath(documentEntity.getFilePath()); responseBean.setCreatedDate(documentEntity.getCreatedDate()); responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + responseBean.setDocumentAttachmentId(documentEntity.getDocumentAttachmentId()); return responseBean; } @@ -974,6 +977,7 @@ public class ApplicationEvaluationDao { responseBean.setFilePath(documentEntity.getFilePath()); responseBean.setCreatedDate(documentEntity.getCreatedDate()); responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + responseBean.setDocumentAttachmentId(documentEntity.getDocumentAttachmentId()); documentResponseBeans.add(responseBean); }); } @@ -1224,6 +1228,7 @@ public class ApplicationEvaluationDao { responseBean.setFilePath(documentEntity.getFilePath()); responseBean.setCreatedDate(documentEntity.getCreatedDate()); responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + responseBean.setDocumentAttachmentId(documentEntity.getDocumentAttachmentId()); return responseBean; } @@ -1350,6 +1355,7 @@ public class ApplicationEvaluationDao { responseBean.setFilePath(documentEntity.getFilePath()); responseBean.setCreatedDate(documentEntity.getCreatedDate()); responseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + responseBean.setDocumentAttachmentId(documentEntity.getDocumentAttachmentId()); documentResponseBeans.add(responseBean); }); } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/DocumentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/DocumentResponseBean.java index f5706b10..307c4982 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/DocumentResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/DocumentResponseBean.java @@ -25,4 +25,6 @@ public class DocumentResponseBean { private LocalDateTime createdDate; private LocalDateTime updatedDate; + + private String documentAttachmentId; } From 05f64af4047a0306401bcf2419fb115a5bbcb405 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Mon, 9 Dec 2024 19:27:54 +0530 Subject: [PATCH 11/33] Updated code for Ndg generation with async processing. --- .../tendermanagement/dao/AppointmentDao.java | 328 +++++++++--------- .../tendermanagement/util/LoggingUtil.java | 1 - .../gepafin/tendermanagement/util/Utils.java | 38 ++ src/main/resources/message_en.properties | 2 +- src/main/resources/message_it.properties | 2 +- 5 files changed, 197 insertions(+), 174 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index ef594da5..86a6aceb 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -129,82 +129,155 @@ public class AppointmentDao { public NdgResponse checkNdgForAppointment(Long applicationId) { + ApplicationEntity application = applicationService.validateApplication(applicationId); + NdgResponse ndgResponse = new NdgResponse(); + if (application.getNdgStatus() != null && application.getNdgStatus().equalsIgnoreCase(GepafinConstant.NDG_IN_PROGRESS)) { + throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.NDG_GENERATION_IS_IN_PROGRESS)); + } + + if (application.getNdgStatus() != null && application.getNdgStatus().equalsIgnoreCase(GepafinConstant.NDG_GENERATED) && application.getNdg() != null) { + ndgResponse.setNdg(application.getNdg()); + return ndgResponse; + } + + // Update application status + application.setNdgStatus(GepafinConstant.NDG_IN_PROGRESS); + applicationRepository.save(application); + + // Start async processing + startAsyncNdgProcessing(applicationId); + + throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.NDG_GENERATION_IS_IN_PROGRESS)); + } + + private void startAsyncNdgProcessing(Long applicationId) { + // Check if a thread is already running for this application + if (executorMap.containsKey(applicationId)) { + log.warn("Async processing already running for applicationId: {}", applicationId); + return; + } + + // Create a dedicated thread for asynchronous processing + ExecutorService executor = Executors.newSingleThreadExecutor(runnable -> { + Thread thread = new Thread(runnable); + thread.setName("AsyncNdgProcessing-" + applicationId); + return thread; + }); + executorMap.put(applicationId, executor); + + executor.submit(() -> { + try { + log.info("Starting async processing for applicationId: {}", applicationId); + processNdgGeneration(applicationId); + } catch (Exception e) { + log.error("Error in async NDG processing for applicationId: {}", applicationId, e); + } finally { + // Cleanup resources + ExecutorService executorToShutdown = executorMap.remove(applicationId); + if (executorToShutdown != null) { + executorToShutdown.shutdown(); + } + log.info("Async processing completed for applicationId: {}", applicationId); + } + }); + } + + private void processNdgGeneration(Long applicationId) { + // Validate application, company, and hub + ApplicationEntity application = applicationService.validateApplication(applicationId); + CompanyEntity company = companyService.validateCompany(application.getCompanyId()); + HubEntity hub = hubRepository.findByHubId(application.getHubId()); + + if (!hub.getUniqueUuid().equals(defaultHubUuid)) { + log.info("Ndg cannot be created for another Hub, it is default for Gepafin."); + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.NO_NDG_FOR_ANOTHER_HUB)); + } + try { - NdgResponse ndgResponseToReturn = new NdgResponse(); - // Validate application, company, and hub - ApplicationEntity application = applicationService.validateApplication(applicationId); - if (application.getNdgStatus() != null && application.getNdgStatus().equalsIgnoreCase(GepafinConstant.NDG_IN_PROGRESS)) { - throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.NDG_GENERATION_IS_IN_PROGRESS)); - } - //cloned for old application data - ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(application); - - CompanyEntity company = companyService.validateCompany(application.getCompanyId()); - HubEntity hub = hubRepository.findByHubId(application.getHubId()); - - if (!hub.getUniqueUuid().equals(defaultHubUuid)) { - log.info("Ndg cannot be created for another Hub, it is default for Gepafin."); - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.NO_NDG_FOR_ANOTHER_HUB)); - } - - // Check if NDG and idVisura are already present - if (isNdgAndIdVisuraPresent(application)) { - log.info("NDG already exist for applicationId: {}", applicationId); - ndgResponseToReturn.setNdg(application.getNdg()); - return ndgResponseToReturn; - } - // Authenticate and fetch token if required - if (hub.getAppointmentAuthTokenId() == null && hub.getAreaCode() == null) { - hub = authenticateAndSaveToken(hub); + if (hub.getAppointmentAuthTokenId() == null || hub.getAreaCode() == null) { + authenticateAndSaveToken(hub); } String authorizationToken = getBearerToken(hub); // Try retrieving NDG by VAT number AppointmentLoginResponse ndgResponse = retrieveNdgByVatNumber(company.getVatNumber(), authorizationToken, hub, application); - //For testing purpose Commenting it if (isNdgValid(ndgResponse.getNdg())) { saveNdgAndIdVisura(application, company, ndgResponse.getNdg(), null); - ndgResponseToReturn.setNdg(application.getNdg()); - return ndgResponseToReturn; + log.info("NDG successfully generated for applicationId: {}", applicationId); + } else { + // If NDG isn't immediately available, start polling + handleNdgPolling(application, company, hub, authorizationToken); } - - return getNdgResponse(company, authorizationToken, hub, application, ndgResponseToReturn, oldApplicationData); - } catch (FeignException e) { - log.error("Error in feign client call during NDG handling: {}", e.getMessage(), e); - Utils.callException(e.status(), e); - } catch (CustomValidationException e) { - log.info("Custom validation exception: {}", e.getMessage()); - throw e; } catch (Exception e) { - log.error("Error during NDG handling: {}", e.getMessage(), e); - throw new RuntimeException("Error during fetching NDG."); + log.error("Error during NDG generation for applicationId: {}", applicationId, e); } - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.ERROR_IN_GENERATING_NDG_TRY_AGAIN)); } - private NdgResponse getNdgResponse(CompanyEntity company, String authorizationToken, HubEntity hub, ApplicationEntity application, NdgResponse ndgResponseToReturn, - ApplicationEntity oldApplicationData) { - // Create Visura if NDG is not found - AppointmentLoginResponse visuraResponse = createVisura(company, authorizationToken, hub); - if (isNdgValid(visuraResponse.getNdg())) { - saveNdgAndIdVisura(application, company, visuraResponse.getNdg(), visuraResponse.getIdVisura()); - ndgResponseToReturn.setNdg(application.getNdg()); - } else if (visuraResponse.getIdVisura() != null) { - application.setNdgStatus(GepafinConstant.NDG_IN_PROGRESS); - application.setStatus(ApplicationStatusTypeEnum.NDG.getValue()); - applicationRepository.save(application); + private void handleNdgPolling(ApplicationEntity application, CompanyEntity company, HubEntity hub, String authorizationToken) { - /** This code is responsible for adding a version history log for the "Updating ndg status in application" operation. **/ - loggingUtil.addVersionHistory( - VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData).newData(application).build()); + try { + log.info("Starting NDG polling for applicationId: {}", application.getId()); + long startTime = System.currentTimeMillis(); - startNdgPollingTask(application, company, hub); - throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.NDG_GENERATION_IS_IN_PROGRESS)); + while (true) { + if (application.getNdg() != null) { + log.info("NDG retrieved for applicationId: {}", application.getId()); + break; + } + + try { + // Fetch Visura list and attempt to parse NDG + String visuraListJson = getVisuraList(application.getIdVisura(), authorizationToken, application, hub); + String ndg = parseNdgFromVisuraListResponse(visuraListJson); + + if (isNdgValid(ndg)) { + // CompanyEntity oldCompanyData = Utils.getClonedEntityForData(company); + // ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(application); + + company.setNdg(ndg); + application.setNdg(ndg); + application.setNdgStatus(GepafinConstant.NDG_GENERATED); + application.setStatus(ApplicationStatusTypeEnum.NDG.getValue()); + applicationRepository.save(application); + companyRepository.save(company); + log.info("NDG saved successfully for applicationId: {}", application.getId()); + + // /** This code is responsible for adding a version history log for the "update application ndg code, status, and Id visura" + // operation. **/ + // loggingUtil.addVersionHistory( + // VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData) + // .newData(application).build()); + // + // /** This code is responsible for adding a version history log for the "update company ndg code" operation. **/ + // loggingUtil.addVersionHistory( + // VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyData) + // .newData(company).build()); + break; + } + + // Check if polling has timed out + if (System.currentTimeMillis() - startTime > TimeUnit.HOURS.toMillis(2)) { + log.warn("NDG polling timed out for applicationId: {}", application.getId()); + application.setNdgStatus(GepafinConstant.NDG_FAILED); + applicationRepository.save(application); + break; + } + + // Wait before the next polling attempt + Thread.sleep(TimeUnit.MINUTES.toMillis(15)); + } catch (InterruptedException e) { + log.warn("NDG polling interrupted for applicationId: {}", application.getId()); + Thread.currentThread().interrupt(); + break; + } catch (Exception e) { + log.error("Error during NDG polling for applicationId: {}", application.getId(), e); + } + } + } finally { + log.info("NDG polling completed for applicationId: {}", application.getId()); } - - return ndgResponseToReturn; } private static String getBearerToken(HubEntity hub) { @@ -212,102 +285,6 @@ public class AppointmentDao { return "Bearer " + hub.getAppointmentAuthTokenId(); } - private void startNdgPollingTask(ApplicationEntity application, CompanyEntity company, HubEntity hub) { - //cloned for all data - ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(application); - CompanyEntity oldCompanyData = Utils.getClonedEntityForData(company); - - // Check if a thread is already running for this application - if (executorMap.containsKey(application.getId())) { - log.warn("Polling task already running for applicationId: {}", application.getId()); - return; - } - - // Create a dedicated thread (single-threaded executor) for this application - ExecutorService executor = Executors.newSingleThreadExecutor(runnable -> { - Thread thread = new Thread(runnable); - thread.setName(GepafinConstant.POLLING_THREAD_NAME + application.getId()); - return thread; - }); - executorMap.put(application.getId(), executor); - - // Submit polling task to this thread - executor.submit(() -> { - try { - log.info("Polling task started for applicationId: {} on thread: {}", application.getId(), Thread.currentThread().getName()); - long startTime = System.currentTimeMillis(); - - while (true) { - if (application.getNdg() != null) - break; - try { - String visuraListJson = getVisuraList(application.getIdVisura(), hub.getAppointmentAuthTokenId(), application, hub); - String ndg = parseNdgFromVisuraListResponse(visuraListJson); - - if (isNdgValid(ndg)) { - company.setNdg(ndg); - application.setNdgStatus(GepafinConstant.NDG_GENERATED); - application.setStatus(ApplicationStatusTypeEnum.NDG.getValue()); - application.setNdg(ndg); - applicationRepository.save(application); - companyRepository.save(company); - - log.info("NDG obtained for applicationId: {} and saved successfully.", application.getId()); - break; // Exit the loop after successful NDG retrieval - } else { - log.warn("NDG not found for applicationId: {} in Visura List API response.", application.getId()); - } - - // Check if polling time has exceeded the limit - if (System.currentTimeMillis() - startTime > TimeUnit.HOURS.toMillis(2)) { - log.warn("Polling timed out for applicationId: {}", application.getId()); - // Mark NDG status as FAILED for this application - application.setNdgStatus(GepafinConstant.NDG_FAILED); - application.setStatus(ApplicationStatusTypeEnum.NDG.getValue()); - applicationRepository.save(application); - log.info("NDG status marked as FAILED for applicationId: {}", application.getId()); - break; - } - - // Wait before the next polling attempt - Thread.sleep(TimeUnit.MINUTES.toMillis(15)); - - } catch (InterruptedException e) { - log.warn("Polling task interrupted for applicationId: {}", application.getId()); - Thread.currentThread().interrupt(); - break; - } catch (Exception e) { - log.error("Error during NDG polling for applicationId: {}", application.getId(), e); - } - } - } finally { - // Cleanup: Shut down the thread for this application - executor.shutdown(); - executorMap.remove(application.getId()); - log.info("Polling task completed and thread shut down for applicationId: {}", application.getId()); - } - }); - /** This code is responsible for adding a version history log for the "Update application ndgCode and ndgStatus" operation. **/ - loggingUtil.addVersionHistory( - VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData).newData(application).build()); - - /** This code is responsible for adding a version history log for the "Update company ndgCode" operation. **/ - loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyData).newData(company).build()); - } - - private boolean isNdgAndIdVisuraPresent(ApplicationEntity application) { - - String ndg = application.getNdg(); - String idVisura = application.getIdVisura(); - - if (ndg != null && idVisura == null) { - return true; - } else if (ndg == null && idVisura != null) { - return false; - } else - return ndg != null; - } - private boolean isNdgValid(String ndg) { return ndg != null && !ndg.isEmpty(); @@ -316,8 +293,8 @@ public class AppointmentDao { private void saveNdgAndIdVisura(ApplicationEntity application, CompanyEntity company, String ndg, String idVisura) { //cloned for old application and company data - ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(application); - CompanyEntity oldCompanyData = Utils.getClonedEntityForData(company); + // ApplicationEntity oldApplicationData = Utils.getClonedEntityForData(application); + // CompanyEntity oldCompanyData = Utils.getClonedEntityForData(company); application.setNdg(ndg); application.setIdVisura(idVisura); @@ -327,12 +304,13 @@ public class AppointmentDao { companyRepository.save(company); applicationRepository.save(application); - /** This code is responsible for adding a version history log for the "update application ndg code, status, and Id visura" operation. **/ - loggingUtil.addVersionHistory( - VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData).newData(application).build()); - - /** This code is responsible for adding a version history log for the "update company ndg code" operation. **/ - loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyData).newData(company).build()); + // /** This code is responsible for adding a version history log for the "update application ndg code, status, and Id visura" operation. **/ + // loggingUtil.addVersionHistory( + // VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData).newData(application).build()); + // + // /** This code is responsible for adding a version history log for the "update company ndg code" operation. **/ + // loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCompanyData).newData + // (company).build()); log.info("NDG saved for applicationId: {}, {}", application.getId(), application.getNdg()); } @@ -361,7 +339,7 @@ public class AppointmentDao { private HubEntity authenticateAndSaveToken(HubEntity hub) { - HubEntity oldHubData = Utils.getClonedEntityForData(hub); + // HubEntity oldHubData = Utils.getClonedEntityForData(hub); try { //code to generate token with payload having "iat" epoch timestamp and secret key with no expiry and send in below method call String authJwtToken = Utils.generateAuthTokenForLoginToOdessa(); @@ -369,8 +347,9 @@ public class AppointmentDao { hub.setAuthToken(authJwtToken); hubRepository.save(hub); - /** This code is responsible for adding a version history log for the "Updating auth token for login api in hub" operation. **/ - loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldHubData).newData(hub).build()); + // /** This code is responsible for adding a version history log for the "Updating auth token for login api in hub" operation. **/ + // loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldHubData).newData + // (hub).build()); // Prepare the request body (adjust if necessary for login API) Map body = Collections.emptyMap(); @@ -389,10 +368,12 @@ public class AppointmentDao { hub.setAreaCode(parsedResponse.getAreaCode()); hubRepository.save(hub); - /** This code is responsible for adding a version history log for the "inserting token and areaCode from login odessa response for appointment flow api's" - * operation. **/ - loggingUtil.addVersionHistory( - VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldHubData).newData(hub).build()); + // /** This code is responsible for adding a version history log for the "inserting token and areaCode from login odessa response for + // appointment flow api's" + // * operation. **/ + // loggingUtil.addVersionHistory( + // VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldHubData).newData(hub) + // .build()); log.info("Saved new authToken and areaCode for Hub."); return hub; @@ -419,7 +400,7 @@ public class AppointmentDao { // Parse and return the NDG response return parseNdgResponse(responseJson); } catch (FeignException.Forbidden forbiddenException) { - log.error("403 Forbidden received while retrieving NDG. Regenerating token..."); + logForbiddenError(); // Regenerate the token and retry String newAuthorizationToken = regenerateTokenAndSave(hub); return retrieveNdgByVatNumber(vatNumber, newAuthorizationToken, hub, application); @@ -448,7 +429,7 @@ public class AppointmentDao { String responseJson = Utils.convertObjectToJson(response.getBody()); return parseVisuraResponse(responseJson); } catch (FeignException.Forbidden forbiddenException) { - log.error("403 Forbidden received while retrieving NDG. Regenerating token..."); + logForbiddenError(); // Regenerate the token and retry String newAuthorizationToken = regenerateTokenAndSave(hub); return createVisura(company, newAuthorizationToken, hub); @@ -458,6 +439,11 @@ public class AppointmentDao { } } + private static void logForbiddenError() { + + log.error("403 Forbidden received while retrieving NDG. Regenerating token..."); + } + private static AppointmentNdgRequest getAppointmentNdgRequest(String vatNumber) { AppointmentNdgRequest request = new AppointmentNdgRequest(); diff --git a/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java b/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java index 319795ec..e2ab4521 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java +++ b/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java @@ -9,7 +9,6 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.UserActionEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.entities.VersionHistoryEntity; -import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; import net.gepafin.tendermanagement.repositories.UserActionsRepository; diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index b7383161..a560b29d 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -60,6 +60,9 @@ import static org.apache.commons.lang3.StringUtils.isEmpty; public class Utils { +// @Autowired +// private static TokenProvider tokenProvider; + public static final Logger log = LoggerFactory.getLogger(Utils.class); private static final ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule()).configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) @@ -612,4 +615,39 @@ public class Utils { throw new RuntimeException("Failed to generate JWT token", e); } } + +// public static void setHttpServletRequestForNdgProcess(HttpServletRequest originalRequest) { +// +// // Validate original request +// if (originalRequest == null) { +// throw new IllegalArgumentException("Original request cannot be null."); +// } +// +// // Create a mock request +// Claims tokenClaims = tokenProvider.getClaimsFromToken(tokenProvider.extractTokenFromRequest(originalRequest)); +// MockHttpServletRequest mockRequest = new MockHttpServletRequest(); +// mockRequest.setRequestURI(originalRequest.getRequestURI()); +// mockRequest.setMethod(originalRequest.getMethod()); +// +// // Copy essential headers and attributes from the original request +// Enumeration headerNames = originalRequest.getHeaderNames(); +// while (headerNames.hasMoreElements()) { +// String headerName = headerNames.nextElement(); +// String headerValue = originalRequest.getHeader(headerName); +// if (headerValue != null) { +// mockRequest.addHeader(headerName, headerValue); +// } +// } +// +// // Set a specific attribute if required +// if (originalRequest.getAttribute(GepafinConstant.USER_ACTION_ID) != null) { +// mockRequest.setAttribute(GepafinConstant.USER_ACTION_ID, originalRequest.getAttribute(GepafinConstant.USER_ACTION_ID)); +// } +// +// ServletRequestAttributes attributes = new ServletRequestAttributes(mockRequest); +// RequestContextHolder.setRequestAttributes(attributes); +// // Log successful context setting +// log.info("Successfully set mock request for NDG process with URI: {}", mockRequest.getRequestURI()); +// } + } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index ad5a3282..487c8d95 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -320,7 +320,7 @@ atleast.one.id.required=At least one of companyId or applicationId must be provi ndg.generated = NDG Generated. ndg.available = NDG Available. ndg.generation.in.progress = NDG generation is in progress. -ndg.fetch.successfully = NDG fetch successfully. +ndg.fetch.successfully = NDG fetched successfully. appointment.already.created = Appointment Already Created. ndg.not.found.for.this.application.or.invalid = Ndg not found for this application or invalid. provide.valid.application.document.id = Provide valid application document id. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index c7d29ceb..ac8b75d9 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -310,7 +310,7 @@ atleast.one.id.required=Almeno uno tra companyId o applicationId deve essere for #Appointment flow messages ndg.available = NDG disponibile. ndg.generation.in.progress = La generazione NDG ? in corso. -ndg.fetch.successfully = Recupero NDG riuscito. +ndg.fetch.successfully = NDG recuperato con successo. appointment.already.created = Appuntamento gi? creato. ndg.not.found.for.this.application.or.invalid = NDG non trovato per questa applicazione o non valido. provide.valid.application.document.id = Fornisci un ID documento applicativo valido. From 2a5f344ea0fdeab800e099c43b12d145dfc62632 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Tue, 10 Dec 2024 12:47:11 +0530 Subject: [PATCH 12/33] Added async loading for document uploading to external system. --- .../constants/GepafinConstant.java | 2 + .../tendermanagement/dao/AppointmentDao.java | 117 +++++++++++------- .../service/AppointmentService.java | 2 +- .../service/impl/AppointmentServiceImpl.java | 5 +- .../gepafin/tendermanagement/util/Utils.java | 21 +++- .../web/rest/api/AppointmentApi.java | 3 +- .../rest/api/impl/AppointmentController.java | 4 +- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 9 files changed, 100 insertions(+), 56 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index b553df9f..14d82b91 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -339,5 +339,7 @@ public class GepafinConstant { public static final String HMAC_ALGO = "HmacSHA256"; public static final String ERROR_IN_GENERATING_NDG_TRY_AGAIN = "error.try.again"; public static final String POLLING_THREAD_NAME = "Ndg-Polling-Thread-"; + public static final String DOCUMENT_UPLOADING_IN_PROGRESS = "document.uploading.is.in.progress"; + public static final String ASYNC_DOCUMENT_UPLOAD_NAME = "AsyncDocumentUpload-"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index 86a6aceb..1b644d6e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -5,9 +5,11 @@ import com.amazonaws.services.s3.model.GetObjectRequest; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import feign.FeignException; +import io.jsonwebtoken.Claims; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.AppointmentApiConstant; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.ApplicationEntity; @@ -125,8 +127,15 @@ public class AppointmentDao { @Autowired private LoggingUtil loggingUtil; + @Autowired + private TokenProvider tokenProvider; + private final Map executorMap = new ConcurrentHashMap<>(); + private final ConcurrentHashMap threadForDocumentMap = new ConcurrentHashMap<>(); + + private static final ThreadLocal threadLocalHubId = new ThreadLocal<>(); + public NdgResponse checkNdgForAppointment(Long applicationId) { ApplicationEntity application = applicationService.validateApplication(applicationId); @@ -719,87 +728,101 @@ public class AppointmentDao { return appointmentCreationRequest; } - public DocumentUploadResponse uploadDocumentToExternalSystem(Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest, Long applicationId) { - - DocumentUploadResponse response = new DocumentUploadResponse(); + public DocumentUploadResponse uploadDocumentToExternalSystem(Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest) { + // Check if the document is already being processed DocumentEntity systemDoc = documentDao.validateDocument(documentId); - ApplicationEntity application = getApplicationEntityForDocument(applicationId, systemDoc); - - //cloned for old document data - DocumentEntity oldDocumentEntity = Utils.getClonedEntityForData(systemDoc); - - if (!docToExternalSystemRequest.getInput().getAttributes().getNdg().equalsIgnoreCase(application.getNdg())) { - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.NDG_NOT_MATCHED_OR_NOT_FOUND)); + Claims claims = tokenProvider.getClaimsFromToken(tokenProvider.extractTokenFromRequest(request)); + Long hubId = Utils.extractHubIdFromPayload(claims.getSubject()); + if (systemDoc.getDocumentAttachmentId() != null) { + // If the documentAttachmentId is already set, return the response + log.info("Document already uploaded with documentAttachmentId: {}", systemDoc.getDocumentAttachmentId()); + DocumentUploadResponse response = new DocumentUploadResponse(); + response.setDocumentAttachmentId(systemDoc.getDocumentAttachmentId()); + return response; } + // Check if a thread is already running for this document upload + if (threadForDocumentMap.containsKey(documentId)) { + log.warn("Document upload already running for documentId: {}", documentId); + throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_UPLOADING_IN_PROGRESS)); + } + // Start the upload process in the background + ExecutorService executor = Executors.newSingleThreadExecutor(runnable -> { + Thread thread = new Thread(runnable); + thread.setName(GepafinConstant.ASYNC_DOCUMENT_UPLOAD_NAME + documentId); + return thread; + }); + threadForDocumentMap.put(documentId, executor); - Long hubId = application.getHubId(); + executor.submit(() -> { + threadLocalHubId.set(hubId); + try { + log.info("Starting async document upload for documentId: {}", documentId); + uploadDocumentToExternalSystemSync(documentId, docToExternalSystemRequest); + } catch (Exception e) { + log.error("Error in async document upload for documentId: {}", documentId, e); + } finally { + // Cleanup resources + ExecutorService executorToShutdown = threadForDocumentMap.remove(documentId); + if (executorToShutdown != null) { + executorToShutdown.shutdown(); + threadLocalHubId.remove(); + } + log.info("Async document upload completed for documentId: {}", documentId); + } + }); + // Return an immediate response indicating the process is in progress + throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_UPLOADING_IN_PROGRESS)); + } + + private void uploadDocumentToExternalSystemSync(Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest) { + // Synchronous upload logic + DocumentEntity systemDoc = documentDao.validateDocument(documentId); + + Long hubId = threadLocalHubId.get(); HubEntity hub = hubRepository.findByHubId(hubId); if (!hub.getUniqueUuid().equals(defaultHubUuid)) { log.info("Document cannot be uploaded for another Hub, it is default for Gepafin."); throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.NO_DOCUMENT_UPLOAD_FOR_ANOTHER_HUB)); } - log.info("Got Document in system {}", systemDoc); + log.info("Got Document in system: {}", systemDoc); String oldUrl = systemDoc.getFilePath(); - log.info("Processing {}", oldUrl); - String authorizationToken = getBearerToken(hub); + try { File localFile = downloadFileFromS3(oldUrl); MultipartFile multipartFile = convertFileToMultipartFile(localFile); UploadDocToExternalSystemRequest externalSystemRequest = new UploadDocToExternalSystemRequest(); - - UploadDocToExternalSystemRequest.Input input = getUploadDocumentInput(docToExternalSystemRequest); - externalSystemRequest.setInput(input); + externalSystemRequest.setInput(getUploadDocumentInput(docToExternalSystemRequest)); String uploadDocRequest = Utils.convertObjectToJson(externalSystemRequest); ResponseEntity uploadedDocumentData = appointmentApiService.uploadDocumentToExternalSystemForAppointment(authorizationToken, context, uploadDocRequest, multipartFile); - String responseData = Utils.convertObjectToJson(uploadedDocumentData.getBody()); - DocumentUploadResponse parsedDocumentUploadResponse = parseDocumentUploadResponse(responseData); - if (parsedDocumentUploadResponse == null) { + String responseData = Utils.convertObjectToJson(uploadedDocumentData.getBody()); + DocumentUploadResponse parsedResponse = parseDocumentUploadResponse(responseData); + + if (parsedResponse == null) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.ERROR_UPLOADING_DOCUMENT)); } - systemDoc.setDocumentAttachmentId(parsedDocumentUploadResponse.getDocumentAttachmentId()); + // Save the documentAttachmentId to the database + systemDoc.setDocumentAttachmentId(parsedResponse.getDocumentAttachmentId()); documentRepository.save(systemDoc); - /** This code is responsible for adding a version history log for the "Update document with document attachment id" operation. **/ - loggingUtil.addVersionHistory( - VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldDocumentEntity).newData(systemDoc).build()); - - log.info("Document uploaded successfully to external system : {}", parsedDocumentUploadResponse); - response.setDocumentAttachmentId(systemDoc.getDocumentAttachmentId()); - return response; + log.info("Document uploaded successfully to external system: {}", parsedResponse); } catch (FeignException.Forbidden forbiddenException) { - log.error("403 Forbidden received while uploading document to external system. Regenerating token..."); - + log.error("403 Forbidden received while uploading document. Regenerating token..."); regenerateTokenAndSave(hub); - return uploadDocumentToExternalSystem(systemDoc.getSourceId(), docToExternalSystemRequest, applicationId); + uploadDocumentToExternalSystemSync(documentId, docToExternalSystemRequest); } catch (Exception e) { - log.error("Exception in uploading document to external system {}", e.getMessage()); + log.error("Exception during document upload: {}", e.getMessage(), e); throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.EXTERNAL_DOCUMENT_UPLOAD_FAILURE_MSG)); } } - private ApplicationEntity getApplicationEntityForDocument(Long applicationId, DocumentEntity systemDoc) { - - if (systemDoc.getDocumentAttachmentId() != null) { - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.DOCUMENT_ALREADY_UPLOADED)); - } - - ApplicationEntity application; - - if (systemDoc.getSource().equalsIgnoreCase(DocumentSourceTypeEnum.APPLICATION.getValue()) && Objects.equals(systemDoc.getSourceId(), applicationId)) { - application = applicationService.validateApplication(systemDoc.getSourceId()); - } else { - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.PROVIDE_VALID_APPLICATION_DOC_ID)); - } - return application; - } private UploadDocToExternalSystemRequest.Input getUploadDocumentInput(UploadDocToExternalSystemRequest docToExternalSystemRequest) { diff --git a/src/main/java/net/gepafin/tendermanagement/service/AppointmentService.java b/src/main/java/net/gepafin/tendermanagement/service/AppointmentService.java index 512014f3..842901a4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AppointmentService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AppointmentService.java @@ -12,5 +12,5 @@ public interface AppointmentService { AppointmentCreationResponse createAppointmentForApplication(HttpServletRequest request, Long applicationId, CreateAppointmentRequest createAppointmentRequest); - DocumentUploadResponse uploadDocToExternalSystem(HttpServletRequest request, Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest, Long applicationId); + DocumentUploadResponse uploadDocToExternalSystem(HttpServletRequest request, Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AppointmentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AppointmentServiceImpl.java index f9c1ba85..2e7960df 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AppointmentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AppointmentServiceImpl.java @@ -30,9 +30,8 @@ public class AppointmentServiceImpl implements AppointmentService { } @Override - public DocumentUploadResponse uploadDocToExternalSystem(HttpServletRequest request, Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest, - Long applicationId) { + public DocumentUploadResponse uploadDocToExternalSystem(HttpServletRequest request, Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest) { - return appointmentDao.uploadDocumentToExternalSystem(documentId, docToExternalSystemRequest, applicationId); + return appointmentDao.uploadDocumentToExternalSystem(documentId, docToExternalSystemRequest); } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index a560b29d..e93c8ed9 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -19,12 +19,15 @@ import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.node.ObjectNode; +import io.jsonwebtoken.Claims; import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import org.apache.commons.collections4.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -650,4 +653,20 @@ public class Utils { // log.info("Successfully set mock request for NDG process with URI: {}", mockRequest.getRequestURI()); // } -} + public static Long extractHubIdFromPayload(String payload) { + + Long hubId; + try { + String[] parts = payload.split(":"); + if (parts.length > 2) { + hubId = Long.valueOf(parts[2]); + return hubId; + } else { + hubId = null; + } + } catch (Exception e) { + throw new RuntimeException("No Hub id present in payload", e); + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/AppointmentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AppointmentApi.java index 04616f92..5507492a 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/AppointmentApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AppointmentApi.java @@ -52,9 +52,8 @@ public interface AppointmentApi { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PostMapping(value = "/application/{applicationId}/document/{documentId}", produces = MediaType.APPLICATION_JSON_VALUE) + @PostMapping(value = "/document/{documentId}", produces = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> uploadDocumentToExternalSystem(HttpServletRequest request, @Parameter(description = "The document id", required = true) @PathVariable(value = "documentId", required = true) Long documentId, - @Parameter(description = "The application id", required = true) @PathVariable(value = "applicationId", required = true) Long applicationId, @RequestBody UploadDocToExternalSystemRequest docToExternalSystemRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java index a8986626..ca55e55f 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java @@ -61,14 +61,14 @@ public class AppointmentController implements AppointmentApi { } @Override - public ResponseEntity> uploadDocumentToExternalSystem(HttpServletRequest request, Long documentId, Long applicationId, + public ResponseEntity> uploadDocumentToExternalSystem(HttpServletRequest request, Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest) { /** This code is responsible for creating user action logs for the "Upload document to external system" operation. **/ loggingUtil.logUserAction( UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPLOAD).actionContext(UserActionContextEnum.UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM).build()); - DocumentUploadResponse documentUploadResponse = appointmentService.uploadDocToExternalSystem(request, documentId, docToExternalSystemRequest, applicationId); + DocumentUploadResponse documentUploadResponse = appointmentService.uploadDocToExternalSystem(request, documentId, docToExternalSystemRequest); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(documentUploadResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_UPLOADED_SUCCESSFULLY_TO_EXTERNAL_SYSTEM))); diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 487c8d95..24150081 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -334,3 +334,4 @@ appointment.creation.is.only.for.gepafin = Appointment creation is only allowed upload.document.is.only.for.gepafin = Document cant be uploaded, this is only available for GEPAFIN Hub. appointment.created.successfully = Appointment created successfully. error.try.again = Service call error while performing the operation. Please try again. +document.uploading.is.in.progress = Document uploading is in progress. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index ac8b75d9..084fe6aa 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -324,3 +324,4 @@ appointment.creation.is.only.for.gepafin = La creazione degli appuntamenti ? con upload.document.is.only.for.gepafin = Il documento non pu? essere caricato, questa operazione ? disponibile solo per il Hub GEPAFIN. appointment.created.successfully = Appuntamento creato con successo. error.try.again = Errore di chiamata di servizio durante l'esecuzione dell'operazione. Riprovare. +document.uploading.is.in.progress = Il documento è in fase di caricamento. From 3937fb76f1b044e89a80c724c0ba1be406fd5f6f Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 12 Dec 2024 11:42:51 +0530 Subject: [PATCH 13/33] Code for amendment module --- .../constants/GepafinConstant.java | 1 + .../dao/ApplicationAmendmentRequestDao.java | 73 +++++++++++++++++-- .../tendermanagement/dao/ApplicationDao.java | 2 +- .../dao/ApplicationEvaluationDao.java | 2 +- .../tendermanagement/dao/ProtocolDao.java | 8 +- .../ApplicationAmendmentRequestEntity.java | 3 + .../entities/ProtocolEntity.java | 3 + .../enums/ProtocolTypeEnum.java | 24 ++++++ .../model/request/AmendmentFieldRequest.java | 13 ++++ .../request/ApplicationAmendmentRequest.java | 1 + .../ApplicationAmendmentRequestBean.java | 1 + .../response/AmendmentDocumentResponse.java | 12 +++ .../ApplicationAmendmentRequestResponse.java | 1 + .../db/changelog/db.changelog-1.0.0.xml | 9 ++- src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 16 files changed, 145 insertions(+), 10 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/ProtocolTypeEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFieldRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 14d82b91..42a9cd41 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -341,5 +341,6 @@ public class GepafinConstant { public static final String POLLING_THREAD_NAME = "Ndg-Polling-Thread-"; public static final String DOCUMENT_UPLOADING_IN_PROGRESS = "document.uploading.is.in.progress"; public static final String ASYNC_DOCUMENT_UPLOAD_NAME = "AsyncDocumentUpload-"; + public static final String All_DOCUMENT_CHECKED_AND_ONE_CHECKLIST_CHECKED="all.document.checked.and.one.checklist.checked"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 41d43b1e..72f540f7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -105,12 +105,33 @@ public class ApplicationAmendmentRequestDao { @Autowired private AssignedApplicationsDao assignedApplicationsDao; + @Autowired + private ApplicationEvaluationDao applicationEvaluationDao; + public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(Long applicationEvaluationId) { log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); Long applicationId = applicationEvaluationEntity.getApplicationId(); - ApplicationEntity application = applicationService.validateApplication(applicationId); + List evaluationFileRequests=new ArrayList<>(); + List checklistRequests=new ArrayList<>(); + ApplicationEntity application = applicationService.validateApplication(applicationId); + String file=applicationEvaluationEntity.getFile(); + String checkList=applicationEvaluationEntity.getChecklist(); + if(file != null){ + evaluationFileRequests=Utils.convertJsonStringToList(file,FieldRequest.class); + } + Boolean allValid = evaluationFileRequests.stream() + .anyMatch(fieldRequest -> fieldRequest.getValid() == null); + if(checkList != null) { + checklistRequests=Utils.convertJsonStringToList(checkList,ChecklistRequest.class); + } + boolean resultCheckList = checklistRequests.stream() + .anyMatch(checklistRequest -> Boolean.TRUE.equals(checklistRequest.getValid())) ? false : true; + + if(Boolean.TRUE.equals(allValid) || Boolean.TRUE.equals(resultCheckList)){ + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.All_DOCUMENT_CHECKED_AND_ONE_CHECKLIST_CHECKED)); + } // Set common application-level details String callName = application.getCall().getName(); Long protocolNumber = (application.getProtocol() != null && application.getProtocol().getProtocolNumber() != null) @@ -135,11 +156,18 @@ public class ApplicationAmendmentRequestDao { List forms = applicationFormRepository.findByApplicationId(applicationId); List allFormFields = new ArrayList<>(); - + Map fieldRequestMap = evaluationFileRequests.stream() + .collect(Collectors.toMap(FieldRequest::getId, fieldRequest -> fieldRequest)); for (ApplicationFormEntity form : forms) { String content = form.getForm().getContent(); List> result = filterByName(content, "fileupload"); - allFormFields.addAll(getIdAndLabelFromResult(result)); + List amendmentFormFieldResponses= getIdAndLabelFromResult(result); + amendmentFormFieldResponses.removeIf(amendmentFormFieldResponse -> { + FieldRequest matchingRequest = fieldRequestMap.get(amendmentFormFieldResponse.getFieldId()); + // Remove if no matching FieldRequest exists or if valid is true + return matchingRequest == null || Boolean.TRUE.equals(matchingRequest.getValid()); + }); + allFormFields.addAll(amendmentFormFieldResponses); } response.setFormFields(allFormFields); @@ -243,6 +271,9 @@ public class ApplicationAmendmentRequestDao { String formFieldsJson = Utils.convertObjectToJson(formFieldRequestBean); applicationAmendmentRequestEntity.setFormFields(formFieldsJson); } + if(Boolean.FALSE.equals(applicationAmendmentRequest.getAmendmentDocument().isEmpty())) { + setAmendmentDocuments(applicationAmendmentRequest.getAmendmentDocument(), applicationAmendmentRequestEntity); + } List amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(applicationEvaluationEntity.getId()); // Ensure startDate and initialDays are not null to avoid NullPointerException if (amendmentRequest !=null && amendmentRequest.isEmpty() && applicationEvaluationEntity.getStartDate() != null && applicationEvaluationEntity.getInitialDays() != null ) { @@ -261,7 +292,7 @@ public class ApplicationAmendmentRequestDao { Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub()); ProtocolEntity protocolEntity = protocolDao.createProtocolEntity( applicationEvaluationEntity.getAssignedApplicationsEntity().getApplication(), protocolNumber, - userEntity.getHub().getId()); + userEntity.getHub().getId(),false); applicationAmendmentRequestEntity.setProtocol(protocolEntity); ApplicationAmendmentRequestEntity applicationAmendment = saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity, null, VersionActionTypeEnum.INSERT); String evaluationStatusType = applicationEvaluationEntity.getStatus(); @@ -302,6 +333,16 @@ public class ApplicationAmendmentRequestDao { return applicationAmendment; } + private void setAmendmentDocuments(List amendmentFieldRequest, ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity) { + amendmentFieldRequest.stream().forEach(amendmentData->{ + String fieldValue=amendmentData.getFileValue(); + if(fieldValue!=null){ + documentService.validateDocument(Long.valueOf(fieldValue)); + } + }); + applicationAmendmentRequestEntity.setAmendmentDocument(Utils.convertListToJsonString(amendmentFieldRequest)); + } + public ApplicationAmendmentRequestEntity saveApplicationAmendmentRequestEntity(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity,ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity,VersionActionTypeEnum actionTypeEnum) { ApplicationAmendmentRequestEntity applicationAmendmentRequest = applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); @@ -320,12 +361,31 @@ public class ApplicationAmendmentRequestDao { List amendmentFormFields = Utils.convertJsonStringToList( applicationAmendmentRequestEntity.getFormFields(), AmendmentFormField.class); Map formFieldEntityMap = getApplicationFormFieldEntityMap(applicationAmendmentRequestEntity, amendmentFormFields); - + List amendmentFieldRequests = Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(),AmendmentFieldRequest.class); + if (amendmentFieldRequests != null) { + List amendmentDocumentResponses = amendmentFieldRequests.stream() + .map(this::createAmendmentDocumentResponse) + .toList(); + response.setAmendmentDocuments(amendmentDocumentResponses); + } processFormFields(amendmentFormFields, fieldIdToLabelMap, formFieldEntityMap, response); return response; } + private AmendmentDocumentResponse createAmendmentDocumentResponse(AmendmentFieldRequest amendmentFieldRequest) { + AmendmentDocumentResponse amendmentDocumentResponse = new AmendmentDocumentResponse(); + amendmentDocumentResponse.setFieldId(amendmentFieldRequest.getFieldId()); + amendmentDocumentResponse.setNameValue(amendmentFieldRequest.getNameValue()); + amendmentDocumentResponse.setIsValid(amendmentFieldRequest.getIsValid()); + + DocumentEntity documentEntity = documentService.validateDocument(Long.valueOf(amendmentFieldRequest.getFileValue())); + DocumentResponseBean responseBean = applicationEvaluationDao.createDocumentResponseBean(documentEntity); + amendmentDocumentResponse.setFileValue(responseBean); + + return amendmentDocumentResponse; + } + private ApplicationAmendmentRequestResponse initializeBasicResponse(ApplicationAmendmentRequestEntity entity) { ApplicationAmendmentRequestResponse response = new ApplicationAmendmentRequestResponse(); response.setId(entity.getId()); @@ -519,6 +579,7 @@ public class ApplicationAmendmentRequestDao { } existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + setAmendmentDocuments(updateRequest.getAmendmentDocuments(),existingApplicationAmendment); ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment,oldApplicationAmendmentEntity,VersionActionTypeEnum.UPDATE); ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment); log.info("Application Amendment updated successfully: {}", response); @@ -585,7 +646,7 @@ public class ApplicationAmendmentRequestDao { String fieldId) { AmendmentFormField amendmentFormField = amendmentFormFieldMap.get(fieldId); if (amendmentFormField == null) { - throw new CustomValidationException(Status.BAD_REQUEST, GepafinConstant.APPLICATION_FORM_FIELD_NOT_FOUND); + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_FORM_FIELD_NOT_FOUND)); } return amendmentFormField; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index dbccf3b3..203b4f3c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -813,7 +813,7 @@ public class ApplicationDao { if (status.equals(ApplicationStatusTypeEnum.SUBMIT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.READY.getValue()))) { callService.validatePublishedCall(applicationEntity.getCall().getId(), userEntity.getHub().getId()); Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub()); - ProtocolEntity protocolEntity = protocolDao.createProtocolEntity(applicationEntity, protocolNumber, userEntity.getHub().getId()); + ProtocolEntity protocolEntity = protocolDao.createProtocolEntity(applicationEntity, protocolNumber, userEntity.getHub().getId(),true); applicationEntity.setProtocol(protocolEntity); applicationEntity.setStatus(ApplicationStatusTypeEnum.SUBMIT.getValue()); applicationEntity.setSubmissionDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 924999f2..11562a11 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -894,7 +894,7 @@ public class ApplicationEvaluationDao { } - private DocumentResponseBean createDocumentResponseBean(DocumentEntity documentEntity) { + public DocumentResponseBean createDocumentResponseBean(DocumentEntity documentEntity) { DocumentResponseBean responseBean = new DocumentResponseBean(); responseBean.setId(documentEntity.getId()); responseBean.setName(documentEntity.getFileName()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java index a7606c9a..4601ef8c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java @@ -4,6 +4,7 @@ import java.time.LocalDateTime; import java.time.LocalTime; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.enums.ProtocolTypeEnum; import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; import net.gepafin.tendermanagement.util.LoggingUtil; @@ -42,7 +43,7 @@ public class ProtocolDao { return (maxProtocolNumber != null) ? maxProtocolNumber + 1 : startNumber; } - public ProtocolEntity createProtocolEntity(ApplicationEntity applicationEntity,Long protocolNumber, Long hubId){ + public ProtocolEntity createProtocolEntity(ApplicationEntity applicationEntity,Long protocolNumber, Long hubId,Boolean isForApplication){ ProtocolEntity protocolEntity=new ProtocolEntity(); protocolEntity.setCall(applicationEntity.getCall().getId()); LocalDateTime utcDateTime = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); @@ -51,6 +52,11 @@ public class ProtocolDao { protocolEntity.setTime(LocalTime.now()); protocolEntity.setApplicationId(applicationEntity.getId()); protocolEntity.setHubId(hubId); + if(Boolean.TRUE.equals(isForApplication)){ + protocolEntity.setType(ProtocolTypeEnum.INPUT.getValue()); + }else { + protocolEntity.setType(ProtocolTypeEnum.OUTPUT.getValue()); + } protocolRepository.save(protocolEntity); /** This code is responsible for adding a version history log for "create protocol" operation. **/ diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java index 4b3fe79c..8a8701a1 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java @@ -50,4 +50,7 @@ public class ApplicationAmendmentRequestEntity extends BaseEntity { @Column(name = "end_date") private LocalDateTime endDate; + @Column(name = "amendment_document") + private String amendmentDocument; + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java index ad57c1ee..47dc5065 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java @@ -28,4 +28,7 @@ public class ProtocolEntity extends BaseEntity { @Column(name="HUB_ID") private Long hubId; + @Column(name = "type") + private String type; + } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ProtocolTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ProtocolTypeEnum.java new file mode 100644 index 00000000..f890fb42 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/ProtocolTypeEnum.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum ProtocolTypeEnum { + INPUT("INPUT"), + OUTPUT("OUTPUT"); + + private String value; + + ProtocolTypeEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFieldRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFieldRequest.java new file mode 100644 index 00000000..99de2df0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFieldRequest.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class AmendmentFieldRequest { + + private String fieldId; + private String nameValue; + private String fileValue; + private Boolean isValid = false; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java index ade4c676..97e74446 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java @@ -11,4 +11,5 @@ public class ApplicationAmendmentRequest { private Long responseDays; private Boolean isSendNotification; private Boolean isSendEmail; + private List amendmentDocument; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java index 94141ef0..6973254d 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java @@ -8,4 +8,5 @@ import lombok.Data; public class ApplicationAmendmentRequestBean { private String note; private List applicationFormFields; + private List amendmentDocuments; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java new file mode 100644 index 00000000..7fb1b220 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class AmendmentDocumentResponse { + + private String fieldId; + private String nameValue; + private DocumentResponseBean fileValue; + private Boolean isValid = false; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java index 5523098e..0f77f602 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java @@ -21,6 +21,7 @@ public class ApplicationAmendmentRequestResponse { private String beneficiaryName; private List formFields; private List applicationFormFields; + private List amendmentDocuments; private Long applicationId; private Long applicationEvaluationId; private LocalDateTime evaluationEndDate; 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 eb77049e..607b22b3 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 @@ -1991,5 +1991,12 @@ - + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 24150081..974162f9 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -335,3 +335,4 @@ upload.document.is.only.for.gepafin = Document cant be uploaded, this is only av appointment.created.successfully = Appointment created successfully. error.try.again = Service call error while performing the operation. Please try again. document.uploading.is.in.progress = Document uploading is in progress. +all.document.checked.and.one.checklist.checked=All document should be checked and at least one checklist should be checked. \ No newline at end of file diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 084fe6aa..97390d1d 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -325,3 +325,4 @@ upload.document.is.only.for.gepafin = Il documento non pu? essere caricato, ques appointment.created.successfully = Appuntamento creato con successo. error.try.again = Errore di chiamata di servizio durante l'esecuzione dell'operazione. Riprovare. document.uploading.is.in.progress = Il documento è in fase di caricamento. +all.document.checked.and.one.checklist.checked=Tutti i documenti devono essere controllati e almeno una checklist deve essere controllata. \ No newline at end of file From e97b12e1f703157506c9bfc5cbae10d087e8c1aa Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 12 Dec 2024 14:47:30 +0530 Subject: [PATCH 14/33] Done changes related to evaluation document --- .../tendermanagement/dao/ApplicationDao.java | 6 +- .../dao/ApplicationEvaluationDao.java | 145 +++++++++++++++--- .../gepafin/tendermanagement/dao/CallDao.java | 2 +- .../tendermanagement/dao/DelegationDao.java | 2 +- .../tendermanagement/dao/DocumentDao.java | 45 ++++-- .../tendermanagement/dao/S3PathConfig.java | 4 +- .../entities/ApplicationEvaluationEntity.java | 4 + .../entities/DocumentEntity.java | 3 + .../enums/DocOtherSourceTypeEnum.java | 1 + .../enums/DocumentSourceTypeEnum.java | 2 +- .../enums/UserActionContextEnum.java | 1 + .../request/EvaluationDocumentRequest.java | 15 ++ .../ApplicationEvaluationResponse.java | 1 + .../response/EvaluationDocumentResponse.java | 12 ++ ...ApplicationAmendmentRequestRepository.java | 2 +- .../ApplicationEvaluationRepository.java | 7 + .../repositories/ApplicationRepository.java | 2 +- .../service/ApplicationEvaluationService.java | 6 +- .../service/DocumentService.java | 2 +- .../ApplicationEvaluationServiceImpl.java | 44 ++---- .../service/impl/DocumentServiceImpl.java | 11 +- .../impl/S3ReUploadMigrationService.java | 22 ++- .../UserSignedAndDelegationServiceImpl.java | 2 +- .../tendermanagement/util/Validator.java | 2 +- .../rest/api/ApplicationEvaluationApi.java | 20 ++- .../ApplicationEvaluationApiController.java | 15 +- .../rest/api/impl/DocumentApiController.java | 2 +- .../db/changelog/db.changelog-1.0.0.xml | 28 ++++ 28 files changed, 316 insertions(+), 92 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/EvaluationDocumentRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/EvaluationDocumentResponse.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index dbccf3b3..a1af4ab8 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1080,7 +1080,7 @@ public class ApplicationDao { } private String generateS3PathForDelegation(Long callId, Long applicationId) { try { - return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, callId, applicationId,0L); + return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, callId, applicationId,0L,0L); } catch (IllegalArgumentException e) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); } @@ -1244,7 +1244,7 @@ public class ApplicationDao { try (ByteArrayOutputStream zipOutputStream = new ByteArrayOutputStream(); ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) { - String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.APPLICATION, applicationEntity.getCall().getId(), applicationId,0L); + String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.APPLICATION, applicationEntity.getCall().getId(), applicationId,0L,0L); for (DocumentEntity document : documents) { String fileName = Utils.extractFileName(document.getFilePath()); @@ -1252,7 +1252,7 @@ public class ApplicationDao { } if (signedDocument != null) { - String signedDocS3Folder = s3PathConfig.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, applicationEntity.getCall().getId(), applicationId,0L); + String signedDocS3Folder = s3PathConfig.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, applicationEntity.getCall().getId(), applicationId,0L,0L); String signedDocFileName = signedDocument.getFileName(); addDocumentToZip(zos, signedDocS3Folder, signedDocument.getFilePath(), signedDocFileName); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index a14e7f62..31dad3f2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1,8 +1,8 @@ package net.gepafin.tendermanagement.dao; +import com.amazonaws.services.dynamodbv2.xspec.L; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; @@ -16,6 +16,7 @@ import net.gepafin.tendermanagement.service.*; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -27,7 +28,6 @@ import java.util.*; import java.util.stream.Collectors; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; -import static org.apache.commons.lang3.StringUtils.isNumeric; @Component public class ApplicationEvaluationDao { @@ -93,6 +93,12 @@ public class ApplicationEvaluationDao { @Autowired private CompanyService companyService; + @Autowired + private Validator validator; + + @Autowired + private DocumentService documentService; + private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); @@ -132,11 +138,42 @@ public class ApplicationEvaluationDao { setCriteriaResponses(entity, response, evaluationCriterias); setChecklistResponses(entity, response, checklistEntities); setFieldResponses(entity, response, applicationFormEntities); - + List allDocs = prepareEvaluationDocumentBeanList(entity); + setEvaluationDocResponse(response, allDocs); setApplicationDetails(response, entity); return response; } + private void setEvaluationDocResponse(ApplicationEvaluationResponse response, List docRequest) { + List evaluationDocResponses = new ArrayList<>(); + + for (EvaluationDocumentRequest doc : docRequest) { + EvaluationDocumentResponse evaluationDocResponse = new EvaluationDocumentResponse(); + if (doc.getFileValue() != null) { + Long fileId = Long.valueOf(doc.getFileValue().toString()); + documentRepository.findByIdAndNotDeleted(fileId).ifPresent(documentEntity -> { + DocumentResponseBean documentResponseBean = new DocumentResponseBean(); + documentResponseBean.setId(documentEntity.getId()); + documentResponseBean.setName(documentEntity.getFileName()); + documentResponseBean.setType(DocumentTypeEnum.valueOf(documentEntity.getType())); + documentResponseBean.setSource(DocumentSourceTypeEnum.valueOf(documentEntity.getSource())); + documentResponseBean.setSourceId(documentEntity.getSourceId()); + documentResponseBean.setFilePath(documentEntity.getFilePath()); + documentResponseBean.setCreatedDate(documentEntity.getCreatedDate()); + documentResponseBean.setUpdatedDate(documentEntity.getUpdatedDate()); + evaluationDocResponse.setFileValue(documentResponseBean); + evaluationDocResponse.setNameValue(doc.getNameValue()); + evaluationDocResponse.setValid(doc.getValid()); + evaluationDocResponse.setFieldId(doc.getFieldId()); + }); + } + if (evaluationDocResponse.getFileValue() == null) { + continue; + } + evaluationDocResponses.add(evaluationDocResponse); + } + response.setEvaluationDocument(evaluationDocResponses); + } private void populateBasicDetails(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response) { @@ -483,9 +520,9 @@ public class ApplicationEvaluationDao { if (existingEntityOptional.isPresent()) { entity = existingEntityOptional.get(); oldApplicationEvaluation = Utils.getClonedEntityForData(entity); - entity.setCriteria(Utils.convertObjectToJson(filterNonNullCriteria(processCriteria(entity, req)))); - entity.setChecklist(Utils.convertObjectToJson(filterNonNullChecklist(processChecklist(entity, req)))); - entity.setFile(Utils.convertObjectToJson(filterNonNullFields(processField(entity, req)))); + entity.setCriteria(Utils.convertObjectToJson(processCriteria(entity, req))); + entity.setChecklist(Utils.convertObjectToJson(processChecklist(entity, req))); + entity.setFile(Utils.convertObjectToJson(processField(entity, req))); entity.setIsDeleted(false); setIfUpdated(entity::getNote, entity::setNote, req.getNote()); setIfUpdated(entity::getMotivation, entity::setMotivation, req.getMotivation()); @@ -510,22 +547,6 @@ public class ApplicationEvaluationDao { } } - - private List filterNonNullChecklist(List checklistRequests) { - - return checklistRequests.stream().filter(request -> request.getValid() != null).collect(Collectors.toList()); - } - - private List filterNonNullCriteria(List criteriaRequests) { - - return criteriaRequests.stream().filter(request -> request.getScore() != null && request.getValid() != null).collect(Collectors.toList()); - } - - private List filterNonNullFields(List fieldRequests) { - - return fieldRequests.stream().filter(request -> request.getValid() != null).collect(Collectors.toList()); - } - private List processCriteria(ApplicationEvaluationEntity entity, ApplicationEvaluationRequest req) { List incomingCriteriaList = Optional.ofNullable(req.getCriteria()).orElse(new ArrayList<>()); @@ -645,11 +666,52 @@ public class ApplicationEvaluationDao { return entityOptional.get(); } + public void validatePreinstructor(HttpServletRequest request,Long applicationId,Long assignedApplicationId){ + if (applicationId == null && assignedApplicationId == null) { + throw new CustomValidationException( + Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.EITHER_APPLICATION_OR_ASSIGNED_APPLICATION_ID_REQUIRED_MSG) + ); + } + Optional assignedApplicationsOptional = + assignedApplicationsRepository.findByApplicationIdOrIdAndIsDeletedFalse(applicationId,assignedApplicationId); - public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(UserEntity user, Long applicationId, Long assignedApplicationId) { + if (assignedApplicationId != null) { + assignedApplicationsOptional = assignedApplicationsOptional.filter(a -> a.getId().equals(assignedApplicationId)); + } + AssignedApplicationsEntity assignedApplications = assignedApplicationsOptional + .orElseThrow(() -> new CustomValidationException( + Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_WITH_ID_MSG) + )); + if (applicationId == null) { + applicationId = assignedApplications.getApplication().getId(); + } + validator.validatePreInstructor(request, assignedApplications.getUserId()); + } + public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId(HttpServletRequest request, UserEntity user, Long applicationID, Long assignedApplicationID) { + Long applicationId; + Long assignedApplicationId; + validatePreinstructor(request, applicationID, assignedApplicationID); + if (applicationID == null && assignedApplicationID != null) { + assignedApplicationId = assignedApplicationID; + Optional assignedApplicationsOptional = + assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationId); + + applicationId = assignedApplicationsOptional.map(a -> a.getApplication().getId()).orElse(null); + } else { + applicationId = applicationID; + if (assignedApplicationID == null && applicationID != null) { + Optional assignedApplicationsOptional = + assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId); + + assignedApplicationId = assignedApplicationsOptional.map(AssignedApplicationsEntity::getId).orElse(null); + } else { + assignedApplicationId = assignedApplicationID; + } + } applicationService.validateApplication(applicationId); - Optional entityOptional; if (applicationId != null && assignedApplicationId != null) { @@ -661,11 +723,19 @@ public class ApplicationEvaluationDao { } else { entityOptional = applicationEvaluationRepository.findFirstByIsDeletedFalseOrderByCreatedDateDesc(); } - return entityOptional.map(this::convertToResponse) + return entityOptional.map(this::convertToResponse) .orElseGet(() -> { return getEvaluationResponseByApplicationid(user, applicationId, assignedApplicationId); }); } + private List prepareEvaluationDocumentBeanList(ApplicationEvaluationEntity entity) { + List docRequest = new ArrayList<>(); + + if (entity != null && entity.getEvaluationDocument() != null) { + docRequest = Utils.convertJsonToList(entity.getEvaluationDocument(), new TypeReference>() {}); + } + return docRequest; + } public ApplicationEvaluationResponse getEvaluationResponseByApplicationid(UserEntity user, Long applicationId, Long assignedApplicationId) { @@ -1447,5 +1517,30 @@ public class ApplicationEvaluationDao { .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_EVALUATION_NOT_FOUND))); } + public ApplicationEvaluationResponse updateApplicationEvaluation( + Long assignedApplicationId, + List docRequest) { + Optional entityOptional=applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationId); + ApplicationEvaluationEntity applicationEvaluationEntity =null; + if(entityOptional.isPresent()) { + applicationEvaluationEntity = entityOptional.get(); + if (docRequest != null) { +// String existingEvaluationDocJson = applicationEvaluationEntity.getEvaluationDocument(); + List existingDocs = new ArrayList<>(); + + for (EvaluationDocumentRequest doc : docRequest) { + if (doc.getFileValue() != null) { + Long fileId = Long.valueOf(doc.getFileValue()); + documentService.validateDocument(fileId); + existingDocs.add(doc); + } + } + String updatedEvaluationDocJson = Utils.convertObjectToJson(existingDocs); + applicationEvaluationEntity.setEvaluationDocument(updatedEvaluationDocJson); + } + } + ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(applicationEvaluationEntity); + return convertToResponse(savedEntity); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 9b3b12a5..5f5e0f22 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -130,7 +130,7 @@ public class CallDao { ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) { for (DocumentEntity document : documents) { - String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.CALL, callId, 0L,0L); + String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.CALL, callId, 0L,0L,0L); try (InputStream fileInputStream = amazonS3Service.getFile(s3Folder, document.getFilePath())) { String fileName = Utils.extractFileName(document.getFilePath()); ZipEntry zipEntry = new ZipEntry(fileName); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index 670f9444..b31c12bf 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -92,7 +92,7 @@ public class DelegationDao { public ByteArrayOutputStream generateDocument(Map placeholders, String templateName) { try { - String s3Folder = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.TEMPLATE, 0L, 0L,0L); + String s3Folder = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.TEMPLATE, 0L, 0L,0L,0L); InputStream templateStream = amazonS3Service.getFile(s3Folder ,templateName); XWPFDocument doc = loadTemplate(templateStream); replacePlaceholders(doc, placeholders); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index b23e4785..b642b1c7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -6,6 +6,7 @@ import java.util.stream.Collectors; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; +import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.util.Utils; @@ -54,7 +55,7 @@ public class DocumentDao { private S3PathConfig s3ConfigBean; @Autowired - private ApplicationRepository applicationFormRepository; + private ApplicationRepository applicationRepository; @Autowired ApplicationService applicationService; @@ -64,6 +65,8 @@ public class DocumentDao { @Autowired ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository; + @Autowired + private ApplicationEvaluationRepository applicationEvaluationRepository; @Value("${aws.s3.bucket.name}") private String bucketName; @@ -77,7 +80,7 @@ public class DocumentDao { // @Value("${aws.s3.url.folder}") // private String s3Folder; - public List uploadFiles(List files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType) { + public List uploadFiles(Long userId,List files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType) { List documentEntities = new ArrayList<>(); Long source = resolveSourceId(sourceId, sourceType); @@ -91,6 +94,7 @@ public class DocumentDao { documentEntity.setType(fileType.getValue()); documentEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath()); documentEntity.setIsDeleted(false); + documentEntity.setUploadedBy(userId); documentEntities.add(documentEntity); } } @@ -137,18 +141,24 @@ public class DocumentDao { Long applicationId = 0L; Long amendmentId = 0L; + Long evaluationId = 0L; Long callId = sourceId; if (type == DocumentSourceTypeEnum.APPLICATION) { applicationId = sourceId; - callId = applicationFormRepository.findCallIdById(applicationId); + callId = applicationRepository.findCallIdById(applicationId); } else if (type == DocumentSourceTypeEnum.AMENDMENT) { amendmentId = sourceId; ApplicationEntity applicationEntity = applicationAmendmentRequestRepository.findApplicationByAmendmentId(amendmentId); applicationId = applicationEntity.getId(); callId = applicationEntity.getCall().getId(); + }else if (type == DocumentSourceTypeEnum.EVALUATION) { + evaluationId = sourceId; + ApplicationEntity applicationEntity = applicationEvaluationRepository.findApplicationByEvaluationId(evaluationId); + applicationId = applicationEntity.getId(); + callId = applicationEntity.getCall().getId(); } try { - String s3Path = generateS3Path(type, callId, applicationId, amendmentId); + String s3Path = generateS3Path(type, callId, applicationId, amendmentId, evaluationId); log.info("Generated S3 path {}", s3Path); return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); } catch (Exception e) { @@ -156,9 +166,9 @@ public class DocumentDao { } } - public String generateS3Path(DocumentSourceTypeEnum typeOfDocument, Long callId, Long applicationId, Long amendmentId) { + public String generateS3Path(DocumentSourceTypeEnum typeOfDocument, Long callId, Long applicationId, Long amendmentId,Long evaluationId) { try { - return s3ConfigBean.generateDocumentPath(typeOfDocument, callId, applicationId, amendmentId); + return s3ConfigBean.generateDocumentPath(typeOfDocument, callId, applicationId, amendmentId,evaluationId); } catch (IllegalArgumentException e) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); } @@ -188,6 +198,7 @@ public class DocumentDao { Long callId = null; Long applicationId = null; Long amendmentId = null; + Long evaluationId = null; if (DocumentSourceTypeEnum.CALL.getValue().equalsIgnoreCase(documentEntity.getSource())) { callId = documentEntity.getSourceId(); @@ -201,9 +212,14 @@ public class DocumentDao { ApplicationEntity applicationEntity = applicationAmendmentRequestRepository.findApplicationByAmendmentId(amendmentId); applicationId = applicationEntity.getId(); callId = applicationEntity.getCall().getId(); + } else if(DocumentSourceTypeEnum.EVALUATION.getValue().equalsIgnoreCase(documentEntity.getSource())){ + evaluationId = documentEntity.getSourceId(); + ApplicationEntity applicationEntity = applicationEvaluationRepository.findApplicationByEvaluationId(evaluationId); + applicationId = applicationEntity.getId(); + callId = applicationEntity.getCall().getId(); } - deleteFileFromS3(documentEntity, callId, applicationId,amendmentId); + deleteFileFromS3(documentEntity, callId, applicationId,amendmentId,evaluationId); } @@ -241,8 +257,9 @@ public class DocumentDao { Long callId=null; Long applicationId=null; Long amendmentId=null; + Long evaluationId=null; if (type.equals(DocumentSourceTypeEnum.APPLICATION)) { - callId = applicationFormRepository.findCallIdById(id); + callId = applicationRepository.findCallIdById(id); applicationId = id; } else if(type.equals(DocumentSourceTypeEnum.AMENDMENT)){ @@ -250,12 +267,18 @@ public class DocumentDao { ApplicationEntity applicationEntity = applicationAmendmentRequestRepository.findApplicationByAmendmentId(amendmentId); applicationId = applicationEntity.getId(); callId = applicationEntity.getCall().getId(); + }else if(type.equals(DocumentSourceTypeEnum.EVALUATION)){ + evaluationId = id; + ApplicationEntity applicationEntity = applicationEvaluationRepository.findApplicationByEvaluationId(evaluationId); + applicationId = applicationEntity.getId(); + callId = applicationEntity.getCall().getId(); } + else { callId = id; applicationId = 0L; } - String s3Path = generateS3Path(type, callId, applicationId,amendmentId); + String s3Path = generateS3Path(type, callId, applicationId,amendmentId,evaluationId); log.info("Generated S3 path {}", s3Path); return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); } catch (Exception e) { @@ -267,12 +290,12 @@ public class DocumentDao { return callDao.convertToDocumentResponseBean(documentEntity); } - public void deleteFileFromS3(DocumentEntity documentEntity, Long callId, Long applicationId,Long amendmentId) { + public void deleteFileFromS3(DocumentEntity documentEntity, Long callId, Long applicationId,Long amendmentId,Long evaluationId) { try { DocumentEntity oldDocumentEntity = Utils.getClonedEntityForData(documentEntity); String oldS3Path = documentEntity.getFilePath(); - String newS3Path = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.valueOf("DELETED_" + documentEntity.getSource().toUpperCase()), callId, applicationId,amendmentId); + String newS3Path = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.valueOf("DELETED_" + documentEntity.getSource().toUpperCase()), callId, applicationId,amendmentId,evaluationId); UploadFileOnAmazonS3Response response = amazonS3Service.moveFile(documentEntity.getFileName(), oldS3Path, newS3Path); documentEntity.setFileName(response.getFileName()); documentEntity.setFilePath(response.getFilePath()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java b/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java index 1db01f11..98413207 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java @@ -13,12 +13,12 @@ public class S3PathConfig { @Autowired S3ConfigRepository s3ConfigRepository; - public String generateDocumentPath(DocumentSourceTypeEnum type, Long callId, Long applicationId,Long amendmentId) { + public String generateDocumentPath(DocumentSourceTypeEnum type, Long callId, Long applicationId,Long amendmentId,Long evaluationId) { S3ConfigEntity config = getDocumentPath(type); return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId,amendmentId); } - public String generateDocumentPathForOther(DocOtherSourceTypeEnum type, Long callId, Long applicationId,Long amendmentId) { + public String generateDocumentPathForOther(DocOtherSourceTypeEnum type, Long callId, Long applicationId,Long amendmentId,Long evaluationId) { S3ConfigEntity config = getDocumentPathForOther(type); return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId,amendmentId); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java index e33881b1..45a8c842 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java @@ -22,6 +22,9 @@ public class ApplicationEvaluationEntity extends BaseEntity{ @Column(name = "checklist") private String checklist; + @Column(name = "EVALUATION_DOCUMENT") + private String evaluationDocument; + @Column(name = "file") private String file; @@ -58,4 +61,5 @@ public class ApplicationEvaluationEntity extends BaseEntity{ @Column(name = "STOP_DATE_TIME") private LocalDateTime stopDateTime; + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java index d15a65e6..08bfd623 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java @@ -32,4 +32,7 @@ public class DocumentEntity extends BaseEntity{ @Column(name="DOCUMENT_ATTACHMENT_ID") private String documentAttachmentId; + @Column(name="uploaded_by") + private Long uploadedBy; + } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java index 556a9949..05b42e3b 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java @@ -6,6 +6,7 @@ public enum DocOtherSourceTypeEnum { TEMPLATE("TEMPLATE"), DELETED_USER_DELEGATION("DELETED_USER_DELEGATION"), DELETED_APPLICATION("DELETED_APPLICATION"), + DELETED_EVALUATION("DELETED_EVALUATION"), DELETED_CALL("DELETED_CALL"), DELETED_AMENDMENT("DELETED_AMENDMENT"); diff --git a/src/main/java/net/gepafin/tendermanagement/enums/DocumentSourceTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/DocumentSourceTypeEnum.java index 7ac28ac7..e2b121e7 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/DocumentSourceTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/DocumentSourceTypeEnum.java @@ -4,7 +4,7 @@ public enum DocumentSourceTypeEnum { CALL("CALL"), APPLICATION("APPLICATION"), - + EVALUATION("EVALUATION"), AMENDMENT("AMENDMENT"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 94fabe89..6f518462 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -136,6 +136,7 @@ public enum UserActionContextEnum { UPDATE_EVALUATION_CRITERIA("UPDATE_EVALUATION_CRITERIA"), DELETE_EVALUATION_CRITERIA("DELETE_EVALUATION_CRITERIA"), CREATE_EVALUATION_CRITERIA("CREATE_EVALUATION_CRITERIA"), + UPLOAD_EVALUATION_DOC("UPLOAD_EVALUATION_DOC"), /** communication action context **/ ADD_COMMENT_TO_AMENDMENT_REQUEST("ADD_COMMENT_TO_AMENDMENT_REQUEST"), diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationDocumentRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationDocumentRequest.java new file mode 100644 index 00000000..79aed45c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/EvaluationDocumentRequest.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class EvaluationDocumentRequest { + + private String fieldId; + + private String nameValue; + + private String fileValue; + + private Boolean valid; +} 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 ca3eaa71..a3d32624 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -21,6 +21,7 @@ public class ApplicationEvaluationResponse { private List criteria; private List checklist; private List files; + private List evaluationDocument; private LocalDateTime createdDate; private LocalDateTime updatedDate; private String beneficiary; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationDocumentResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationDocumentResponse.java new file mode 100644 index 00000000..aea34514 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationDocumentResponse.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class EvaluationDocumentResponse { + private String fieldId; + private String nameValue; + private Boolean valid; + private DocumentResponseBean fileValue ; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 4a2e3252..ecb6b83d 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -44,7 +44,7 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository findFirstByIsDeletedFalseOrderByCreatedDateDesc(); boolean existsByApplicationIdAndIsDeletedFalse(Long applicationId); + @Query("SELECT app " + + "FROM ApplicationEntity app " + + "WHERE app.id = (SELECT aar.applicationId " + + "FROM ApplicationEvaluationEntity aar " + + "WHERE aar.id = :evaluationId AND aar.isDeleted = false)") + ApplicationEntity findApplicationByEvaluationId(Long evaluationId); @Query("SELECT a FROM ApplicationEvaluationEntity a WHERE a.isDeleted = false AND a.endDate < :currentDate") List findAllByIsDeletedFalseAndEndDateBefore(@Param("currentDate") LocalDateTime currentDate); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 8877fbc7..db645f95 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -42,6 +42,6 @@ public interface ApplicationRepository extends JpaRepository applicationEvaluationDocRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java index 6012a273..c777f004 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java @@ -11,7 +11,7 @@ import java.util.List; public interface DocumentService { - public List uploadFile(List files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType); + public List uploadFile(HttpServletRequest request,List files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType); public void deleteFile(Long documentId); 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 0a6feb1f..503f1513 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -1,29 +1,24 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.config.Translator; -import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.ApplicationEvaluationDao; import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.UserEntity; -import net.gepafin.tendermanagement.enums.ApplicationStatusForEvaluation; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; import net.gepafin.tendermanagement.service.ApplicationEvaluationService; import net.gepafin.tendermanagement.service.AssignedApplicationsService; import net.gepafin.tendermanagement.util.Validator; -import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; -import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; -import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.Optional; +import java.util.List; @Service public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationService { @@ -36,6 +31,9 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe private AssignedApplicationsService assignedApplicationsService; @Autowired private AssignedApplicationsRepository assignedApplicationsRepository; + @Autowired + private ApplicationEvaluationService applicationEvaluationService; + @Override @Transactional(rollbackFor = Exception.class) public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation( @@ -54,31 +52,12 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe @Transactional(readOnly = true) public ApplicationEvaluationResponse getApplicationEvaluationByApplicationId( HttpServletRequest request, Long applicationId, Long assignedApplicationId) { - - if (applicationId == null && assignedApplicationId == null) { - throw new CustomValidationException( - Status.BAD_REQUEST, - Translator.toLocale(GepafinConstant.EITHER_APPLICATION_OR_ASSIGNED_APPLICATION_ID_REQUIRED_MSG) - ); - } UserEntity preInstructor = validator.validateUser(request); - Optional assignedApplicationsOptional = - assignedApplicationsRepository.findByApplicationIdOrIdAndIsDeletedFalse(applicationId,assignedApplicationId); - - if (assignedApplicationId != null) { - assignedApplicationsOptional = assignedApplicationsOptional.filter(a -> a.getId().equals(assignedApplicationId)); - } - AssignedApplicationsEntity assignedApplications = assignedApplicationsOptional - .orElseThrow(() -> new CustomValidationException( - Status.BAD_REQUEST, - Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_WITH_ID_MSG) - )); - validator.validatePreInstructor(request, assignedApplications.getUserId()); - return applicationEvaluationDao.getApplicationEvaluationByApplicationId( + request, preInstructor, - assignedApplications.getApplication().getId(), - assignedApplications.getId() + applicationId, + assignedApplicationId ); } @@ -98,4 +77,11 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe public ApplicationEvaluationEntity validateApplicationEvaluationByApplicationId(Long applicationId) { return applicationEvaluationDao.validateApplicationEvaluationByApplicationId(applicationId); } + + @Override + public ApplicationEvaluationResponse updateApplicationEvaluation(HttpServletRequest request, Long assignedApplicationId, List evaluationDocRequest) { + AssignedApplicationsEntity assignedApplication =assignedApplicationsService.validateAssignedApplication(assignedApplicationId); + validator.validatePreInstructor(request, assignedApplication.getUserId()); + return applicationEvaluationDao.updateApplicationEvaluation(assignedApplicationId,evaluationDocRequest); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java index 505d0da1..d7a46aa6 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java @@ -1,14 +1,17 @@ package net.gepafin.tendermanagement.service.impl; import java.util.List; +import java.util.Map; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.DocumentDao; import net.gepafin.tendermanagement.entities.DocumentEntity; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.service.DocumentService; +import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -22,9 +25,13 @@ public class DocumentServiceImpl implements DocumentService { @Autowired private DocumentDao documentDao; + @Autowired + private Validator validator; @Override - public List uploadFile(List files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType) { - return documentDao.uploadFiles(files,sourceId,sourceType,fileType); + public List uploadFile(HttpServletRequest request,List files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType) { + Map userInfo = validator.getUserInfoFromToken(request); + Long userId = validator.getUserId(userInfo); + return documentDao.uploadFiles(userId,files,sourceId,sourceType,fileType); } @Override public void deleteFile(Long documentId) { diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java index 23b8fd59..156a8fd8 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java @@ -12,10 +12,7 @@ import net.gepafin.tendermanagement.dao.S3PathConfig; import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; -import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; -import net.gepafin.tendermanagement.repositories.ApplicationRepository; -import net.gepafin.tendermanagement.repositories.ApplicationSignedDocumentRepository; -import net.gepafin.tendermanagement.repositories.DocumentRepository; +import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.ApplicationService; import org.springframework.beans.factory.annotation.Autowired; @@ -73,6 +70,9 @@ public class S3ReUploadMigrationService { @Autowired private ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository; + @Autowired + private ApplicationEvaluationRepository applicationEvaluationRepository; + @Autowired private DocumentDao documentDao; @@ -107,7 +107,7 @@ public class S3ReUploadMigrationService { Long callId = null; Long applicationId = null; Long amendmentId = null; - + Long evaluationId = null; if (DocumentSourceTypeEnum.CALL.getValue().equalsIgnoreCase(document.getSource())) { callId = document.getSourceId(); } else if (DocumentSourceTypeEnum.APPLICATION.getValue().equalsIgnoreCase(document.getSource())) { @@ -120,9 +120,15 @@ public class S3ReUploadMigrationService { ApplicationEntity applicationEntity = applicationAmendmentRequestRepository.findApplicationByAmendmentId(amendmentId); applicationId = applicationEntity.getId(); callId = applicationEntity.getCall().getId(); + } else if(DocumentSourceTypeEnum.EVALUATION.getValue().equalsIgnoreCase(document.getSource())){ + evaluationId = document.getSourceId(); + ApplicationEntity applicationEntity = applicationEvaluationRepository.findApplicationByEvaluationId(evaluationId); + applicationId = applicationEntity.getId(); + callId = applicationEntity.getCall().getId(); } - documentDao.deleteFileFromS3(document,callId,applicationId,amendmentId); + + documentDao.deleteFileFromS3(document,callId,applicationId,amendmentId,evaluationId); processDocuments++; } catch (Exception e) { @@ -213,10 +219,10 @@ public class S3ReUploadMigrationService { Long callId; if (sourceType.equals(DocumentSourceTypeEnum.CALL)) { - return s3ConfigBean.generateDocumentPath(sourceType, document.getSourceId(), 0L,0L); + return s3ConfigBean.generateDocumentPath(sourceType, document.getSourceId(), 0L,0L,0L); } else { callId = applicationRepository.findCallIdById(document.getSourceId()); - return s3ConfigBean.generateDocumentPath(sourceType, callId, document.getSourceId(),0L); + return s3ConfigBean.generateDocumentPath(sourceType, callId, document.getSourceId(),0L,0L); } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java index d5bd4c3c..3d5ecc6c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java @@ -139,7 +139,7 @@ public class UserSignedAndDelegationServiceImpl { private String generateNewS3PathForDelegationDoc() { - return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_DELEGATION, 0L, 0L,0L); + return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_DELEGATION, 0L, 0L,0L,0l); } private String generateNewS3PathForUserSignedDoc(ApplicationSignedDocumentEntity document) { diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index e0814305..82bc2d79 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -105,7 +105,7 @@ public class Validator { } } - private Long getUserId(Map userInfo) { + public Long getUserId(Map userInfo) { return Long.parseLong(userInfo.get("userId").toString()); } 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 bc17e345..07321792 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -7,8 +7,8 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; -import net.gepafin.tendermanagement.enums.ApplicationStatusForEvaluation; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -16,6 +16,8 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + public interface ApplicationEvaluationApi { @Operation(summary = "API to create or update ApplicationEvaluation", @@ -53,5 +55,21 @@ public interface ApplicationEvaluationApi { ResponseEntity> deleteApplicationEvaluation(HttpServletRequest request, @Parameter( required = true) @PathVariable("id") Long id); + @Operation(summary = "Api to upload Documents for evaluation", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PutMapping(value = "/assignedApplicationId/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> updateApplicationEvaluation(HttpServletRequest request, + @Parameter(description = "The AssignedApplication id", required = true) @PathVariable("id") Long id, + @Parameter(description = "Application Evaluation request object", required = true) @Valid @RequestBody List applicationEvaluationDocRequest); + + } 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 be177bf9..403e826a 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java @@ -3,12 +3,13 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.enums.ApplicationStatusForEvaluation; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; +import net.gepafin.tendermanagement.model.request.EvaluationDocumentRequest; import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.model.response.ApplicationEvaluationResponse; +import net.gepafin.tendermanagement.model.response.EvaluationDocumentResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.ApplicationEvaluationService; import net.gepafin.tendermanagement.util.LoggingUtil; @@ -20,6 +21,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("${openapi.gepafin.base-path:/v1/applicationEvaluation}") public class ApplicationEvaluationApiController implements ApplicationEvaluationApi { @@ -79,5 +82,15 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_DELETED_SUCCESSFULLY))); } + @Override + public ResponseEntity> updateApplicationEvaluation(HttpServletRequest request, Long id, List applicationEvaluationDocRequest) { + /** This code is responsible for "Upload Evaluation Document" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.UPLOAD_EVALUATION_DOC).build()); + + ApplicationEvaluationResponse updateApplicationEvaluationResponse = applicationEvaluationService.updateApplicationEvaluation(request, id, applicationEvaluationDocRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(updateApplicationEvaluationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_UPDATE_SUCCESSFULLY_MSG))); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java index 9d42ab53..123a4620 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java @@ -47,7 +47,7 @@ DocumentApiController implements DocumentApi { /** This code is responsible for creating user action logs for the "upload document for call or application" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(httpServletRequest).actionType(UserActionLogsEnum.UPLOAD).actionContext(userActionContext).build()); - List responseBeans = documentService.uploadFile(files, sourceId, sourceType, fileType); + List responseBeans = documentService.uploadFile(httpServletRequest,files, sourceId, sourceType, fileType); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response>(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILES_UPLOADED_MSG))); } catch (CustomValidationException ex) { diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index eb77049e..da446f6c 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 @@ -1991,5 +1991,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 1747d76d7f3e4a6382e354e82730dd237c3b2a7b Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 12 Dec 2024 15:52:02 +0530 Subject: [PATCH 15/33] Updated code --- .../tendermanagement/dao/ApplicationDao.java | 6 ++-- .../dao/ApplicationEvaluationDao.java | 28 ++++++++++--------- .../gepafin/tendermanagement/dao/CallDao.java | 2 +- .../tendermanagement/dao/DelegationDao.java | 2 +- .../tendermanagement/dao/DocumentDao.java | 16 +++++------ .../tendermanagement/dao/S3PathConfig.java | 4 +-- .../impl/S3ReUploadMigrationService.java | 6 ++-- .../UserSignedAndDelegationServiceImpl.java | 2 +- 8 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index c545f55b..203b4f3c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1080,7 +1080,7 @@ public class ApplicationDao { } private String generateS3PathForDelegation(Long callId, Long applicationId) { try { - return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, callId, applicationId,0L,0L); + return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, callId, applicationId,0L); } catch (IllegalArgumentException e) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); } @@ -1244,7 +1244,7 @@ public class ApplicationDao { try (ByteArrayOutputStream zipOutputStream = new ByteArrayOutputStream(); ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) { - String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.APPLICATION, applicationEntity.getCall().getId(), applicationId,0L,0L); + String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.APPLICATION, applicationEntity.getCall().getId(), applicationId,0L); for (DocumentEntity document : documents) { String fileName = Utils.extractFileName(document.getFilePath()); @@ -1252,7 +1252,7 @@ public class ApplicationDao { } if (signedDocument != null) { - String signedDocS3Folder = s3PathConfig.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, applicationEntity.getCall().getId(), applicationId,0L,0L); + String signedDocS3Folder = s3PathConfig.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, applicationEntity.getCall().getId(), applicationId,0L); String signedDocFileName = signedDocument.getFileName(); addDocumentToZip(zos, signedDocS3Folder, signedDocument.getFilePath(), signedDocFileName); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index e88d4d94..9d9c0627 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1528,24 +1528,26 @@ public class ApplicationEvaluationDao { List docRequest) { Optional entityOptional=applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationId); ApplicationEvaluationEntity applicationEvaluationEntity =null; - if(entityOptional.isPresent()) { - applicationEvaluationEntity = entityOptional.get(); - if (docRequest != null) { -// String existingEvaluationDocJson = applicationEvaluationEntity.getEvaluationDocument(); - List existingDocs = new ArrayList<>(); + ApplicationEvaluationEntity oldApplicationEvaluation = Utils.getClonedEntityForData(entityOptional.get()); + applicationEvaluationEntity = entityOptional.get(); - for (EvaluationDocumentRequest doc : docRequest) { - if (doc.getFileValue() != null) { - Long fileId = Long.valueOf(doc.getFileValue()); - documentService.validateDocument(fileId); - existingDocs.add(doc); - } + if (docRequest != null) { + List existingDocs = new ArrayList<>(); + + for (EvaluationDocumentRequest doc : docRequest) { + if (doc.getFileValue() != null) { + Long fileId = Long.valueOf(doc.getFileValue()); + documentService.validateDocument(fileId); + existingDocs.add(doc); } - String updatedEvaluationDocJson = Utils.convertObjectToJson(existingDocs); - applicationEvaluationEntity.setEvaluationDocument(updatedEvaluationDocJson); } + String updatedEvaluationDocJson = Utils.convertObjectToJson(existingDocs); + applicationEvaluationEntity.setEvaluationDocument(updatedEvaluationDocJson); } ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(applicationEvaluationEntity); + + /** This code is responsible for adding a version history log for the "Upload Document in Application Evaluation" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluation).newData(savedEntity).build()); return convertToResponse(savedEntity); } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 5f5e0f22..9b3b12a5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -130,7 +130,7 @@ public class CallDao { ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) { for (DocumentEntity document : documents) { - String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.CALL, callId, 0L,0L,0L); + String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.CALL, callId, 0L,0L); try (InputStream fileInputStream = amazonS3Service.getFile(s3Folder, document.getFilePath())) { String fileName = Utils.extractFileName(document.getFilePath()); ZipEntry zipEntry = new ZipEntry(fileName); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index b31c12bf..670f9444 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -92,7 +92,7 @@ public class DelegationDao { public ByteArrayOutputStream generateDocument(Map placeholders, String templateName) { try { - String s3Folder = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.TEMPLATE, 0L, 0L,0L,0L); + String s3Folder = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.TEMPLATE, 0L, 0L,0L); InputStream templateStream = amazonS3Service.getFile(s3Folder ,templateName); XWPFDocument doc = loadTemplate(templateStream); replacePlaceholders(doc, placeholders); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index b642b1c7..bf229f19 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -65,6 +65,7 @@ public class DocumentDao { @Autowired ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository; + @Autowired private ApplicationEvaluationRepository applicationEvaluationRepository; @@ -158,7 +159,7 @@ public class DocumentDao { callId = applicationEntity.getCall().getId(); } try { - String s3Path = generateS3Path(type, callId, applicationId, amendmentId, evaluationId); + String s3Path = generateS3Path(type, callId, applicationId, amendmentId); log.info("Generated S3 path {}", s3Path); return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); } catch (Exception e) { @@ -166,9 +167,9 @@ public class DocumentDao { } } - public String generateS3Path(DocumentSourceTypeEnum typeOfDocument, Long callId, Long applicationId, Long amendmentId,Long evaluationId) { + public String generateS3Path(DocumentSourceTypeEnum typeOfDocument, Long callId, Long applicationId, Long amendmentId) { try { - return s3ConfigBean.generateDocumentPath(typeOfDocument, callId, applicationId, amendmentId,evaluationId); + return s3ConfigBean.generateDocumentPath(typeOfDocument, callId, applicationId, amendmentId); } catch (IllegalArgumentException e) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); } @@ -218,8 +219,7 @@ public class DocumentDao { applicationId = applicationEntity.getId(); callId = applicationEntity.getCall().getId(); } - - deleteFileFromS3(documentEntity, callId, applicationId,amendmentId,evaluationId); + deleteFileFromS3(documentEntity, callId, applicationId,amendmentId); } @@ -278,7 +278,7 @@ public class DocumentDao { callId = id; applicationId = 0L; } - String s3Path = generateS3Path(type, callId, applicationId,amendmentId,evaluationId); + String s3Path = generateS3Path(type, callId, applicationId,amendmentId); log.info("Generated S3 path {}", s3Path); return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); } catch (Exception e) { @@ -290,12 +290,12 @@ public class DocumentDao { return callDao.convertToDocumentResponseBean(documentEntity); } - public void deleteFileFromS3(DocumentEntity documentEntity, Long callId, Long applicationId,Long amendmentId,Long evaluationId) { + public void deleteFileFromS3(DocumentEntity documentEntity, Long callId, Long applicationId,Long amendmentId) { try { DocumentEntity oldDocumentEntity = Utils.getClonedEntityForData(documentEntity); String oldS3Path = documentEntity.getFilePath(); - String newS3Path = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.valueOf("DELETED_" + documentEntity.getSource().toUpperCase()), callId, applicationId,amendmentId,evaluationId); + String newS3Path = s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.valueOf("DELETED_" + documentEntity.getSource().toUpperCase()), callId, applicationId,amendmentId); UploadFileOnAmazonS3Response response = amazonS3Service.moveFile(documentEntity.getFileName(), oldS3Path, newS3Path); documentEntity.setFileName(response.getFileName()); documentEntity.setFilePath(response.getFilePath()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java b/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java index 98413207..1db01f11 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java @@ -13,12 +13,12 @@ public class S3PathConfig { @Autowired S3ConfigRepository s3ConfigRepository; - public String generateDocumentPath(DocumentSourceTypeEnum type, Long callId, Long applicationId,Long amendmentId,Long evaluationId) { + public String generateDocumentPath(DocumentSourceTypeEnum type, Long callId, Long applicationId,Long amendmentId) { S3ConfigEntity config = getDocumentPath(type); return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId,amendmentId); } - public String generateDocumentPathForOther(DocOtherSourceTypeEnum type, Long callId, Long applicationId,Long amendmentId,Long evaluationId) { + public String generateDocumentPathForOther(DocOtherSourceTypeEnum type, Long callId, Long applicationId,Long amendmentId) { S3ConfigEntity config = getDocumentPathForOther(type); return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId,amendmentId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java index 156a8fd8..dac565e7 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java @@ -128,7 +128,7 @@ public class S3ReUploadMigrationService { } - documentDao.deleteFileFromS3(document,callId,applicationId,amendmentId,evaluationId); + documentDao.deleteFileFromS3(document,callId,applicationId,amendmentId); processDocuments++; } catch (Exception e) { @@ -219,10 +219,10 @@ public class S3ReUploadMigrationService { Long callId; if (sourceType.equals(DocumentSourceTypeEnum.CALL)) { - return s3ConfigBean.generateDocumentPath(sourceType, document.getSourceId(), 0L,0L,0L); + return s3ConfigBean.generateDocumentPath(sourceType, document.getSourceId(), 0L,0L); } else { callId = applicationRepository.findCallIdById(document.getSourceId()); - return s3ConfigBean.generateDocumentPath(sourceType, callId, document.getSourceId(),0L,0L); + return s3ConfigBean.generateDocumentPath(sourceType, callId, document.getSourceId(),0L); } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java index 3d5ecc6c..d5bd4c3c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java @@ -139,7 +139,7 @@ public class UserSignedAndDelegationServiceImpl { private String generateNewS3PathForDelegationDoc() { - return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_DELEGATION, 0L, 0L,0L,0l); + return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_DELEGATION, 0L, 0L,0L); } private String generateNewS3PathForUserSignedDoc(ApplicationSignedDocumentEntity document) { From eb5075488e12e8d3d3085c7b3c90263d0afdf4d5 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 13 Dec 2024 11:39:46 +0530 Subject: [PATCH 16/33] Updated code for evaluation response --- .../dao/ApplicationAmendmentRequestDao.java | 33 +-- .../dao/ApplicationEvaluationDao.java | 189 +++++++++++++++++- .../request/AmendmentDetailsRequest.java | 17 ++ .../model/request/AmendmentFormField.java | 6 +- .../request/AmendmentFormFieldRequest.java | 13 ++ .../ApplicationAmendmentRequestBean.java | 2 +- .../request/ApplicationEvaluationRequest.java | 1 + .../AmendmentDocumentResponseBean.java | 15 ++ .../ApplicationEvaluationResponse.java | 1 + 9 files changed, 254 insertions(+), 23 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 72f540f7..d762ae3e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -265,6 +265,7 @@ public class ApplicationAmendmentRequestDao { AmendmentFormField formField = new AmendmentFormField(); formField.setFieldId(amendmentFormFieldRequest.getFieldId()); formField.setFieldValue(null); + formField.setLabel(amendmentFormFieldRequest.getLabel()); return formField; }) .collect(Collectors.toList()); @@ -373,7 +374,7 @@ public class ApplicationAmendmentRequestDao { return response; } - private AmendmentDocumentResponse createAmendmentDocumentResponse(AmendmentFieldRequest amendmentFieldRequest) { + public AmendmentDocumentResponse createAmendmentDocumentResponse(AmendmentFieldRequest amendmentFieldRequest) { AmendmentDocumentResponse amendmentDocumentResponse = new AmendmentDocumentResponse(); amendmentDocumentResponse.setFieldId(amendmentFieldRequest.getFieldId()); amendmentDocumentResponse.setNameValue(amendmentFieldRequest.getNameValue()); @@ -571,8 +572,8 @@ public class ApplicationAmendmentRequestDao { if(updateRequest.getApplicationFormFields() != null) { updateRequest.getApplicationFormFields().stream().forEach(applicationFormFieldRequest->{ AmendmentFormField amendmentFormField = getAmendmentFormField(amendmentFormFieldMap,applicationFormFieldRequest.getFieldId()); - ApplicationFormFieldEntity applicationFormFieldEntity = getApplicationFormField(applicationFormFieldMap, applicationFormFieldRequest.getFieldId()); - updateApplicationFormField(applicationFormFieldEntity,applicationFormFieldRequest, amendmentFormField); +// ApplicationFormFieldEntity applicationFormFieldEntity = getApplicationFormField(applicationFormFieldMap, applicationFormFieldRequest.getFieldId()); +// updateApplicationFormField(applicationFormFieldEntity,applicationFormFieldRequest, amendmentFormField); updateFormField(applicationFormFieldRequest, amendmentFormField); }); existingApplicationAmendment.setFormFields(Utils.convertListToJsonString(amendmentFormFieldMap.values().stream().toList())); @@ -652,7 +653,7 @@ public class ApplicationAmendmentRequestDao { } - private void updateFormField(ApplicationFormFieldRequestBean applicationFormFieldRequest, + private void updateFormField(AmendmentFormFieldRequest applicationFormFieldRequest, AmendmentFormField amendmentFormField) { List requestedDocumentIds = extractIds(applicationFormFieldRequest.getFieldValue()); List existingDocumentIds = extractIds(amendmentFormField.getFieldValue()); @@ -661,7 +662,8 @@ public class ApplicationAmendmentRequestDao { if (!existingDocumentIds.isEmpty()) { existingDocumentIds.forEach(this::softDeleteDocument); amendmentFormField.setFieldValue(null); - setIsUploadedBy(amendmentFormField); + amendmentFormField.setIsValid(applicationFormFieldRequest.getIsValid()); +// setIsUploadedBy(amendmentFormField); } return; } @@ -675,11 +677,12 @@ public class ApplicationAmendmentRequestDao { if (!newFieldValue.equals(amendmentFormField.getFieldValue())) { amendmentFormField.setFieldValue(newFieldValue); - setIsUploadedBy(amendmentFormField); + amendmentFormField.setIsValid(applicationFormFieldRequest.getIsValid()); +// setIsUploadedBy(amendmentFormField); } } - private List extractIds(Object fieldValue) { + public List extractIds(Object fieldValue) { if (fieldValue instanceof String && !StringUtils.isEmpty((String) fieldValue)) { return Arrays.stream(((String) fieldValue).split(",")) .map(Long::valueOf) @@ -690,14 +693,14 @@ public class ApplicationAmendmentRequestDao { - private void setIsUploadedBy(AmendmentFormField amendmentFormField) { - if(validator.checkIsBeneficiary()) { - amendmentFormField.setIsUploadedBy(AmendmentFormField.AmendmentIsUploadedByEnum.BENEFICIARY.getValue()); - }else { - amendmentFormField.setIsUploadedBy(AmendmentFormField.AmendmentIsUploadedByEnum.PRE_INSTRUCTOR.getValue()); - } - - } +// private void setIsUploadedBy(AmendmentFormField amendmentFormField) { +// if(validator.checkIsBeneficiary()) { +// amendmentFormField.setIsUploadedBy(AmendmentFormField.AmendmentIsUploadedByEnum.BENEFICIARY.getValue()); +// }else { +// amendmentFormField.setIsUploadedBy(AmendmentFormField.AmendmentIsUploadedByEnum.PRE_INSTRUCTOR.getValue()); +// } +// +// } // private void updateApplicationFormFields(ApplicationAmendmentRequestEntity applicationAmendment, ApplicationFormFieldRequestBean updatedFormField) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 9d9c0627..7845a565 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1,6 +1,5 @@ package net.gepafin.tendermanagement.dao; -import com.amazonaws.services.dynamodbv2.xspec.L; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -99,6 +98,9 @@ public class ApplicationEvaluationDao { @Autowired private DocumentService documentService; + @Autowired + private ApplicationAmendmentRequestDao applicationAmendmentRequestDao; + private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); @@ -134,6 +136,7 @@ public class ApplicationEvaluationDao { List checklistEntities = callTargetAudienceChecklistRepository .findByCallIdAndLookupDataTypeAndIsDeletedFalse(call.getId(), LookUpDataEntity.LookUpDataTypeEnum.CHECKLIST.getValue()); List applicationFormEntities = applicationFormRepository.findByApplicationId(entity.getApplicationId()); + setAmendmentDetails(entity,response); setCriteriaResponses(entity, response, evaluationCriterias); setChecklistResponses(entity, response, checklistEntities); @@ -144,6 +147,46 @@ public class ApplicationEvaluationDao { return response; } + + private void setAmendmentDetails(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response) { + List amendmentRequests=applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); + List amendmentDocumentResponseBeans=new ArrayList<>(); + for(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity:amendmentRequests){ + AmendmentDocumentResponseBean amendmentDocumentResponseBean=new AmendmentDocumentResponseBean(); + amendmentDocumentResponseBean.setAmendmentId(applicationAmendmentRequestEntity.getId()); + String amendmentDocument=applicationAmendmentRequestEntity.getAmendmentDocument(); + String formField=applicationAmendmentRequestEntity.getFormFields(); + if (amendmentDocument != null) { + List amendmentFieldRequests=Utils.convertJsonStringToList(amendmentDocument,AmendmentFieldRequest.class); + List amendmentDocumentResponses = amendmentFieldRequests.stream() + .map(applicationAmendmentRequestDao::createAmendmentDocumentResponse) + .toList(); + amendmentDocumentResponseBean.setAmendmentDocuments(amendmentDocumentResponses); + } + List amendmentFormFields=Utils.convertJsonStringToList(formField,AmendmentFormField.class); + amendmentDocumentResponseBean.setFormFieldDocuments(setFormFieldDocuments(amendmentFormFields)); + amendmentDocumentResponseBeans.add(amendmentDocumentResponseBean); + } + response.setAmendmentDetails(amendmentDocumentResponseBeans); + } + + private List setFormFieldDocuments(List amendmentFormFields) { + List fieldResponses=new ArrayList<>(); + for (AmendmentFormField amendmentFormField: amendmentFormFields){ + FieldResponse fieldResponse=new FieldResponse(); + fieldResponse.setId(amendmentFormField.getFieldId()); + fieldResponse.setLabel(amendmentFormField.getLabel()); + fieldResponse.setValid(amendmentFormField.getIsValid()); + List fileIds=applicationAmendmentRequestDao.extractIds(amendmentFormField.getFieldValue()); + List documentResponseBeans = fileIds.stream() + .map(fileId -> createDocumentResponseBean(documentService.validateDocument(fileId))) // Create DocumentResponseBean for each fileId + .collect(Collectors.toList()); // Collect all into a List + fieldResponse.setFileDetail(documentResponseBeans); + fieldResponses.add(fieldResponse); + } + return fieldResponses; + } + private void setEvaluationDocResponse(ApplicationEvaluationResponse response, List docRequest) { List evaluationDocResponses = new ArrayList<>(); @@ -534,6 +577,15 @@ public class ApplicationEvaluationDao { actionType = VersionActionTypeEnum.INSERT; } ApplicationStatusForEvaluation status = req.getApplicationStatus(); + // Fetch all amendment request entities associated with the evaluation ID + List applicationAmendmentRequestEntities = + applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); + +// Fetch amendment details from the request + List amendmentDetailsRequests = req.getAmendmentDetails(); + + updateAmendmentDocumentsAndFormFields(applicationAmendmentRequestEntities, amendmentDetailsRequests); + ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(entity); @@ -549,6 +601,132 @@ public class ApplicationEvaluationDao { } } + private void updateAmendmentDocumentsAndFormFields(List applicationAmendmentRequestEntities, List amendmentFormFields) { + // Iterate through amendment request entities + for (ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity : applicationAmendmentRequestEntities) { + // Process form fields if present + if (applicationAmendmentRequestEntity.getFormFields() != null) { + // Parse existing form fields from JSON + List existingFormFields = + Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getFormFields(), AmendmentFormFieldRequest.class); + + // Prepare a new list to hold updated form fields + List updatedFormFields = new ArrayList<>(); + + // Map amendment details for quick lookup by amendment ID + Map> amendmentDetailsMap = amendmentFormFields.stream() + .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) + .collect(Collectors.toMap(AmendmentDetailsRequest::getAmendmentId, AmendmentDetailsRequest::getFormFieldDocuments)); + + // Get corresponding amendment documents for the current entity + List amendmentDocuments = amendmentDetailsMap.get(applicationAmendmentRequestEntity.getId()); + if (amendmentDocuments != null) { + // Update existing form fields with new values + for (AmendmentFormFieldRequest existingField : existingFormFields) { + for (AmendmentFormFieldRequest newField : amendmentDocuments) { + if (existingField.getFieldId().equals(newField.getFieldId())) { + // Update fields if there are changes + Utils.setIfUpdated(existingField::getIsValid, existingField::setIsValid, newField.getIsValid()); + Utils.setIfUpdated(existingField::getFieldValue, existingField::setFieldValue, newField.getFieldValue()); + + updatedFormFields.add(existingField); + break; // Move to the next existing field + } + } + } + + // Convert updated form fields back to JSON and save to the database + applicationAmendmentRequestEntity.setFormFields(Utils.convertListToJsonString(updatedFormFields)); + applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); + } + } + + // Process amendment documents if present + if (applicationAmendmentRequestEntity.getAmendmentDocument() != null) { + // Parse existing amendment fields from JSON + List existingAmendmentFields = + Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(), AmendmentFieldRequest.class); + + // Prepare a new list to hold updated amendment fields + List updatedAmendmentFields = new ArrayList<>(); + + // Map amendment details for quick lookup by amendment ID + Map> amendmentDetailsMap = amendmentFormFields.stream() + .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) + .collect(Collectors.toMap(AmendmentDetailsRequest::getAmendmentId, AmendmentDetailsRequest::getAmendmentDocuments)); + + // Get corresponding amendment documents for the current entity + List amendmentDocuments = amendmentDetailsMap.get(applicationAmendmentRequestEntity.getId()); + if (amendmentDocuments != null) { + // Update existing amendment fields with new values + for (AmendmentFieldRequest existingField : existingAmendmentFields) { + for (AmendmentFieldRequest newField : amendmentDocuments) { + if (existingField.getFieldId().equals(newField.getFieldId())) { + // Update fields if there are changes + Utils.setIfUpdated(existingField::getIsValid, existingField::setIsValid, newField.getIsValid()); + Utils.setIfUpdated(existingField::getFileValue, existingField::setFileValue, newField.getFileValue()); + Utils.setIfUpdated(existingField::getNameValue, existingField::setNameValue, newField.getNameValue()); + + updatedAmendmentFields.add(existingField); + break; // Move to the next existing field + } + } + } + + // Convert updated fields back to JSON and save to the database + applicationAmendmentRequestEntity.setAmendmentDocument(Utils.convertListToJsonString(updatedAmendmentFields)); + applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); + } + } + } + } + +// private void updateAmendmentDocuments(List applicationAmendmentRequestEntities, List amendmentFormFields) { +// for (ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity : applicationAmendmentRequestEntities) { +// // Skip if there are no amendment documents +// if (applicationAmendmentRequestEntity.getAmendmentDocument() == null) { +// continue; +// } +// +// // Parse existing amendment fields from JSON +// List existingAmendmentFields = +// Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(), AmendmentFieldRequest.class); +// +// // Prepare a new list to hold updated amendment fields +// List updatedAmendmentFields = new ArrayList<>(); +// +// // Map amendment details for quick lookup by amendment ID +// Map> amendmentDetailsMap = amendmentFormFields.stream() +// .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) +// .collect(Collectors.toMap(AmendmentDetailsRequest::getAmendmentId, AmendmentDetailsRequest::getAmendmentDocuments)); +// +// // Get corresponding amendment documents for the current entity +// List amendmentDocuments = amendmentDetailsMap.get(applicationAmendmentRequestEntity.getId()); +// if (amendmentDocuments == null) { +// continue; +// } +// +// // Update existing amendment fields with new values +// for (AmendmentFieldRequest existingField : existingAmendmentFields) { +// for (AmendmentFieldRequest newField : amendmentDocuments) { +// if (existingField.getFieldId().equals(newField.getFieldId())) { +// // Update fields if there are changes +// Utils.setIfUpdated(existingField::getIsValid, existingField::setIsValid, newField.getIsValid()); +// Utils.setIfUpdated(existingField::getFileValue, existingField::setFileValue, newField.getFileValue()); +// Utils.setIfUpdated(existingField::getNameValue, existingField::setNameValue, newField.getNameValue()); +// +// updatedAmendmentFields.add(existingField); +// break; // Move to the next existing field +// } +// } +// } +// +// // Convert updated fields back to JSON and save to the database +// applicationAmendmentRequestEntity.setAmendmentDocument(Utils.convertListToJsonString(updatedAmendmentFields)); +// applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); +// } +// } + private List processCriteria(ApplicationEvaluationEntity entity, ApplicationEvaluationRequest req) { List incomingCriteriaList = Optional.ofNullable(req.getCriteria()).orElse(new ArrayList<>()); @@ -1483,6 +1661,10 @@ public class ApplicationEvaluationDao { ApplicationEvaluationEntity oldApplicationEvaluation = Utils.getClonedEntityForData(existingEntity); AssignedApplicationsEntity oldAssignedApplication = Utils.getClonedEntityForData(assignedApplicationsEntity); + List amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(existingEntity.getId(),ApplicationAmendmentRequestEnum.AWAITING.getValue()); + if(amendmentRequest !=null && Boolean.FALSE.equals(amendmentRequest.isEmpty())){ + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_CANNOT_APPROVED_OR_REJECTED)); + } String statusType = application.getStatus(); if (application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue())) { existingEntity.setStatus(ApplicationEvaluationStatusTypeEnum.CLOSE.getValue()); @@ -1501,11 +1683,6 @@ public class ApplicationEvaluationDao { } - List amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(existingEntity.getId(),ApplicationAmendmentRequestEnum.AWAITING.getValue()); - if(amendmentRequest !=null && Boolean.FALSE.equals(amendmentRequest.isEmpty())){ - throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_CANNOT_APPROVED_OR_REJECTED)); - } - if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.APPROVED.getValue())))) { emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application); } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java new file mode 100644 index 00000000..691a5a20 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.model.response.AmendmentDocumentResponse; +import net.gepafin.tendermanagement.model.response.FieldResponse; + +import java.util.List; + +@Data +public class AmendmentDetailsRequest { + + Long amendmentId; + + List amendmentDocuments; + + List formFieldDocuments; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java index 95f158c3..0eaee1f3 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java @@ -9,9 +9,13 @@ public class AmendmentFormField { private String fieldId; + private String label; + private String fieldValue; - private String isUploadedBy; + private Boolean isValid; + + public enum AmendmentIsUploadedByEnum { diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java new file mode 100644 index 00000000..ed0d99db --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class AmendmentFormFieldRequest { + + private String fieldId; + + private Object fieldValue; + + private Boolean isValid; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java index 6973254d..96f96f42 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java @@ -7,6 +7,6 @@ import lombok.Data; @Data public class ApplicationAmendmentRequestBean { private String note; - private List applicationFormFields; + private List applicationFormFields; private List amendmentDocuments; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java index df29c1d8..21b4a5ba 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java @@ -10,6 +10,7 @@ public class ApplicationEvaluationRequest { private List criteria; private List checklist; private List files; + private List amendmentDetails; private String note; private ApplicationStatusForEvaluation applicationStatus; private String motivation; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java new file mode 100644 index 00000000..4a2f2597 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.util.List; + +@Data +public class AmendmentDocumentResponseBean { + + Long amendmentId; + + List amendmentDocuments; + + List formFieldDocuments; +} 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 a3d32624..b890b327 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -22,6 +22,7 @@ public class ApplicationEvaluationResponse { private List checklist; private List files; private List evaluationDocument; + private List amendmentDetails; private LocalDateTime createdDate; private LocalDateTime updatedDate; private String beneficiary; From 0bdc5f6fce54bdac50b6f04b3a6b85fcbfa8b666 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 13 Dec 2024 13:48:46 +0530 Subject: [PATCH 17/33] Updated code --- .../dao/ApplicationAmendmentRequestDao.java | 2 +- .../tendermanagement/dao/ApplicationEvaluationDao.java | 3 ++- .../net/gepafin/tendermanagement/dao/DocumentDao.java | 8 ++++++++ .../tendermanagement/enums/UserActionContextEnum.java | 4 ++++ .../web/rest/api/ApplicationEvaluationApi.java | 4 ++-- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index d762ae3e..cb9f39e8 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -272,7 +272,7 @@ public class ApplicationAmendmentRequestDao { String formFieldsJson = Utils.convertObjectToJson(formFieldRequestBean); applicationAmendmentRequestEntity.setFormFields(formFieldsJson); } - if(Boolean.FALSE.equals(applicationAmendmentRequest.getAmendmentDocument().isEmpty())) { + if(applicationAmendmentRequest.getAmendmentDocument()!=null || Boolean.FALSE.equals(applicationAmendmentRequest.getAmendmentDocument().isEmpty())) { setAmendmentDocuments(applicationAmendmentRequest.getAmendmentDocument(), applicationAmendmentRequestEntity); } List amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(applicationEvaluationEntity.getId()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 7845a565..bd08434e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -582,10 +582,11 @@ public class ApplicationEvaluationDao { applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); // Fetch amendment details from the request + if(req.getAmendmentDetails()!=null) { List amendmentDetailsRequests = req.getAmendmentDetails(); updateAmendmentDocumentsAndFormFields(applicationAmendmentRequestEntities, amendmentDetailsRequests); - +} ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(entity); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index bf229f19..e1dbe853 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -121,6 +121,14 @@ public class DocumentDao { userActionContext = UserActionContextEnum.UPLOAD_APPLICATION_DOCUMENT; } else if (fileType.equals(DocumentTypeEnum.IMAGES) && sourceType.equals(DocumentSourceTypeEnum.APPLICATION)) { userActionContext = UserActionContextEnum.UPLOAD_APPLICATION_IMAGES; + }else if (fileType.equals(DocumentTypeEnum.DOCUMENT) && sourceType.equals(DocumentSourceTypeEnum.AMENDMENT)) { + userActionContext = UserActionContextEnum.UPLOAD_AMENDMENT_DOCUMENT; + } else if (fileType.equals(DocumentTypeEnum.IMAGES) && sourceType.equals(DocumentSourceTypeEnum.AMENDMENT)) { + userActionContext = UserActionContextEnum.UPLOAD_AMENDMENT_IMAGES; + }else if (fileType.equals(DocumentTypeEnum.DOCUMENT) && sourceType.equals(DocumentSourceTypeEnum.EVALUATION)) { + userActionContext = UserActionContextEnum.UPLOAD_EVALUATION_DOCUMENT; + } else if (fileType.equals(DocumentTypeEnum.IMAGES) && sourceType.equals(DocumentSourceTypeEnum.EVALUATION)) { + userActionContext = UserActionContextEnum.UPLOAD_EVALUATION_IMAGES; } return userActionContext; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 6f518462..20f917fe 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -118,6 +118,10 @@ public enum UserActionContextEnum { UPDATE_DOCUMENT("UPDATE_DOCUEMENT"), UPDATE_IMAGES("UPDATE_IMAGES"), GET_DOCUMENT("GET_DOCUMENT"), + UPLOAD_AMENDMENT_DOCUMENT("UPLOAD_AMENDMENT_DOCUMENT"), + UPLOAD_AMENDMENT_IMAGES("UPLOAD_AMENDMENT_IMAGES"), + UPLOAD_EVALUATION_DOCUMENT("UPLOAD_EVALUATION_DOCUMENT"), + UPLOAD_EVALUATION_IMAGES("UPLOAD_EVALUATION_IMAGES"), /** Assigned flow context **/ CREATE_UPDATE_FLOW("CREATE_UPDATE_FLOW"), 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 07321792..1255f3df 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 @@ -65,9 +65,9 @@ public interface ApplicationEvaluationApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PutMapping(value = "/assignedApplicationId/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PutMapping(value = "/assignedApplication/{assignedApplicationId}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) ResponseEntity> updateApplicationEvaluation(HttpServletRequest request, - @Parameter(description = "The AssignedApplication id", required = true) @PathVariable("id") Long id, + @Parameter(description = "The AssignedApplication id", required = true) @PathVariable("assignedApplicationId") Long assignedApplicationId, @Parameter(description = "Application Evaluation request object", required = true) @Valid @RequestBody List applicationEvaluationDocRequest); From f6a6c6398ac84dfe9337c7e53c5288e5342b71bf Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 13 Dec 2024 15:11:24 +0530 Subject: [PATCH 18/33] Updated application evaluation code --- .../dao/ApplicationEvaluationDao.java | 4 +++- .../request/ApplicationEvaluationRequest.java | 1 + .../service/ApplicationEvaluationService.java | 1 - .../impl/ApplicationEvaluationServiceImpl.java | 6 ------ .../web/rest/api/ApplicationEvaluationApi.java | 16 ---------------- .../impl/ApplicationEvaluationApiController.java | 10 ---------- 6 files changed, 4 insertions(+), 34 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index bd08434e..62323d65 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -580,7 +580,9 @@ public class ApplicationEvaluationDao { // Fetch all amendment request entities associated with the evaluation ID List applicationAmendmentRequestEntities = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); - + if(req.getEvaluationDocument()!=null) { + updateApplicationEvaluation(assignedApplicationId, req.getEvaluationDocument()); + } // Fetch amendment details from the request if(req.getAmendmentDetails()!=null) { List amendmentDetailsRequests = req.getAmendmentDetails(); diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java index 21b4a5ba..6616c288 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java @@ -10,6 +10,7 @@ public class ApplicationEvaluationRequest { private List criteria; private List checklist; private List files; + private List evaluationDocument; private List amendmentDetails; private String note; private ApplicationStatusForEvaluation applicationStatus; diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index 5bdf5c14..454030af 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -21,5 +21,4 @@ public interface ApplicationEvaluationService { ApplicationEvaluationEntity validateApplicationEvaluationByApplicationId(Long applicationId); - ApplicationEvaluationResponse updateApplicationEvaluation(HttpServletRequest request , Long assignedApplicationId, List applicationEvaluationDocRequest); } 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 503f1513..3dd9035f 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -78,10 +78,4 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe return applicationEvaluationDao.validateApplicationEvaluationByApplicationId(applicationId); } - @Override - public ApplicationEvaluationResponse updateApplicationEvaluation(HttpServletRequest request, Long assignedApplicationId, List evaluationDocRequest) { - AssignedApplicationsEntity assignedApplication =assignedApplicationsService.validateAssignedApplication(assignedApplicationId); - validator.validatePreInstructor(request, assignedApplication.getUserId()); - return applicationEvaluationDao.updateApplicationEvaluation(assignedApplicationId,evaluationDocRequest); - } } 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 1255f3df..9d168955 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 @@ -55,21 +55,5 @@ public interface ApplicationEvaluationApi { ResponseEntity> deleteApplicationEvaluation(HttpServletRequest request, @Parameter( required = true) @PathVariable("id") Long id); - @Operation(summary = "Api to upload Documents for evaluation", - 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 = "/assignedApplication/{assignedApplicationId}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - ResponseEntity> updateApplicationEvaluation(HttpServletRequest request, - @Parameter(description = "The AssignedApplication id", required = true) @PathVariable("assignedApplicationId") Long assignedApplicationId, - @Parameter(description = "Application Evaluation request object", required = true) @Valid @RequestBody List applicationEvaluationDocRequest); - - } 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 403e826a..b299ecc2 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 @@ -82,15 +82,5 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_DELETED_SUCCESSFULLY))); } - @Override - public ResponseEntity> updateApplicationEvaluation(HttpServletRequest request, Long id, List applicationEvaluationDocRequest) { - /** This code is responsible for "Upload Evaluation Document" operation. **/ - loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE) - .actionContext(UserActionContextEnum.UPLOAD_EVALUATION_DOC).build()); - - ApplicationEvaluationResponse updateApplicationEvaluationResponse = applicationEvaluationService.updateApplicationEvaluation(request, id, applicationEvaluationDocRequest); - return ResponseEntity.status(HttpStatus.CREATED) - .body(new Response<>(updateApplicationEvaluationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_UPDATE_SUCCESSFULLY_MSG))); - } } From 8606e224567b5cec5f87657a88be42d2b3bc5bd6 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 13 Dec 2024 15:17:16 +0530 Subject: [PATCH 19/33] Updated code for amendment docs --- .../dao/ApplicationAmendmentRequestDao.java | 8 +++----- .../model/request/ApplicationAmendmentRequest.java | 1 - 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index cb9f39e8..10d08e53 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -272,9 +272,6 @@ public class ApplicationAmendmentRequestDao { String formFieldsJson = Utils.convertObjectToJson(formFieldRequestBean); applicationAmendmentRequestEntity.setFormFields(formFieldsJson); } - if(applicationAmendmentRequest.getAmendmentDocument()!=null || Boolean.FALSE.equals(applicationAmendmentRequest.getAmendmentDocument().isEmpty())) { - setAmendmentDocuments(applicationAmendmentRequest.getAmendmentDocument(), applicationAmendmentRequestEntity); - } List amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(applicationEvaluationEntity.getId()); // Ensure startDate and initialDays are not null to avoid NullPointerException if (amendmentRequest !=null && amendmentRequest.isEmpty() && applicationEvaluationEntity.getStartDate() != null && applicationEvaluationEntity.getInitialDays() != null ) { @@ -579,8 +576,9 @@ public class ApplicationAmendmentRequestDao { existingApplicationAmendment.setFormFields(Utils.convertListToJsonString(amendmentFormFieldMap.values().stream().toList())); } existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - - setAmendmentDocuments(updateRequest.getAmendmentDocuments(),existingApplicationAmendment); + if(updateRequest.getAmendmentDocuments()!=null && Boolean.FALSE.equals(updateRequest.getAmendmentDocuments().isEmpty())) { + setAmendmentDocuments(updateRequest.getAmendmentDocuments(), existingApplicationAmendment); + } ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment,oldApplicationAmendmentEntity,VersionActionTypeEnum.UPDATE); ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment); log.info("Application Amendment updated successfully: {}", response); diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java index 97e74446..ade4c676 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequest.java @@ -11,5 +11,4 @@ public class ApplicationAmendmentRequest { private Long responseDays; private Boolean isSendNotification; private Boolean isSendEmail; - private List amendmentDocument; } From 01421778bce1e74fd084bb616dbeb78433145b6d Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 13 Dec 2024 15:35:04 +0530 Subject: [PATCH 20/33] Updated code --- .../tendermanagement/dao/ApplicationEvaluationDao.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 62323d65..694d196b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -565,9 +565,15 @@ public class ApplicationEvaluationDao { if (existingEntityOptional.isPresent()) { entity = existingEntityOptional.get(); oldApplicationEvaluation = Utils.getClonedEntityForData(entity); + if(req.getCriteria()!=null) { entity.setCriteria(Utils.convertObjectToJson(processCriteria(entity, req))); + } + if(req.getChecklist()!=null) { entity.setChecklist(Utils.convertObjectToJson(processChecklist(entity, req))); + } + if(req.getFiles()!=null) { entity.setFile(Utils.convertObjectToJson(processField(entity, req))); + } entity.setIsDeleted(false); setIfUpdated(entity::getNote, entity::setNote, req.getNote()); setIfUpdated(entity::getMotivation, entity::setMotivation, req.getMotivation()); From d6a2521a576db19ff7886855d832891707944127 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 13 Dec 2024 15:47:11 +0530 Subject: [PATCH 21/33] Updated code --- .../dao/ApplicationAmendmentRequestDao.java | 6 +++--- .../dao/ApplicationEvaluationDao.java | 13 ++++++++----- .../model/request/AmendmentFieldRequest.java | 2 +- .../model/request/AmendmentFormField.java | 2 +- .../model/request/AmendmentFormFieldRequest.java | 2 +- .../model/response/AmendmentDocumentResponse.java | 2 +- 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 10d08e53..24a9a72f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -375,7 +375,7 @@ public class ApplicationAmendmentRequestDao { AmendmentDocumentResponse amendmentDocumentResponse = new AmendmentDocumentResponse(); amendmentDocumentResponse.setFieldId(amendmentFieldRequest.getFieldId()); amendmentDocumentResponse.setNameValue(amendmentFieldRequest.getNameValue()); - amendmentDocumentResponse.setIsValid(amendmentFieldRequest.getIsValid()); + amendmentDocumentResponse.setValid(amendmentFieldRequest.getValid()); DocumentEntity documentEntity = documentService.validateDocument(Long.valueOf(amendmentFieldRequest.getFileValue())); DocumentResponseBean responseBean = applicationEvaluationDao.createDocumentResponseBean(documentEntity); @@ -660,7 +660,7 @@ public class ApplicationAmendmentRequestDao { if (!existingDocumentIds.isEmpty()) { existingDocumentIds.forEach(this::softDeleteDocument); amendmentFormField.setFieldValue(null); - amendmentFormField.setIsValid(applicationFormFieldRequest.getIsValid()); + amendmentFormField.setValid(applicationFormFieldRequest.getValid()); // setIsUploadedBy(amendmentFormField); } return; @@ -675,7 +675,7 @@ public class ApplicationAmendmentRequestDao { if (!newFieldValue.equals(amendmentFormField.getFieldValue())) { amendmentFormField.setFieldValue(newFieldValue); - amendmentFormField.setIsValid(applicationFormFieldRequest.getIsValid()); + amendmentFormField.setValid(applicationFormFieldRequest.getValid()); // setIsUploadedBy(amendmentFormField); } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 62323d65..99b6079e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -176,7 +176,7 @@ public class ApplicationEvaluationDao { FieldResponse fieldResponse=new FieldResponse(); fieldResponse.setId(amendmentFormField.getFieldId()); fieldResponse.setLabel(amendmentFormField.getLabel()); - fieldResponse.setValid(amendmentFormField.getIsValid()); + fieldResponse.setValid(amendmentFormField.getValid()); List fileIds=applicationAmendmentRequestDao.extractIds(amendmentFormField.getFieldValue()); List documentResponseBeans = fileIds.stream() .map(fileId -> createDocumentResponseBean(documentService.validateDocument(fileId))) // Create DocumentResponseBean for each fileId @@ -619,8 +619,11 @@ public class ApplicationEvaluationDao { // Map amendment details for quick lookup by amendment ID Map> amendmentDetailsMap = amendmentFormFields.stream() .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) - .collect(Collectors.toMap(AmendmentDetailsRequest::getAmendmentId, AmendmentDetailsRequest::getFormFieldDocuments)); - + .filter(details -> details.getFormFieldDocuments() != null) // Null check for getFormFieldDocuments + .collect(Collectors.toMap( + AmendmentDetailsRequest::getAmendmentId, + AmendmentDetailsRequest::getFormFieldDocuments + )); // Get corresponding amendment documents for the current entity List amendmentDocuments = amendmentDetailsMap.get(applicationAmendmentRequestEntity.getId()); if (amendmentDocuments != null) { @@ -629,7 +632,7 @@ public class ApplicationEvaluationDao { for (AmendmentFormFieldRequest newField : amendmentDocuments) { if (existingField.getFieldId().equals(newField.getFieldId())) { // Update fields if there are changes - Utils.setIfUpdated(existingField::getIsValid, existingField::setIsValid, newField.getIsValid()); + Utils.setIfUpdated(existingField::getValid, existingField::setValid, newField.getValid()); Utils.setIfUpdated(existingField::getFieldValue, existingField::setFieldValue, newField.getFieldValue()); updatedFormFields.add(existingField); @@ -666,7 +669,7 @@ public class ApplicationEvaluationDao { for (AmendmentFieldRequest newField : amendmentDocuments) { if (existingField.getFieldId().equals(newField.getFieldId())) { // Update fields if there are changes - Utils.setIfUpdated(existingField::getIsValid, existingField::setIsValid, newField.getIsValid()); + Utils.setIfUpdated(existingField::getValid, existingField::setValid, newField.getValid()); Utils.setIfUpdated(existingField::getFileValue, existingField::setFileValue, newField.getFileValue()); Utils.setIfUpdated(existingField::getNameValue, existingField::setNameValue, newField.getNameValue()); diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFieldRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFieldRequest.java index 99de2df0..b7efa539 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFieldRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFieldRequest.java @@ -8,6 +8,6 @@ public class AmendmentFieldRequest { private String fieldId; private String nameValue; private String fileValue; - private Boolean isValid = false; + private Boolean valid = false; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java index 0eaee1f3..35b3521a 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java @@ -13,7 +13,7 @@ public class AmendmentFormField { private String fieldValue; - private Boolean isValid; + private Boolean valid; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java index ed0d99db..d144b283 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java @@ -9,5 +9,5 @@ public class AmendmentFormFieldRequest { private Object fieldValue; - private Boolean isValid; + private Boolean valid; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java index 7fb1b220..528b3492 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java @@ -8,5 +8,5 @@ public class AmendmentDocumentResponse { private String fieldId; private String nameValue; private DocumentResponseBean fileValue; - private Boolean isValid = false; + private Boolean valid = false; } From 709d40e032e935a398f102371e2e5a1713c7259d Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 13 Dec 2024 17:48:02 +0530 Subject: [PATCH 22/33] Updated code for file detail in amendment --- .../dao/ApplicationAmendmentRequestDao.java | 10 ++++++---- .../model/response/AmendmentDocumentResponse.java | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 24a9a72f..5ef0044c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -376,10 +376,12 @@ public class ApplicationAmendmentRequestDao { amendmentDocumentResponse.setFieldId(amendmentFieldRequest.getFieldId()); amendmentDocumentResponse.setNameValue(amendmentFieldRequest.getNameValue()); amendmentDocumentResponse.setValid(amendmentFieldRequest.getValid()); - - DocumentEntity documentEntity = documentService.validateDocument(Long.valueOf(amendmentFieldRequest.getFileValue())); - DocumentResponseBean responseBean = applicationEvaluationDao.createDocumentResponseBean(documentEntity); - amendmentDocumentResponse.setFileValue(responseBean); + amendmentDocumentResponse.setFileValue(null); + if(amendmentFieldRequest.getFileValue()!=null) { + DocumentEntity documentEntity = documentService.validateDocument(Long.valueOf(amendmentFieldRequest.getFileValue())); + DocumentResponseBean responseBean = applicationEvaluationDao.createDocumentResponseBean(documentEntity); + amendmentDocumentResponse.setFileValue(List.of(responseBean)); + } return amendmentDocumentResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java index 528b3492..45680a64 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java @@ -2,11 +2,13 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; +import java.util.List; + @Data public class AmendmentDocumentResponse { private String fieldId; private String nameValue; - private DocumentResponseBean fileValue; + private List fileValue; private Boolean valid = false; } From 7ad6e6c2cccd096afe23aaf590ff72f8c4997ff2 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 13 Dec 2024 17:54:42 +0530 Subject: [PATCH 23/33] Updated code --- .../tendermanagement/dao/ApplicationEvaluationDao.java | 3 ++- .../model/response/EvaluationDocumentResponse.java | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 5a181400..db0ddcbc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -204,7 +204,8 @@ public class ApplicationEvaluationDao { documentResponseBean.setFilePath(documentEntity.getFilePath()); documentResponseBean.setCreatedDate(documentEntity.getCreatedDate()); documentResponseBean.setUpdatedDate(documentEntity.getUpdatedDate()); - evaluationDocResponse.setFileValue(documentResponseBean); + documentResponseBean.setDocumentAttachmentId(documentEntity.getDocumentAttachmentId()); + evaluationDocResponse.setFileValue(List.of(documentResponseBean)); evaluationDocResponse.setNameValue(doc.getNameValue()); evaluationDocResponse.setValid(doc.getValid()); evaluationDocResponse.setFieldId(doc.getFieldId()); diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationDocumentResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationDocumentResponse.java index aea34514..94a4d881 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationDocumentResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/EvaluationDocumentResponse.java @@ -2,11 +2,13 @@ package net.gepafin.tendermanagement.model.response; import lombok.Data; +import java.util.List; + @Data public class EvaluationDocumentResponse { private String fieldId; private String nameValue; private Boolean valid; - private DocumentResponseBean fileValue ; + private List fileValue ; } From ee70279eec1792b7259d9f8eae385209f19e8ed4 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 13 Dec 2024 20:18:40 +0530 Subject: [PATCH 24/33] Updated code --- .../dao/ApplicationAmendmentRequestDao.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 5ef0044c..3ac34c8e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -355,12 +355,14 @@ public class ApplicationAmendmentRequestDao { List forms = applicationFormRepository.findByApplicationId(applicationAmendmentRequestEntity.getApplicationId()); Map fieldIdToLabelMap = extractFieldIdToLabelMap(forms); - + List amendmentFieldRequests= new ArrayList<>(); List amendmentFormFields = Utils.convertJsonStringToList( applicationAmendmentRequestEntity.getFormFields(), AmendmentFormField.class); Map formFieldEntityMap = getApplicationFormFieldEntityMap(applicationAmendmentRequestEntity, amendmentFormFields); - List amendmentFieldRequests = Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(),AmendmentFieldRequest.class); - if (amendmentFieldRequests != null) { + if(applicationAmendmentRequestEntity.getAmendmentDocument() !=null ){ + amendmentFieldRequests = Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(),AmendmentFieldRequest.class); + } + if (amendmentFieldRequests != null) { List amendmentDocumentResponses = amendmentFieldRequests.stream() .map(this::createAmendmentDocumentResponse) .toList(); From f0c28c434977434b093c4164c646c7bf03c9c4a0 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 13 Dec 2024 20:34:51 +0530 Subject: [PATCH 25/33] Updated code --- .../gepafin/tendermanagement/dao/ApplicationEvaluationDao.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index db0ddcbc..9d7a6daa 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -19,6 +19,7 @@ import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -156,7 +157,7 @@ public class ApplicationEvaluationDao { amendmentDocumentResponseBean.setAmendmentId(applicationAmendmentRequestEntity.getId()); String amendmentDocument=applicationAmendmentRequestEntity.getAmendmentDocument(); String formField=applicationAmendmentRequestEntity.getFormFields(); - if (amendmentDocument != null) { + if (Boolean.FALSE.equals(StringUtils.isEmpty(amendmentDocument))) { List amendmentFieldRequests=Utils.convertJsonStringToList(amendmentDocument,AmendmentFieldRequest.class); List amendmentDocumentResponses = amendmentFieldRequests.stream() .map(applicationAmendmentRequestDao::createAmendmentDocumentResponse) From d7302e6f4ed65a62dfa13f082b7ff514bf2464dc Mon Sep 17 00:00:00 2001 From: rajesh Date: Sat, 14 Dec 2024 12:11:10 +0530 Subject: [PATCH 26/33] Fixed application form issue --- .../tendermanagement/dao/ApplicationDao.java | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 203b4f3c..8cbf5d64 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -455,8 +455,9 @@ public class ApplicationDao { if (applicationFormFieldEntities == null || applicationFormFieldEntities.isEmpty()) { applicationFormFieldEntity.setApplicationForm(applicationFormEntity); } else { + applicationFormFieldEntity.setApplicationForm(applicationFormEntity); for (ApplicationFormFieldEntity applicationFormFieldEntity1 : applicationFormFieldEntities) { - if (applicationFormFieldEntity1.getFieldId().equals(applicationFormFieldRequestBean.getFieldId())) { + if (applicationFormFieldEntity1.getFieldId().equals(applicationFormFieldRequestBean.getFieldId()) && checkIfRequestFieldIsDifferent(applicationFormFieldEntity1, applicationFormFieldRequestBean)) { applicationFormFieldEntity = applicationFormFieldEntity1; oldApplicationFormFieldData = Utils.getClonedEntityForData(applicationFormFieldEntity); if (applicationFormEntity.getForm().getId().equals(applicationFormEntity.getApplication().getCall().getInitialForm())) { @@ -464,8 +465,6 @@ public class ApplicationDao { } actionType = VersionActionTypeEnum.UPDATE; break; - } else { - applicationFormFieldEntity.setApplicationForm(applicationFormEntity); } } } @@ -495,7 +494,30 @@ public class ApplicationDao { return applicationFormField; } - void updateDocumentDeletionStatus(ApplicationFormFieldEntity applicationFormFieldEntity, ApplicationFormFieldRequestBean applicationFormFieldRequestBean, FormEntity formEntity, List newDocumentIds, + private Boolean checkIfRequestFieldIsDifferent(ApplicationFormFieldEntity applicationFormFieldEntity, + ApplicationFormFieldRequestBean applicationFormFieldRequestBean) { + + // Retrieve the field values from both objects + String entityFieldValue = applicationFormFieldEntity.getFieldValue(); + Object requestFieldValue = applicationFormFieldRequestBean.getFieldValue(); + + // Check if both are null + if (entityFieldValue == null && requestFieldValue == null) { + return false; // No difference if both are null + } + + // Compare values + Boolean check = !Objects.equals(entityFieldValue, requestFieldValue); + + // Additional comparison if both are non-null + if (Boolean.TRUE.equals(check) && entityFieldValue != null && requestFieldValue != null) { + check = !entityFieldValue.equals(requestFieldValue.toString()); + } + + return check; + } + + void updateDocumentDeletionStatus(ApplicationFormFieldEntity applicationFormFieldEntity, ApplicationFormFieldRequestBean applicationFormFieldRequestBean, FormEntity formEntity, List newDocumentIds, List preInstructorDocumentId,boolean isPreInstructor) { if (newDocumentIds == null) { newDocumentIds = Collections.emptyList(); From d7c656f39ee1b6f496fcf079f393092f0b3ef938 Mon Sep 17 00:00:00 2001 From: rajesh Date: Sat, 14 Dec 2024 12:40:40 +0530 Subject: [PATCH 27/33] updated code --- .../net/gepafin/tendermanagement/dao/ApplicationDao.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 8cbf5d64..3b1a11b3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -455,16 +455,17 @@ public class ApplicationDao { if (applicationFormFieldEntities == null || applicationFormFieldEntities.isEmpty()) { applicationFormFieldEntity.setApplicationForm(applicationFormEntity); } else { - applicationFormFieldEntity.setApplicationForm(applicationFormEntity); for (ApplicationFormFieldEntity applicationFormFieldEntity1 : applicationFormFieldEntities) { - if (applicationFormFieldEntity1.getFieldId().equals(applicationFormFieldRequestBean.getFieldId()) && checkIfRequestFieldIsDifferent(applicationFormFieldEntity1, applicationFormFieldRequestBean)) { + if (applicationFormFieldEntity1.getFieldId().equals(applicationFormFieldRequestBean.getFieldId())) { applicationFormFieldEntity = applicationFormFieldEntity1; oldApplicationFormFieldData = Utils.getClonedEntityForData(applicationFormFieldEntity); - if (applicationFormEntity.getForm().getId().equals(applicationFormEntity.getApplication().getCall().getInitialForm())) { + if (applicationFormEntity.getForm().getId().equals(applicationFormEntity.getApplication().getCall().getInitialForm()) && checkIfRequestFieldIsDifferent(applicationFormFieldEntity1, applicationFormFieldRequestBean)) { validateRequiredFields(applicationFormEntity.getForm(), applicationFormEntity.getApplication(), applicationFormFieldRequestBean.getFieldId()); } actionType = VersionActionTypeEnum.UPDATE; break; + } else { + applicationFormFieldEntity.setApplicationForm(applicationFormEntity); } } } From 94086428e8b4f9a13d0a56eaa86322dce552996d Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 16 Dec 2024 14:46:34 +0530 Subject: [PATCH 28/33] Disable auto email sending --- .../scheduler/ApplicationAmendmentScheduler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationAmendmentScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationAmendmentScheduler.java index a3112a1c..56cb3663 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationAmendmentScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationAmendmentScheduler.java @@ -85,7 +85,7 @@ public class ApplicationAmendmentScheduler { /** This code is responsible for adding a version history log for the "Update Application Amendment" operation. **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(httpServletRequest).actionType(VersionActionTypeEnum.UPDATE).oldData(oldAmendmentRequestEntity).newData(request).build()); - emailNotificationDao.sendApplicationFailureNotificationEmail(request); +// emailNotificationDao.sendApplicationFailureNotificationEmail(request); log.info("Updated status to CLOSED for ApplicationAmendmentRequest with ID: {}", request.getId()); } catch (Exception e) { log.error("Error expiring ApplicationAmendmentRequest with ID {}: {}", request.getId(), e.getMessage(), From 47f67975c17f2e13ed59bc4e23a042e0c81faa04 Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 18 Dec 2024 15:58:17 +0530 Subject: [PATCH 29/33] Amendment document changes --- .../dao/ApplicationAmendmentRequestDao.java | 103 +++++++++++++----- .../dao/ApplicationEvaluationDao.java | 99 ++++++++++++----- .../request/AmendmentDetailsRequest.java | 6 +- .../ApplicationAmendmentRequestBean.java | 3 +- .../AmendmentDetailsResponseBean.java | 12 ++ .../response/AmendmentDocumentResponse.java | 14 --- .../AmendmentDocumentResponseBean.java | 6 +- .../ApplicationAmendmentRequestResponse.java | 4 +- 8 files changed, 167 insertions(+), 80 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDetailsResponseBean.java delete mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 3ac34c8e..f44a0257 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -108,6 +108,9 @@ public class ApplicationAmendmentRequestDao { @Autowired private ApplicationEvaluationDao applicationEvaluationDao; + @Autowired + private DocumentRepository documentRepository; + public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(Long applicationEvaluationId) { log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); @@ -330,15 +333,24 @@ public class ApplicationAmendmentRequestDao { return applicationAmendment; } + private void setAmendmentDocuments(String amendmentNotes, String amendmentFieldRequest, + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity) { + AmendmentDetailsResponseBean amendmentDetails = new AmendmentDetailsResponseBean(); + if (amendmentFieldRequest != null && !amendmentFieldRequest.trim().isEmpty()) { + String[] documentIds = amendmentFieldRequest.split(","); + String validDocumentIds = Arrays.stream(documentIds) + .map(String::trim) + .filter(id -> !id.isEmpty()) + .collect(Collectors.joining(",")); - private void setAmendmentDocuments(List amendmentFieldRequest, ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity) { - amendmentFieldRequest.stream().forEach(amendmentData->{ - String fieldValue=amendmentData.getFileValue(); - if(fieldValue!=null){ - documentService.validateDocument(Long.valueOf(fieldValue)); - } - }); - applicationAmendmentRequestEntity.setAmendmentDocument(Utils.convertListToJsonString(amendmentFieldRequest)); + amendmentDetails.setAmendmentDocuments(validDocumentIds); + } + if (amendmentNotes != null && !amendmentNotes.trim().isEmpty()) { + amendmentDetails.setAmendmentNotes(amendmentNotes.trim()); + } + amendmentDetails.setValid(null); + String amendmentDetailsJson = Utils.convertListToJsonString(Collections.singletonList(amendmentDetails)); + applicationAmendmentRequestEntity.setAmendmentDocument(amendmentDetailsJson); } public ApplicationAmendmentRequestEntity saveApplicationAmendmentRequestEntity(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity,ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity,VersionActionTypeEnum actionTypeEnum) { @@ -355,39 +367,70 @@ public class ApplicationAmendmentRequestDao { List forms = applicationFormRepository.findByApplicationId(applicationAmendmentRequestEntity.getApplicationId()); Map fieldIdToLabelMap = extractFieldIdToLabelMap(forms); - List amendmentFieldRequests= new ArrayList<>(); +// List amendmentFieldRequests= new ArrayList<>(); List amendmentFormFields = Utils.convertJsonStringToList( applicationAmendmentRequestEntity.getFormFields(), AmendmentFormField.class); Map formFieldEntityMap = getApplicationFormFieldEntityMap(applicationAmendmentRequestEntity, amendmentFormFields); - if(applicationAmendmentRequestEntity.getAmendmentDocument() !=null ){ - amendmentFieldRequests = Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(),AmendmentFieldRequest.class); - } - if (amendmentFieldRequests != null) { - List amendmentDocumentResponses = amendmentFieldRequests.stream() - .map(this::createAmendmentDocumentResponse) - .toList(); - response.setAmendmentDocuments(amendmentDocumentResponses); + if (applicationAmendmentRequestEntity.getAmendmentDocument() != null) { + + List amendmentDetailsList = + Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(), + AmendmentDetailsResponseBean.class); + List documentResponseBeans = new ArrayList<>(); + for (AmendmentDetailsResponseBean amendmentDetails:amendmentDetailsList) { + if (amendmentDetails.getAmendmentDocuments()!=null) { + // Extract the comma-separated document IDs as a string + String documentIdsString = amendmentDetails.getAmendmentDocuments(); + + if (documentIdsString != null && !documentIdsString.trim().isEmpty()) { + // Split the comma-separated values and process them + List documentIds = Arrays.stream(documentIdsString.split(",")) + .map(String::trim) + .filter(id -> !id.isEmpty()) + .collect(Collectors.toList()); + + documentResponseBeans.addAll( + documentIds.stream() + .map(id -> { + try { + return createDocumentResponseBean(id); // Convert to Long + } catch (NumberFormatException e) { + // Handle invalid document IDs gracefully + return null; + } + }) + .filter(Objects::nonNull) // Skip null responses + .collect(Collectors.toList()) + ); + response.setAmendmentNotes(amendmentDetails.getAmendmentNotes()); + response.setValid(amendmentDetails.getValid()!=null?amendmentDetails.getValid():null); + } + } + + } + + response.setAmendmentDocuments(documentResponseBeans); + + } + + processFormFields(amendmentFormFields, fieldIdToLabelMap, formFieldEntityMap, response); return response; } - public AmendmentDocumentResponse createAmendmentDocumentResponse(AmendmentFieldRequest amendmentFieldRequest) { - AmendmentDocumentResponse amendmentDocumentResponse = new AmendmentDocumentResponse(); - amendmentDocumentResponse.setFieldId(amendmentFieldRequest.getFieldId()); - amendmentDocumentResponse.setNameValue(amendmentFieldRequest.getNameValue()); - amendmentDocumentResponse.setValid(amendmentFieldRequest.getValid()); - amendmentDocumentResponse.setFileValue(null); - if(amendmentFieldRequest.getFileValue()!=null) { - DocumentEntity documentEntity = documentService.validateDocument(Long.valueOf(amendmentFieldRequest.getFileValue())); - DocumentResponseBean responseBean = applicationEvaluationDao.createDocumentResponseBean(documentEntity); - amendmentDocumentResponse.setFileValue(List.of(responseBean)); - } + public DocumentResponseBean createDocumentResponseBean(String documentId) { - return amendmentDocumentResponse; + if (!StringUtils.isEmpty(documentId)) { + Optional documentEntity = documentRepository.findByIdAndNotDeleted(Long.valueOf(documentId)); + if(documentEntity.isPresent()){ + return applicationEvaluationDao.createDocumentResponseBean(documentEntity.get()); + }} + return null; } + private ApplicationAmendmentRequestResponse initializeBasicResponse(ApplicationAmendmentRequestEntity entity) { ApplicationAmendmentRequestResponse response = new ApplicationAmendmentRequestResponse(); response.setId(entity.getId()); @@ -581,7 +624,7 @@ public class ApplicationAmendmentRequestDao { } existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); if(updateRequest.getAmendmentDocuments()!=null && Boolean.FALSE.equals(updateRequest.getAmendmentDocuments().isEmpty())) { - setAmendmentDocuments(updateRequest.getAmendmentDocuments(), existingApplicationAmendment); + setAmendmentDocuments(updateRequest.getAmendmentNotes(),updateRequest.getAmendmentDocuments(), existingApplicationAmendment); } ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment,oldApplicationAmendmentEntity,VersionActionTypeEnum.UPDATE); ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 9d7a6daa..244c30fa 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -157,12 +157,21 @@ public class ApplicationEvaluationDao { amendmentDocumentResponseBean.setAmendmentId(applicationAmendmentRequestEntity.getId()); String amendmentDocument=applicationAmendmentRequestEntity.getAmendmentDocument(); String formField=applicationAmendmentRequestEntity.getFormFields(); - if (Boolean.FALSE.equals(StringUtils.isEmpty(amendmentDocument))) { - List amendmentFieldRequests=Utils.convertJsonStringToList(amendmentDocument,AmendmentFieldRequest.class); - List amendmentDocumentResponses = amendmentFieldRequests.stream() - .map(applicationAmendmentRequestDao::createAmendmentDocumentResponse) - .toList(); - amendmentDocumentResponseBean.setAmendmentDocuments(amendmentDocumentResponses); + List amendmentDetailsList = Utils.convertJsonStringToList(amendmentDocument, AmendmentDetailsResponseBean.class); + if (amendmentDetailsList != null && !amendmentDetailsList.isEmpty()) { + AmendmentDetailsResponseBean amendmentDetails = amendmentDetailsList.get(0); + if (amendmentDetails.getAmendmentDocuments() != null) { + List documentResponseBeans = Arrays.stream(amendmentDetails.getAmendmentDocuments().split(",")) + .map(String::trim) + .filter(id -> !id.isEmpty()) + .map(documentId -> applicationAmendmentRequestDao.createDocumentResponseBean(documentId)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + amendmentDocumentResponseBean.setAmendmentDocuments(documentResponseBeans); + } + amendmentDocumentResponseBean.setAmendmentNotes(amendmentDetails.getAmendmentNotes()); + amendmentDocumentResponseBean.setValid(amendmentDetails.getValid()); } List amendmentFormFields=Utils.convertJsonStringToList(formField,AmendmentFormField.class); amendmentDocumentResponseBean.setFormFieldDocuments(setFormFieldDocuments(amendmentFormFields)); @@ -657,39 +666,69 @@ public class ApplicationEvaluationDao { // Process amendment documents if present if (applicationAmendmentRequestEntity.getAmendmentDocument() != null) { - // Parse existing amendment fields from JSON - List existingAmendmentFields = - Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(), AmendmentFieldRequest.class); + String existingDocumentIds = applicationAmendmentRequestEntity.getAmendmentDocument(); - // Prepare a new list to hold updated amendment fields - List updatedAmendmentFields = new ArrayList<>(); + // Split comma-separated document IDs into a list + List existingDocumentIdList = Arrays.stream(existingDocumentIds.split(",")) + .map(String::trim) + .filter(id -> !id.isEmpty()) + .collect(Collectors.toList()); - // Map amendment details for quick lookup by amendment ID - Map> amendmentDetailsMap = amendmentFormFields.stream() + List updatedDocumentIdList = new ArrayList<>(); + Map amendmentDetailsMap = amendmentFormFields.stream() .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) - .collect(Collectors.toMap(AmendmentDetailsRequest::getAmendmentId, AmendmentDetailsRequest::getAmendmentDocuments)); + .collect(Collectors.toMap( + AmendmentDetailsRequest::getAmendmentId, + AmendmentDetailsRequest::getAmendmentDocuments + )); - // Get corresponding amendment documents for the current entity - List amendmentDocuments = amendmentDetailsMap.get(applicationAmendmentRequestEntity.getId()); - if (amendmentDocuments != null) { - // Update existing amendment fields with new values - for (AmendmentFieldRequest existingField : existingAmendmentFields) { - for (AmendmentFieldRequest newField : amendmentDocuments) { - if (existingField.getFieldId().equals(newField.getFieldId())) { - // Update fields if there are changes - Utils.setIfUpdated(existingField::getValid, existingField::setValid, newField.getValid()); - Utils.setIfUpdated(existingField::getFileValue, existingField::setFileValue, newField.getFileValue()); - Utils.setIfUpdated(existingField::getNameValue, existingField::setNameValue, newField.getNameValue()); + String amendmentDocumentIds = amendmentDetailsMap.get(applicationAmendmentRequestEntity.getId()); + if (amendmentDocumentIds != null) { + // Split and validate new document IDs + List newDocumentIdList = Arrays.stream(amendmentDocumentIds.split(",")) + .map(String::trim) + .filter(id -> !id.isEmpty()) + .collect(Collectors.toList()); - updatedAmendmentFields.add(existingField); - break; // Move to the next existing field + for (String existingId : existingDocumentIdList) { + for (String newId : newDocumentIdList) { + if (existingId.equals(newId)) { + Optional documentEntity = documentRepository.findByIdAndNotDeleted(Long.valueOf(newId)); + if(documentEntity.isPresent()) { + updatedDocumentIdList.add(newId); + break; + } } } } - // Convert updated fields back to JSON and save to the database - applicationAmendmentRequestEntity.setAmendmentDocument(Utils.convertListToJsonString(updatedAmendmentFields)); - applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); + // Add any new IDs not in the existing list + for (String newId : newDocumentIdList) { + if (!existingDocumentIdList.contains(newId)) { + Optional documentEntity = documentRepository.findByIdAndNotDeleted(Long.valueOf(newId)); + if(documentEntity.isPresent()) { + updatedDocumentIdList.add(newId); + } + } + } + String updatedDocumentIds = String.join(",", updatedDocumentIdList); + + // Create the AmendmentDetailsResponseBean for structured data + AmendmentDetailsResponseBean amendmentDetails = new AmendmentDetailsResponseBean(); + amendmentDetails.setAmendmentDocuments(updatedDocumentIds); + AmendmentDetailsRequest amendmentDetailsRequest = amendmentFormFields.stream() + .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) + .findFirst() + .orElse(null); + + if (amendmentDetailsRequest != null) { + amendmentDetails.setValid(amendmentDetailsRequest.getValid()); + } else { + amendmentDetails.setValid(false); + } + String amendmentDetailsJson = Utils.convertListToJsonString(Collections.singletonList(amendmentDetails)); + applicationAmendmentRequestEntity.setAmendmentDocument(amendmentDetailsJson); + applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); } } } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java index 691a5a20..dd44d257 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java @@ -1,8 +1,6 @@ package net.gepafin.tendermanagement.model.request; import lombok.Data; -import net.gepafin.tendermanagement.model.response.AmendmentDocumentResponse; -import net.gepafin.tendermanagement.model.response.FieldResponse; import java.util.List; @@ -11,7 +9,9 @@ public class AmendmentDetailsRequest { Long amendmentId; - List amendmentDocuments; + String amendmentDocuments; + + Boolean valid; List formFieldDocuments; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java index 96f96f42..7ab254d8 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java @@ -8,5 +8,6 @@ import lombok.Data; public class ApplicationAmendmentRequestBean { private String note; private List applicationFormFields; - private List amendmentDocuments; + private String amendmentDocuments; + private String amendmentNotes; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDetailsResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDetailsResponseBean.java new file mode 100644 index 00000000..eb9ee866 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDetailsResponseBean.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.util.List; +@Data +public class AmendmentDetailsResponseBean { + private String amendmentDocuments; + private String amendmentNotes; + private Boolean valid; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java deleted file mode 100644 index 45680a64..00000000 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.gepafin.tendermanagement.model.response; - -import lombok.Data; - -import java.util.List; - -@Data -public class AmendmentDocumentResponse { - - private String fieldId; - private String nameValue; - private List fileValue; - private Boolean valid = false; -} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java index 4a2f2597..96a88086 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java @@ -9,7 +9,11 @@ public class AmendmentDocumentResponseBean { Long amendmentId; - List amendmentDocuments; + List amendmentDocuments; + + Boolean valid; + + String amendmentNotes; List formFieldDocuments; } 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 0f77f602..01390777 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java @@ -21,7 +21,9 @@ public class ApplicationAmendmentRequestResponse { private String beneficiaryName; private List formFields; private List applicationFormFields; - private List amendmentDocuments; + private List amendmentDocuments; + private String amendmentNotes; + private Boolean valid; private Long applicationId; private Long applicationEvaluationId; private LocalDateTime evaluationEndDate; From 9c0acfb831f68b75e0a5e1d8f2c370ef58482bed Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 19 Dec 2024 17:02:23 +0530 Subject: [PATCH 30/33] Changes in application evaluation --- .../dao/ApplicationAmendmentRequestDao.java | 20 +- .../dao/ApplicationEvaluationDao.java | 316 ++++++++++-------- .../request/AmendmentDetailsRequest.java | 8 +- .../request/AmendmentFormFieldRequest.java | 4 + .../AmendmentDocumentResponseBean.java | 14 +- .../gepafin/tendermanagement/util/Utils.java | 22 ++ 6 files changed, 228 insertions(+), 156 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index f44a0257..9345b0da 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -349,7 +349,7 @@ public class ApplicationAmendmentRequestDao { amendmentDetails.setAmendmentNotes(amendmentNotes.trim()); } amendmentDetails.setValid(null); - String amendmentDetailsJson = Utils.convertListToJsonString(Collections.singletonList(amendmentDetails)); + String amendmentDetailsJson = Utils.convertObjectToString(amendmentDetails); applicationAmendmentRequestEntity.setAmendmentDocument(amendmentDetailsJson); } @@ -373,12 +373,13 @@ public class ApplicationAmendmentRequestDao { Map formFieldEntityMap = getApplicationFormFieldEntityMap(applicationAmendmentRequestEntity, amendmentFormFields); if (applicationAmendmentRequestEntity.getAmendmentDocument() != null) { - List amendmentDetailsList = - Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(), - AmendmentDetailsResponseBean.class); - List documentResponseBeans = new ArrayList<>(); - for (AmendmentDetailsResponseBean amendmentDetails:amendmentDetailsList) { - if (amendmentDetails.getAmendmentDocuments()!=null) { +// List amendmentDetailsList = +// Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(), +// AmendmentDetailsResponseBean.class); + AmendmentDetailsResponseBean amendmentDetails = Utils.convertStringToObject(applicationAmendmentRequestEntity.getAmendmentDocument() ,AmendmentDetailsResponseBean.class); + if(amendmentDetails!=null) { + List documentResponseBeans = new ArrayList<>(); + if (amendmentDetails.getAmendmentDocuments() != null) { // Extract the comma-separated document IDs as a string String documentIdsString = amendmentDetails.getAmendmentDocuments(); @@ -403,13 +404,12 @@ public class ApplicationAmendmentRequestDao { .collect(Collectors.toList()) ); response.setAmendmentNotes(amendmentDetails.getAmendmentNotes()); - response.setValid(amendmentDetails.getValid()!=null?amendmentDetails.getValid():null); + response.setValid(amendmentDetails.getValid()); } } - + response.setAmendmentDocuments(documentResponseBeans); } - response.setAmendmentDocuments(documentResponseBeans); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 244c30fa..0666930b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -22,9 +22,11 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import java.time.LocalDateTime; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @@ -157,9 +159,8 @@ public class ApplicationEvaluationDao { amendmentDocumentResponseBean.setAmendmentId(applicationAmendmentRequestEntity.getId()); String amendmentDocument=applicationAmendmentRequestEntity.getAmendmentDocument(); String formField=applicationAmendmentRequestEntity.getFormFields(); - List amendmentDetailsList = Utils.convertJsonStringToList(amendmentDocument, AmendmentDetailsResponseBean.class); - if (amendmentDetailsList != null && !amendmentDetailsList.isEmpty()) { - AmendmentDetailsResponseBean amendmentDetails = amendmentDetailsList.get(0); + AmendmentDetailsResponseBean amendmentDetails = Utils.convertStringToObject(amendmentDocument, AmendmentDetailsResponseBean.class); + if (amendmentDetails != null) { if (amendmentDetails.getAmendmentDocuments() != null) { List documentResponseBeans = Arrays.stream(amendmentDetails.getAmendmentDocuments().split(",")) .map(String::trim) @@ -168,33 +169,39 @@ public class ApplicationEvaluationDao { .filter(Objects::nonNull) .collect(Collectors.toList()); - amendmentDocumentResponseBean.setAmendmentDocuments(documentResponseBeans); + amendmentDocumentResponseBean.setFileDetail(documentResponseBeans); } - amendmentDocumentResponseBean.setAmendmentNotes(amendmentDetails.getAmendmentNotes()); + amendmentDocumentResponseBean.setLabel(amendmentDetails.getAmendmentNotes()); amendmentDocumentResponseBean.setValid(amendmentDetails.getValid()); } - List amendmentFormFields=Utils.convertJsonStringToList(formField,AmendmentFormField.class); - amendmentDocumentResponseBean.setFormFieldDocuments(setFormFieldDocuments(amendmentFormFields)); - amendmentDocumentResponseBeans.add(amendmentDocumentResponseBean); - } - response.setAmendmentDetails(amendmentDocumentResponseBeans); - } + List amendmentFormFields = Utils.convertJsonStringToList(formField, AmendmentFormField.class); + if (amendmentFormFields != null) { + for (AmendmentFormField amendmentFormField : amendmentFormFields) { + // Skip fields with null or empty fieldValue + if (StringUtils.isEmpty(amendmentFormField.getFieldValue())) { + continue; + } - private List setFormFieldDocuments(List amendmentFormFields) { - List fieldResponses=new ArrayList<>(); - for (AmendmentFormField amendmentFormField: amendmentFormFields){ - FieldResponse fieldResponse=new FieldResponse(); - fieldResponse.setId(amendmentFormField.getFieldId()); - fieldResponse.setLabel(amendmentFormField.getLabel()); - fieldResponse.setValid(amendmentFormField.getValid()); - List fileIds=applicationAmendmentRequestDao.extractIds(amendmentFormField.getFieldValue()); - List documentResponseBeans = fileIds.stream() - .map(fileId -> createDocumentResponseBean(documentService.validateDocument(fileId))) // Create DocumentResponseBean for each fileId - .collect(Collectors.toList()); // Collect all into a List - fieldResponse.setFileDetail(documentResponseBeans); - fieldResponses.add(fieldResponse); + AmendmentDocumentResponseBean formFieldResponseBean = new AmendmentDocumentResponseBean(); + formFieldResponseBean.setAmendmentId(applicationAmendmentRequestEntity.getId()); + formFieldResponseBean.setFieldId(amendmentFormField.getFieldId()); + formFieldResponseBean.setLabel(amendmentFormField.getLabel()); + formFieldResponseBean.setValid(amendmentFormField.getValid()); + + List fileIds = applicationAmendmentRequestDao.extractIds(amendmentFormField.getFieldValue()); + List documentResponseBeans = fileIds.stream() + .map(fileId -> createDocumentResponseBean(documentService.validateDocument(fileId))) + .collect(Collectors.toList()); + + formFieldResponseBean.setFileDetail(documentResponseBeans); + amendmentDocumentResponseBeans.add(formFieldResponseBean); + } + } + + amendmentDocumentResponseBeans.add(amendmentDocumentResponseBean); } - return fieldResponses; + + response.setAmendmentDetails(amendmentDocumentResponseBeans); } private void setEvaluationDocResponse(ApplicationEvaluationResponse response, List docRequest) { @@ -623,117 +630,162 @@ public class ApplicationEvaluationDao { private void updateAmendmentDocumentsAndFormFields(List applicationAmendmentRequestEntities, List amendmentFormFields) { // Iterate through amendment request entities - for (ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity : applicationAmendmentRequestEntities) { - // Process form fields if present - if (applicationAmendmentRequestEntity.getFormFields() != null) { - // Parse existing form fields from JSON - List existingFormFields = - Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getFormFields(), AmendmentFormFieldRequest.class); - // Prepare a new list to hold updated form fields - List updatedFormFields = new ArrayList<>(); +// + Map> amendmentFormFieldsMap = amendmentFormFields.stream().collect(Collectors.groupingBy(AmendmentDetailsRequest::getAmendmentId,HashMap::new,Collectors.toCollection(ArrayList::new))); +// amendmentFormFields.forEach(data->{ +// ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = applicationAmendmentRequestMap.get(data.getAmendmentId()); +// if (data.getFieldId().contains("amend_")){ +// updateAmendmentDocument(applicationAmendmentRequestEntity, data); +// } +// }); + applicationAmendmentRequestEntities.forEach(applicationAmendmentRequestEntity->{ + updateAmendment(applicationAmendmentRequestEntity, amendmentFormFieldsMap.get(applicationAmendmentRequestEntity.getId())); + }); + applicationAmendmentRequestRepository.saveAll(applicationAmendmentRequestEntities); - // Map amendment details for quick lookup by amendment ID - Map> amendmentDetailsMap = amendmentFormFields.stream() - .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) - .filter(details -> details.getFormFieldDocuments() != null) // Null check for getFormFieldDocuments - .collect(Collectors.toMap( - AmendmentDetailsRequest::getAmendmentId, - AmendmentDetailsRequest::getFormFieldDocuments - )); - // Get corresponding amendment documents for the current entity - List amendmentDocuments = amendmentDetailsMap.get(applicationAmendmentRequestEntity.getId()); - if (amendmentDocuments != null) { - // Update existing form fields with new values - for (AmendmentFormFieldRequest existingField : existingFormFields) { - for (AmendmentFormFieldRequest newField : amendmentDocuments) { - if (existingField.getFieldId().equals(newField.getFieldId())) { - // Update fields if there are changes - Utils.setIfUpdated(existingField::getValid, existingField::setValid, newField.getValid()); - Utils.setIfUpdated(existingField::getFieldValue, existingField::setFieldValue, newField.getFieldValue()); - updatedFormFields.add(existingField); - break; // Move to the next existing field - } - } - } - - // Convert updated form fields back to JSON and save to the database - applicationAmendmentRequestEntity.setFormFields(Utils.convertListToJsonString(updatedFormFields)); - applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); - } - } - - // Process amendment documents if present - if (applicationAmendmentRequestEntity.getAmendmentDocument() != null) { - String existingDocumentIds = applicationAmendmentRequestEntity.getAmendmentDocument(); - - // Split comma-separated document IDs into a list - List existingDocumentIdList = Arrays.stream(existingDocumentIds.split(",")) - .map(String::trim) - .filter(id -> !id.isEmpty()) - .collect(Collectors.toList()); - - List updatedDocumentIdList = new ArrayList<>(); - Map amendmentDetailsMap = amendmentFormFields.stream() - .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) - .collect(Collectors.toMap( - AmendmentDetailsRequest::getAmendmentId, - AmendmentDetailsRequest::getAmendmentDocuments - )); - - String amendmentDocumentIds = amendmentDetailsMap.get(applicationAmendmentRequestEntity.getId()); - if (amendmentDocumentIds != null) { - // Split and validate new document IDs - List newDocumentIdList = Arrays.stream(amendmentDocumentIds.split(",")) - .map(String::trim) - .filter(id -> !id.isEmpty()) - .collect(Collectors.toList()); - - for (String existingId : existingDocumentIdList) { - for (String newId : newDocumentIdList) { - if (existingId.equals(newId)) { - Optional documentEntity = documentRepository.findByIdAndNotDeleted(Long.valueOf(newId)); - if(documentEntity.isPresent()) { - updatedDocumentIdList.add(newId); - break; - } - } - } - } - - // Add any new IDs not in the existing list - for (String newId : newDocumentIdList) { - if (!existingDocumentIdList.contains(newId)) { - Optional documentEntity = documentRepository.findByIdAndNotDeleted(Long.valueOf(newId)); - if(documentEntity.isPresent()) { - updatedDocumentIdList.add(newId); - } - } - } - String updatedDocumentIds = String.join(",", updatedDocumentIdList); - - // Create the AmendmentDetailsResponseBean for structured data - AmendmentDetailsResponseBean amendmentDetails = new AmendmentDetailsResponseBean(); - amendmentDetails.setAmendmentDocuments(updatedDocumentIds); - AmendmentDetailsRequest amendmentDetailsRequest = amendmentFormFields.stream() - .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) - .findFirst() - .orElse(null); - - if (amendmentDetailsRequest != null) { - amendmentDetails.setValid(amendmentDetailsRequest.getValid()); - } else { - amendmentDetails.setValid(false); - } - String amendmentDetailsJson = Utils.convertListToJsonString(Collections.singletonList(amendmentDetails)); - applicationAmendmentRequestEntity.setAmendmentDocument(amendmentDetailsJson); - applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); - } - } - } +// for (ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity : applicationAmendmentRequestEntities) { +// // Process form fields if present +// if (applicationAmendmentRequestEntity.getFormFields() != null) { +// // Parse existing form fields from JSON +// List existingFormFields = +// Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getFormFields(), AmendmentFormFieldRequest.class); +// +// // Prepare a new list to hold updated form fields +// List updatedFormFields = new ArrayList<>(); +// +// // Map amendment details for quick lookup by amendment ID +// Map amendmentDetailsMap = amendmentFormFields.stream() +// .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) +// .filter(details -> details.getFieldValue() != null) // Null check for getFormFieldDocuments +// .collect(Collectors.toMap( +// AmendmentDetailsRequest::getAmendmentId, +// AmendmentDetailsRequest::getFieldValue +// )); +// // Get corresponding amendment documents for the current entity +// List amendmentDocuments = (List) amendmentDetailsMap.get(applicationAmendmentRequestEntity.getId()); +// if (amendmentDocuments != null) { +// // Update existing form fields with new values +// for (AmendmentFormFieldRequest existingField : existingFormFields) { +// for (AmendmentFormFieldRequest newField : amendmentDocuments) { +// if (existingField.getFieldId().equals(newField.getFieldId())) { +// // Update fields if there are changes +// Utils.setIfUpdated(existingField::getValid, existingField::setValid, newField.getValid()); +// Utils.setIfUpdated(existingField::getFieldValue, existingField::setFieldValue, newField.getFieldValue()); +// +// updatedFormFields.add(existingField); +// break; // Move to the next existing field +// } +// } +// } +// +// // Convert updated form fields back to JSON and save to the database +// applicationAmendmentRequestEntity.setFormFields(Utils.convertListToJsonString(updatedFormFields)); +// applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); +// } +// } +// +// // Process amendment documents if present +// if (applicationAmendmentRequestEntity.getAmendmentDocument() != null) { +// String existingDocumentIds = applicationAmendmentRequestEntity.getAmendmentDocument(); +// +// // Split comma-separated document IDs into a list +// List existingDocumentIdList = Arrays.stream(existingDocumentIds.split(",")) +// .map(String::trim) +// .filter(id -> !id.isEmpty()) +// .collect(Collectors.toList()); +// +// List updatedDocumentIdList = new ArrayList<>(); +// Map amendmentDetailsMap = amendmentFormFields.stream() +// .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) +// .collect(Collectors.toMap( +// AmendmentDetailsRequest::getAmendmentId, +// AmendmentDetailsRequest::getFieldValue +// )); +// +// String amendmentDocumentIds = (String) amendmentDetailsMap.get(applicationAmendmentRequestEntity.getId()); +// if (amendmentDocumentIds != null) { +// // Split and validate new document IDs +// List newDocumentIdList = Arrays.stream(amendmentDocumentIds.split(",")) +// .map(String::trim) +// .filter(id -> !id.isEmpty()) +// .collect(Collectors.toList()); +// +// for (String existingId : existingDocumentIdList) { +// for (String newId : newDocumentIdList) { +// if (existingId.equals(newId)) { +// Optional documentEntity = documentRepository.findByIdAndNotDeleted(Long.valueOf(newId)); +// if(documentEntity.isPresent()) { +// updatedDocumentIdList.add(newId); +// break; +// } +// } +// } +// } +// +// // Add any new IDs not in the existing list +// for (String newId : newDocumentIdList) { +// if (!existingDocumentIdList.contains(newId)) { +// Optional documentEntity = documentRepository.findByIdAndNotDeleted(Long.valueOf(newId)); +// if(documentEntity.isPresent()) { +// updatedDocumentIdList.add(newId); +// } +// } +// } +// String updatedDocumentIds = String.join(",", updatedDocumentIdList); +// +// // Create the AmendmentDetailsResponseBean for structured data +// AmendmentDetailsResponseBean amendmentDetails = new AmendmentDetailsResponseBean(); +// amendmentDetails.setAmendmentDocuments(updatedDocumentIds); +// AmendmentDetailsRequest amendmentDetailsRequest = amendmentFormFields.stream() +// .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) +// .findFirst() +// .orElse(null); +// +// if (amendmentDetailsRequest != null) { +// amendmentDetails.setValid(amendmentDetailsRequest.getValid()); +// } else { +// amendmentDetails.setValid(false); +// } +// String amendmentDetailsJson = Utils.convertListToJsonString(Collections.singletonList(amendmentDetails)); +// applicationAmendmentRequestEntity.setAmendmentDocument(amendmentDetailsJson); +// applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); +// } +// } +// } } + private void updateAmendment(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity, List amendmentDetailsRequestList) { + if (CollectionUtils.isEmpty(amendmentDetailsRequestList)) { + return; + } + Map formFieldsMap = null; + List formFieldList = Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getFormFields(), AmendmentFormField.class); + if(Boolean.FALSE.equals(CollectionUtils.isEmpty(formFieldList))){ + formFieldsMap = formFieldList.stream().collect(Collectors.toMap(AmendmentFormField::getFieldId, Function.identity())); + } + updateAmendmentData(applicationAmendmentRequestEntity, amendmentDetailsRequestList, formFieldsMap); + + } + + private static void updateAmendmentData(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity, List amendmentDetailsRequestList, Map formFieldsMap) { + amendmentDetailsRequestList.forEach(amendmentDetailsRequest -> { + if (amendmentDetailsRequest.getFieldId().contains("amend_")) { + AmendmentDetailsResponseBean amendmentDetails = Utils.convertStringToObject(applicationAmendmentRequestEntity.getAmendmentDocument(), AmendmentDetailsResponseBean.class); + if(amendmentDetails!=null) { + amendmentDetails.setValid(amendmentDetailsRequest.getValid()); + applicationAmendmentRequestEntity.setAmendmentDocument(Utils.convertObjectToString(amendmentDetails)); + } + } else if(Boolean.FALSE.equals(CollectionUtils.isEmpty(formFieldsMap))){ + AmendmentFormField amendmentFormField = formFieldsMap.get(amendmentDetailsRequest.getFieldId()); + amendmentFormField.setValid(amendmentDetailsRequest.getValid()); + } + }); + applicationAmendmentRequestEntity.setFormFields(Utils.convertListToJsonString(formFieldsMap.values().stream().toList())); + } + + // private void updateAmendmentDocuments(List applicationAmendmentRequestEntities, List amendmentFormFields) { // for (ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity : applicationAmendmentRequestEntities) { // // Skip if there are no amendment documents @@ -1066,7 +1118,7 @@ public class ApplicationEvaluationDao { if (!mappedFieldMap.containsKey(formFieldId)) { // CriteriaMappedField mappedField = new CriteriaMappedField(); CriteriaMappedField mappedField = populateMappedField(formFieldId, criteriaFormField, applicationForm, applicationId); - if(mappedField != null) { + if(mappedField != null) { mappedFieldMap.put(formFieldId, mappedField); } } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java index dd44d257..b0dc2adb 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java @@ -7,11 +7,9 @@ import java.util.List; @Data public class AmendmentDetailsRequest { - Long amendmentId; + private String fieldId; - String amendmentDocuments; + private Long amendmentId; - Boolean valid; - - List formFieldDocuments; + private Boolean valid; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java index d144b283..3376d76c 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java @@ -1,8 +1,12 @@ package net.gepafin.tendermanagement.model.request; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; @Data +@AllArgsConstructor +@NoArgsConstructor public class AmendmentFormFieldRequest { private String fieldId; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java index 96a88086..21fc1a09 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java @@ -7,13 +7,9 @@ import java.util.List; @Data public class AmendmentDocumentResponseBean { - Long amendmentId; - - List amendmentDocuments; - - Boolean valid; - - String amendmentNotes; - - List formFieldDocuments; + private Long amendmentId; + private String fieldId; + private String label; + private Boolean valid; + private List fileDetail ; } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index e93c8ed9..7d5b6344 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -669,4 +669,26 @@ public class Utils { } return null; } + + // Method to convert a JSON string to an object of type T + public static T convertStringToObject(String jsonString, Class clazz) { + try { + return mapper.readValue(jsonString, clazz); + } catch (Exception e) { + e.printStackTrace(); + // Handle the exception appropriately (e.g., throw a custom exception) + return null; + } + } + + // Method to convert an object of type T to a JSON string + public static String convertObjectToString(T object) { + try { + return mapper.writeValueAsString(object); + } catch (Exception e) { + e.printStackTrace(); + // Handle the exception appropriately (e.g., throw a custom exception) + return null; + } + } } \ No newline at end of file From c615bbe6170ba227243b79786a81f98b50c2dbab Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 19 Dec 2024 17:32:23 +0530 Subject: [PATCH 31/33] Fixed null check issue --- .../tendermanagement/dao/ApplicationEvaluationDao.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 0666930b..3e53021e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -171,8 +171,10 @@ public class ApplicationEvaluationDao { amendmentDocumentResponseBean.setFileDetail(documentResponseBeans); } + amendmentDocumentResponseBean.setFieldId("amend_" + applicationAmendmentRequestEntity.getId()); amendmentDocumentResponseBean.setLabel(amendmentDetails.getAmendmentNotes()); amendmentDocumentResponseBean.setValid(amendmentDetails.getValid()); + amendmentDocumentResponseBeans.add(amendmentDocumentResponseBean); } List amendmentFormFields = Utils.convertJsonStringToList(formField, AmendmentFormField.class); if (amendmentFormFields != null) { @@ -197,8 +199,6 @@ public class ApplicationEvaluationDao { amendmentDocumentResponseBeans.add(formFieldResponseBean); } } - - amendmentDocumentResponseBeans.add(amendmentDocumentResponseBean); } response.setAmendmentDetails(amendmentDocumentResponseBeans); From 21b21b26f924e66da2cb1aae03aa67290582c5d4 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 19 Dec 2024 19:10:21 +0530 Subject: [PATCH 32/33] updated code for archive document --- .../net/gepafin/tendermanagement/dao/AppointmentDao.java | 3 ++- .../web/rest/api/impl/AppointmentController.java | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index 1b644d6e..f1fb2b8f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -771,8 +771,9 @@ public class AppointmentDao { log.info("Async document upload completed for documentId: {}", documentId); } }); + return null; // Return an immediate response indicating the process is in progress - throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_UPLOADING_IN_PROGRESS)); +// throw new CustomValidationException(Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_UPLOADING_IN_PROGRESS)); } private void uploadDocumentToExternalSystemSync(Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest) { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java index ca55e55f..9264aa3a 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java @@ -69,8 +69,13 @@ public class AppointmentController implements AppointmentApi { UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPLOAD).actionContext(UserActionContextEnum.UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM).build()); DocumentUploadResponse documentUploadResponse = appointmentService.uploadDocToExternalSystem(request, documentId, docToExternalSystemRequest); + + String message = GepafinConstant.DOCUMENT_UPLOADED_SUCCESSFULLY_TO_EXTERNAL_SYSTEM; + if(documentUploadResponse == null) { + message = GepafinConstant.DOCUMENT_UPLOADING_IN_PROGRESS; + } return ResponseEntity.status(HttpStatus.OK) - .body(new Response<>(documentUploadResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.DOCUMENT_UPLOADED_SUCCESSFULLY_TO_EXTERNAL_SYSTEM))); + .body(new Response<>(documentUploadResponse, Status.SUCCESS, Translator.toLocale(message))); } } From c306cc7585666152bac04effb993d8637109145a Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 19 Dec 2024 20:24:37 +0530 Subject: [PATCH 33/33] New role introduced --- .../enums/RoleStatusEnum.java | 3 +- .../tendermanagement/util/Validator.java | 29 +++++++++++++-- .../web/rest/api/AssignedApplicationsApi.java | 2 +- .../db/changelog/db.changelog-1.0.0.xml | 36 +++++++++++++++++++ 4 files changed, 65 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/enums/RoleStatusEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/RoleStatusEnum.java index 3659856d..31d3e9b8 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/RoleStatusEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/RoleStatusEnum.java @@ -7,7 +7,8 @@ public enum RoleStatusEnum { ROLE_BENEFICIARY("ROLE_BENEFICIARY"), ROLE_SUPER_ADMIN("ROLE_SUPER_ADMIN"), ROLE_PRE_INSTRUCTOR("ROLE_PRE_INSTRUCTOR"), - ROLE_GEPAFIN_OPERATOR("ROLE_GEPAFIN_OPERATOR"); + ROLE_GEPAFIN_OPERATOR("ROLE_GEPAFIN_OPERATOR"), + ROLE_INSTRUCTOR_MANAGER("ROLE_INSTRUCTOR_MANAGER"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index 82bc2d79..4e3335a6 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -90,6 +90,8 @@ public class Validator { validateHubId(request, companyEntity.getHub().getId()); if (checkIsSuperAdmin()) { return companyEntity; + } else if (checkIsInstructorManager()) { + return companyEntity; } Map userInfo = tokenProvider.getUserInfoAndUserIdFromToken(request); companyService.validateUserWithCompny(getUserId(userInfo), companyId); @@ -127,8 +129,11 @@ public class Validator { UserEntity requestedUser = userService.validateUser(userId); validateHubId(request, requestedUser.getHub().getId()); - if (Boolean.FALSE.equals(user.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_SUPER_ADMIN.getValue())) - && Boolean.FALSE.equals(user.getId().equals(userId))) { +// if (Boolean.FALSE.equals(user.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_SUPER_ADMIN.getValue())) +// && Boolean.FALSE.equals(user.getId().equals(userId))) + if (checkIsSuperAdmin() || checkIsInstructorManager()) { + + } else if(Boolean.FALSE.equals(user.getId().equals(userId))) { throw new ForbiddenAccessException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); } @@ -164,6 +169,11 @@ public class Validator { validateHubId(request, preInstructorUser.getHub().getId()); } return preInstructorUser; + } else if (checkIsInstructorManager()) { + if (preInstructorUserId != null) { + validateHubId(request, preInstructorUser.getHub().getId()); + } + return preInstructorUser; } else if (checkIsPreInstructor()) { return validateUserId(request, preInstructorUserId); } else { @@ -171,5 +181,18 @@ public class Validator { Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); } } - + + public Boolean checkIsInstructorManager() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.isAuthenticated()) { + // Check if the user has the ROLE_INSTRUCTOR_MANAGER authority + for (GrantedAuthority authority : authentication.getAuthorities()) { + if (RoleStatusEnum.ROLE_INSTRUCTOR_MANAGER.getValue().equals(authority.getAuthority())) { + return true; + } + } + } + return false; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java index 1cfbb5c9..3910132c 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java @@ -32,7 +32,7 @@ public interface AssignedApplicationsApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PostMapping(value = "/application/{applicationId}") - @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')|| hasRole('ROLE_INSTRUCTOR_MANAGER')") public ResponseEntity> createAssignedApplications( HttpServletRequest request, @Parameter(description = "ID of the application", required = true) @PathVariable Long applicationId, 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 2ffe005a..6eee497f 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 @@ -2029,4 +2029,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +