From e8d49c9beefc1e78ccdc2f8c9aba19ac8790a323 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 13 Feb 2025 17:57:48 +0530 Subject: [PATCH 01/34] Fixed validation issue for table --- .../tendermanagement/util/FieldValidator.java | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index d311547a..7a4e24b8 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -224,32 +224,32 @@ public class FieldValidator { return; } - for (int rowIndex = 0; rowIndex < fieldValueList.size(); rowIndex++) { - Map field = fieldValueList.get(rowIndex); - - boolean hasSingleNonNullPredefinedFalse = false; - - for (Map.Entry entry : stateFieldMap.entrySet()) { - String stateKey = entry.getKey(); - Boolean isPredefinedFalse = Boolean.FALSE.equals(entry.getValue()); - - if (isPredefinedFalse) { - Object fieldValue = field.get(stateKey); - if (fieldValue != null && !StringUtils.isEmpty(fieldValue.toString())) { - hasSingleNonNullPredefinedFalse = true; - break; - } - } - } - - if (!hasSingleNonNullPredefinedFalse) { - errors.add(MessageFormat.format( - Translator.toLocale(GepafinConstant.VALIDATION_IN_TABLE), - fieldId)); - break; - } - - } +// for (int rowIndex = 0; rowIndex < fieldValueList.size(); rowIndex++) { +// Map field = fieldValueList.get(rowIndex); +// +// boolean hasSingleNonNullPredefinedFalse = false; +// +// for (Map.Entry entry : stateFieldMap.entrySet()) { +// String stateKey = entry.getKey(); +// Boolean isPredefinedFalse = Boolean.FALSE.equals(entry.getValue()); +// +// if (isPredefinedFalse) { +// Object fieldValue = field.get(stateKey); +// if (fieldValue != null && !StringUtils.isEmpty(fieldValue.toString())) { +// hasSingleNonNullPredefinedFalse = true; +// break; +// } +// } +// } +// +// if (!hasSingleNonNullPredefinedFalse) { +// errors.add(MessageFormat.format( +// Translator.toLocale(GepafinConstant.VALIDATION_IN_TABLE), +// fieldId)); +// break; +// } +// +// } } catch (Exception e) { } From e79b4a00616db59b902d943f90070276a6db0218 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 14 Feb 2025 10:14:39 +0530 Subject: [PATCH 02/34] Fixed table validation issue --- .../tendermanagement/util/FieldValidator.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index 7a4e24b8..edde130a 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -251,6 +251,22 @@ public class FieldValidator { // // } + + boolean hasAtLeastOneNonEmptyPredefinedFalse = fieldValueList.stream() + .anyMatch(field -> stateFieldMap.entrySet().stream() + .filter(entry -> Boolean.FALSE.equals(entry.getValue())) // Check only predefined: false fields + .anyMatch(entry -> { + Object fieldValue = field.get(entry.getKey()); + return fieldValue != null && !StringUtils.isEmpty(fieldValue.toString()); + }) + ); + + if (!hasAtLeastOneNonEmptyPredefinedFalse) { + errors.add(MessageFormat.format( + Translator.toLocale(GepafinConstant.VALIDATION_IN_TABLE), + fieldId)); + } + } catch (Exception e) { } } From 0677364a3b993db663bb12a7a959b7e650e26f72 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 14 Feb 2025 13:57:39 +0530 Subject: [PATCH 03/34] Updated code for table validation --- .../net/gepafin/tendermanagement/util/FieldValidator.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java index edde130a..2cf40d4b 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/FieldValidator.java @@ -160,7 +160,7 @@ public class FieldValidator { public FieldValidator validateCustomTableValidation(String value, String customRule, String fieldId, ContentResponseBean contentResponseBean) { - if (customRule == null || value == null) { + if (customRule == null ) { return this; // No custom rule to validate } @@ -168,6 +168,7 @@ public class FieldValidator { case GepafinConstant.NON_EMPTY_TABLES: try { + checkTableValidation(value, fieldId, contentResponseBean, errors); } catch (Exception e) { throw new RuntimeException(e); @@ -186,6 +187,7 @@ public class FieldValidator { .findFirst() // Get the first matching result .orElse(null); // Default to null if no match + if (tableType!=null){ try { Object object = PdfUtils.extractRows(value);; From d787fdcd0eccb55608ff98be6f7589efa3044d0e Mon Sep 17 00:00:00 2001 From: piyushkag Date: Tue, 11 Feb 2025 15:33:46 +0530 Subject: [PATCH 04/34] Updated Appointment code for creating appointment on external system. --- .../constants/AppointmentApiConstant.java | 16 ++++- .../constants/GepafinConstant.java | 2 +- .../tendermanagement/dao/AppointmentDao.java | 64 ++++++++++++++----- .../request/AppointmentCreationRequest.java | 4 +- .../feignClient/AppointmentApiService.java | 3 +- 5 files changed, 67 insertions(+), 22 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java index 15a3444e..c82687a5 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java @@ -6,7 +6,7 @@ public class AppointmentApiConstant { 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 GET_APPOINTMENT_TEMPLATE = "/WSCrmConsulenza.getAppuntamentoTemplate"; public static final String CREATE_APPOINTMENT_FROM_TEMPLATE = "/WSCrmConsulenza.createAppointmentFromTemplate"; public static final String UPLOAD_APOOINTMENT_DOCUMENT = "/WSDocumentDetail.createStream"; @@ -24,4 +24,18 @@ public class AppointmentApiConstant { public static final boolean IS_FROM_RATING = Boolean.FALSE; public static final boolean IS_ANAGRAFICA_LEGAME = Boolean.FALSE; + //Appointment creation request body fields + public static final String MOTIVAZIONE = "motivazione"; + public static final String COD_PRODOTTO = "codProdotto"; + public static final String COD_ABI = "codAbi"; + public static final String COD_CAB = "codCab"; + public static final String ID_NOTA = "idNota"; + public static final String IMPORTO_AGEVOLATO = "importoAgevolato"; + public static final String IMPORTO_MEDIOLUNGO_TERMINE = "importoMedioLungoTermine"; + public static final String COD_TIPO_PRODOTTO = "codTipoProdotto"; + public static final String COD_CATEGORIA_PRODOTTO = "codCategoriaProdotto"; + public static final String COD_FORMATECNICA = "codFormaTecnica"; + public static final String COD_OPERAZIONE = "codOperazione"; + public static final String MOTIVAZIONE_ID = "id"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index f696cdb0..5eb5128b 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -332,7 +332,7 @@ public class GepafinConstant { 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 RICHIESTE_CLIENTE_STRING = "richiesteCliente"; public static final String ID_STRING = "id"; public static final String NULL_STRING = "null"; public static final String NDG_STRING = "ndg"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index a45b142d..8bf0b4a4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.dao; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.GetObjectRequest; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import feign.FeignException; @@ -16,18 +17,14 @@ 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.entities.UserEntity; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; -import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.NotificationTypeEnum; -import net.gepafin.tendermanagement.enums.RoleStatusEnum; 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.NotificationReq; import net.gepafin.tendermanagement.model.request.UploadDocToExternalSystemRequest; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; import net.gepafin.tendermanagement.model.response.AppointmentCreationResponse; @@ -63,7 +60,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -388,7 +384,6 @@ public class AppointmentDao { // 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 @@ -406,10 +401,15 @@ public class AppointmentDao { } // Handle non-OK response throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.ERROR_IN_GENERATING_NDG_TRY_AGAIN)); + } catch (FeignException.Forbidden forbiddenException) { + logForbiddenError(); + // Regenerate the token and retry + regenerateTokenAndSave(hub); } catch (Exception e) { log.error("Failed to authenticate user on Odessa : {}", e.getMessage(), e); throw new RuntimeException("Authentication failed on Odessa. try again", e); } + return null; } private AppointmentLoginResponse retrieveNdgByVatNumber(String vatNumber, String authorizationToken, HubEntity hub, ApplicationEntity application) { @@ -626,7 +626,8 @@ public class AppointmentDao { // Generate authorization token and fetch template data String authorizationToken = getBearerToken(hub); - ResponseEntity response = appointmentApiService.getAppointmentTemplateForTemplateCreation(authorizationToken); + int areaCode = Integer.parseInt(hub.getAreaCode()); + ResponseEntity response = appointmentApiService.getAppointmentTemplateForTemplateCreation(authorizationToken, areaCode); if (response.getStatusCode() != HttpStatus.OK) { log.error("Failed to retrieve appointment template for appointment creation. Status: {}", response.getStatusCode()); @@ -682,33 +683,61 @@ public class AppointmentDao { } 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); + JsonNode richiesteClienteArray = rootNode.path(GepafinConstant.DATA_STRING).path(GepafinConstant.RICHIESTE_CLIENTE_STRING); + // Initialize the result object 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)); - } + if (!richiesteClienteArray.isArray()) { + log.warn("richiesteCliente array is missing or not an array."); + return new AppointmentCreationRequest(); // Return empty object if array is missing + } + + for (JsonNode richiestaNode : richiesteClienteArray) { + if (richiestaNode.isNull()) continue; + + AppointmentCreationRequest.RichiestaCliente richiestaCliente = new AppointmentCreationRequest.RichiestaCliente(); + richiestaCliente.setIdMotivazione(getIntValue(richiestaNode)); + richiestaCliente.setCodProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_PRODOTTO)); + richiestaCliente.setCodAbi(getTextValue(richiestaNode, AppointmentApiConstant.COD_ABI)); + richiestaCliente.setCodCab(getTextValue(richiestaNode, AppointmentApiConstant.COD_CAB)); + richiestaCliente.setIdNota(getTextValue(richiestaNode, AppointmentApiConstant.ID_NOTA)); + richiestaCliente.setImportoAgevolato(getTextValue(richiestaNode, AppointmentApiConstant.IMPORTO_AGEVOLATO)); + richiestaCliente.setImportoMedioLungoTermine(getTextValue(richiestaNode, AppointmentApiConstant.IMPORTO_MEDIOLUNGO_TERMINE)); + richiestaCliente.setCodTipoProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_TIPO_PRODOTTO)); + richiestaCliente.setCodCategoriaProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_CATEGORIA_PRODOTTO)); + richiestaCliente.setCodFormaTecnica(getTextValue(richiestaNode, AppointmentApiConstant.COD_FORMATECNICA)); + richiestaCliente.setCodOperazione(getTextValue(richiestaNode, AppointmentApiConstant.COD_OPERAZIONE)); + + richiestaClienteList.add(richiestaCliente); } input.setRichiestaCliente(richiestaClienteList); appointmentCreationRequest.setInput(input); + return appointmentCreationRequest; + } catch (JsonProcessingException e) { + log.error("JSON processing error: {}", e.getMessage(), e); + throw new IllegalStateException("Invalid JSON structure in template response", e); } catch (Exception e) { - log.error("Error parsing template response: {}", e.getMessage(), e); + log.error("Unexpected error while parsing template response: {}", e.getMessage(), e); throw new IllegalStateException("Failed to parse template response", e); } } + private String getTextValue(JsonNode node, String fieldName) { + return node.path(fieldName).isTextual() ? node.path(fieldName).asText() : null; + } + + private int getIntValue(JsonNode node) { + return node.path(AppointmentApiConstant.MOTIVAZIONE).path(AppointmentApiConstant.MOTIVAZIONE_ID).asInt(); + } + public AppointmentCreationRequest buildAppointmentCreationRequest(Long applicationId, CreateAppointmentRequest createAppointmentRequest, String areaCode, AppointmentCreationRequest templateRichiestaData) { @@ -733,7 +762,8 @@ public class AppointmentDao { requestNota.setTitolo(nota.getTitolo()); requestNota.setTesto(nota.getTesto()); richiestaCliente.setNota(requestNota); - + richiestaCliente.setDurataMesiFinanziamento(createAppointmentRequest.getDurataMesiFinanziamento()); + richiestaCliente.setImportoBreveTermine(createAppointmentRequest.getImportoBreveTermine()); richiestaClienteList.add(richiestaCliente); } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java index a877a620..0bd6b812 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java @@ -20,8 +20,8 @@ public class AppointmentCreationRequest { public static class RichiestaCliente { private String codAbi; private String codCab; - private Integer durataMesiFinanziamento; - private Integer idMotivazione; + private int durataMesiFinanziamento; + private int idMotivazione; private String idNota; private String importoAgevolato; private Double importoBreveTermine; diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java index b193713b..1c3a44f7 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java @@ -9,6 +9,7 @@ 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.RequestParam; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; @@ -31,7 +32,7 @@ public interface AppointmentApiService { 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); + ResponseEntity getAppointmentTemplateForTemplateCreation(@RequestHeader("Authorization") String token, @RequestParam("idAppuntamentoTemplate") int templateId); @PostMapping(value = AppointmentApiConstant.CREATE_APPOINTMENT_FROM_TEMPLATE, consumes = MediaType.APPLICATION_JSON_VALUE) ResponseEntity createAppointment(@RequestHeader("Authorization") String token, @RequestHeader("context") String context, String appointmentCreationRequest); From fcdea2c593566289340aefc983f8041a9367ac5f Mon Sep 17 00:00:00 2001 From: piyushkag Date: Wed, 12 Feb 2025 11:48:06 +0530 Subject: [PATCH 05/34] Updated code for appointment creation and added a column in hub for appointment template id.. --- .../constants/AppointmentApiConstant.java | 4 +- .../constants/GepafinConstant.java | 3 + .../tendermanagement/dao/AppointmentDao.java | 64 ++++++++++++------- .../tendermanagement/entities/HubEntity.java | 3 + .../request/AppointmentCreationRequest.java | 2 +- .../feignClient/AppointmentApiService.java | 2 +- .../db/changelog/db.changelog-1.0.0.xml | 8 +++ src/main/resources/message_en.properties | 2 + src/main/resources/message_it.properties | 2 + 9 files changed, 62 insertions(+), 28 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java index c82687a5..6e5ed97c 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/AppointmentApiConstant.java @@ -26,7 +26,7 @@ public class AppointmentApiConstant { //Appointment creation request body fields public static final String MOTIVAZIONE = "motivazione"; - public static final String COD_PRODOTTO = "codProdotto"; + public static final String PRODOTTO = "prodotto"; public static final String COD_ABI = "codAbi"; public static final String COD_CAB = "codCab"; public static final String ID_NOTA = "idNota"; @@ -37,5 +37,5 @@ public class AppointmentApiConstant { public static final String COD_FORMATECNICA = "codFormaTecnica"; public static final String COD_OPERAZIONE = "codOperazione"; public static final String MOTIVAZIONE_ID = "id"; - + public static final String PRODOTTO_CODE = "code"; } diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 5eb5128b..0b29c773 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -423,6 +423,9 @@ public class GepafinConstant { public static final String FORMULA_AMOUNT_NOT_MATCHED="formula.amount.not.matches.requested.amount"; public static final String CRITERIA_TABLE_COLUMNS="criteria_table_columns"; + + public static final String APPOINTMENT_CANNOT_BE_CREATED = "appointment.cannot.be.created"; + public static final String APPOINTMENT_CANNOT_BE_CREATED_BY_TEMPLATE = "appointment.cannot.be.created.by.template"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index 8bf0b4a4..f6fbd088 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -384,6 +384,7 @@ public class AppointmentDao { // 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 @@ -626,8 +627,8 @@ public class AppointmentDao { // Generate authorization token and fetch template data String authorizationToken = getBearerToken(hub); - int areaCode = Integer.parseInt(hub.getAreaCode()); - ResponseEntity response = appointmentApiService.getAppointmentTemplateForTemplateCreation(authorizationToken, areaCode); + Long appointmentTemplateId = hub.getAppointmentTemplateId(); + ResponseEntity response = appointmentApiService.getAppointmentTemplateForTemplateCreation(authorizationToken, appointmentTemplateId); if (response.getStatusCode() != HttpStatus.OK) { log.error("Failed to retrieve appointment template for appointment creation. Status: {}", response.getStatusCode()); @@ -636,10 +637,10 @@ public class AppointmentDao { // Parse template data String responseDataForTemplate = Utils.convertObjectToJson(response.getBody()); - AppointmentCreationRequest templateRichiestaData = parseTemplateResponseData(responseDataForTemplate); + AppointmentCreationRequest templateRichiestaData = parseTemplateResponseData(responseDataForTemplate, application.getCall().getProductId()); // Build the appointment request body - AppointmentCreationRequest appointmentCreationRequest = buildAppointmentCreationRequest(applicationId, createAppointmentRequest, hub.getAreaCode(), + AppointmentCreationRequest appointmentCreationRequest = buildAppointmentCreationRequest(applicationId, createAppointmentRequest, hub.getAppointmentTemplateId(), templateRichiestaData); String appointmentRequestBody = Utils.convertObjectToJson(appointmentCreationRequest); @@ -682,8 +683,12 @@ public class AppointmentDao { return null; } - public AppointmentCreationRequest parseTemplateResponseData(String jsonResponse) { + public AppointmentCreationRequest parseTemplateResponseData(String jsonResponse, Long productId) { + try { + if (productId == null) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPOINTMENT_CANNOT_BE_CREATED)); + } ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(jsonResponse); JsonNode richiesteClienteArray = rootNode.path(GepafinConstant.DATA_STRING).path(GepafinConstant.RICHIESTE_CLIENTE_STRING); @@ -694,26 +699,38 @@ public class AppointmentDao { List richiestaClienteList = new ArrayList<>(); if (!richiesteClienteArray.isArray()) { log.warn("richiesteCliente array is missing or not an array."); - return new AppointmentCreationRequest(); // Return empty object if array is missing + return new AppointmentCreationRequest(); } - + boolean isMatchedAtLeastOneId = false; for (JsonNode richiestaNode : richiesteClienteArray) { - if (richiestaNode.isNull()) continue; + if (richiestaNode.isNull()) + continue; AppointmentCreationRequest.RichiestaCliente richiestaCliente = new AppointmentCreationRequest.RichiestaCliente(); - richiestaCliente.setIdMotivazione(getIntValue(richiestaNode)); - richiestaCliente.setCodProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_PRODOTTO)); - richiestaCliente.setCodAbi(getTextValue(richiestaNode, AppointmentApiConstant.COD_ABI)); - richiestaCliente.setCodCab(getTextValue(richiestaNode, AppointmentApiConstant.COD_CAB)); - richiestaCliente.setIdNota(getTextValue(richiestaNode, AppointmentApiConstant.ID_NOTA)); - richiestaCliente.setImportoAgevolato(getTextValue(richiestaNode, AppointmentApiConstant.IMPORTO_AGEVOLATO)); - richiestaCliente.setImportoMedioLungoTermine(getTextValue(richiestaNode, AppointmentApiConstant.IMPORTO_MEDIOLUNGO_TERMINE)); - richiestaCliente.setCodTipoProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_TIPO_PRODOTTO)); - richiestaCliente.setCodCategoriaProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_CATEGORIA_PRODOTTO)); - richiestaCliente.setCodFormaTecnica(getTextValue(richiestaNode, AppointmentApiConstant.COD_FORMATECNICA)); - richiestaCliente.setCodOperazione(getTextValue(richiestaNode, AppointmentApiConstant.COD_OPERAZIONE)); + JsonNode prodottoNode = richiestaNode.path(AppointmentApiConstant.PRODOTTO); + String prodottoCode = prodottoNode.path(AppointmentApiConstant.PRODOTTO_CODE).asText(); - richiestaClienteList.add(richiestaCliente); + if (productId.toString().equals(prodottoCode)) { + isMatchedAtLeastOneId = true; + richiestaCliente.setCodProdotto(prodottoCode); + richiestaCliente.setIdMotivazione(getIntValue(richiestaNode)); + richiestaCliente.setCodProdotto(productId.toString()); + richiestaCliente.setCodAbi(getTextValue(richiestaNode, AppointmentApiConstant.COD_ABI)); + richiestaCliente.setCodCab(getTextValue(richiestaNode, AppointmentApiConstant.COD_CAB)); + richiestaCliente.setIdNota(getTextValue(richiestaNode, AppointmentApiConstant.ID_NOTA)); + richiestaCliente.setImportoAgevolato(getTextValue(richiestaNode, AppointmentApiConstant.IMPORTO_AGEVOLATO)); + richiestaCliente.setImportoMedioLungoTermine(getTextValue(richiestaNode, AppointmentApiConstant.IMPORTO_MEDIOLUNGO_TERMINE)); + richiestaCliente.setCodTipoProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_TIPO_PRODOTTO)); + richiestaCliente.setCodCategoriaProdotto(getTextValue(richiestaNode, AppointmentApiConstant.COD_CATEGORIA_PRODOTTO)); + richiestaCliente.setCodFormaTecnica(getTextValue(richiestaNode, AppointmentApiConstant.COD_FORMATECNICA)); + richiestaCliente.setCodOperazione(getTextValue(richiestaNode, AppointmentApiConstant.COD_OPERAZIONE)); + + richiestaClienteList.add(richiestaCliente); + } + } + + if (!isMatchedAtLeastOneId) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPOINTMENT_CANNOT_BE_CREATED_BY_TEMPLATE)); } input.setRichiestaCliente(richiestaClienteList); @@ -724,21 +741,20 @@ public class AppointmentDao { } catch (JsonProcessingException e) { log.error("JSON processing error: {}", e.getMessage(), e); throw new IllegalStateException("Invalid JSON structure in template response", e); - } catch (Exception e) { - log.error("Unexpected error while parsing template response: {}", e.getMessage(), e); - throw new IllegalStateException("Failed to parse template response", e); } } private String getTextValue(JsonNode node, String fieldName) { + return node.path(fieldName).isTextual() ? node.path(fieldName).asText() : null; } private int getIntValue(JsonNode node) { + return node.path(AppointmentApiConstant.MOTIVAZIONE).path(AppointmentApiConstant.MOTIVAZIONE_ID).asInt(); } - public AppointmentCreationRequest buildAppointmentCreationRequest(Long applicationId, CreateAppointmentRequest createAppointmentRequest, String areaCode, + public AppointmentCreationRequest buildAppointmentCreationRequest(Long applicationId, CreateAppointmentRequest createAppointmentRequest, Long areaCode, AppointmentCreationRequest templateRichiestaData) { ApplicationEntity application = applicationService.validateApplication(applicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java index ccd6c325..ff6db1a6 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java @@ -64,6 +64,9 @@ public class HubEntity extends BaseEntity{ @Column(name = "AREA_CODE") private String areaCode; + @Column(name = "APPOINTMENT_TEMPLATE_ID") + private Long appointmentTemplateId; + @Column(name = "EVALUATION_EXPIRATION_DAYS") private Long evaluationExpirationDays; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java index 0bd6b812..a1c0bb12 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AppointmentCreationRequest.java @@ -11,7 +11,7 @@ public class AppointmentCreationRequest { @Data public static class Input { - private String id; + private Long id; private String ndg; private List richiestaCliente; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java index 1c3a44f7..036a2904 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/AppointmentApiService.java @@ -32,7 +32,7 @@ public interface AppointmentApiService { 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, @RequestParam("idAppuntamentoTemplate") int templateId); + ResponseEntity getAppointmentTemplateForTemplateCreation(@RequestHeader("Authorization") String token, @RequestParam("idAppuntamentoTemplate") Long templateId); @PostMapping(value = AppointmentApiConstant.CREATE_APPOINTMENT_FROM_TEMPLATE, consumes = MediaType.APPLICATION_JSON_VALUE) ResponseEntity createAppointment(@RequestHeader("Authorization") String token, @RequestHeader("context") String context, String appointmentCreationRequest); 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 37c34586..6acccf72 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 @@ -2418,4 +2418,12 @@ + + + + UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs' + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 7aab6f08..87163fb4 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -371,4 +371,6 @@ validation.required.requested.amount=The Requested Amount configuration should b company.id.not.null=Company ID cannot be null. formula.amount.not.matches.requested.amount= The {0} does not matches to calculated amount. +appointment.cannot.be.created = Appointment cannot be created because call doesn't have the productId. +appointment.cannot.be.created.by.template = Product ID does not match with appointment template. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index c1794a8d..66da42e2 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -362,4 +362,6 @@ validation.required.requested.amount=La configurazione dell'importo richiesto company.id.not.null=L'ID dell'azienda non pu? essere nullo. formula.amount.not.matches.requested.amount=Il {0} non corrisponde all'importo calcolato. +appointment.cannot.be.created = Impossibile creare l'appuntamento perch� la chiamata non ha l'ID prodotto. +appointment.cannot.be.created.by.template = L'ID prodotto non corrisponde al modello di appuntamento. From b317d97de9e2361c64604d7552489396e6089e0d Mon Sep 17 00:00:00 2001 From: piyushkag Date: Mon, 17 Feb 2025 16:17:07 +0530 Subject: [PATCH 06/34] Updated code for appointment creation flow and productId field to appointmentTemplateId. --- .../constants/GepafinConstant.java | 2 +- .../dao/ApplicationEvaluationDao.java | 5 +-- .../tendermanagement/dao/AppointmentDao.java | 43 ++++++++----------- .../dao/AssignedApplicationsDao.java | 4 +- .../gepafin/tendermanagement/dao/CallDao.java | 8 ++-- .../tendermanagement/entities/CallEntity.java | 4 +- .../tendermanagement/entities/HubEntity.java | 3 -- .../model/request/CreateCallRequestStep1.java | 2 +- .../model/request/UpdateCallRequestStep1.java | 3 +- .../ApplicationEvaluationFormResponse.java | 2 - .../ApplicationEvaluationResponse.java | 2 +- .../AssignedApplicationsResponse.java | 3 +- .../response/CallDetailsResponseBean.java | 2 +- .../model/response/CallResponse.java | 2 +- .../db/changelog/db.changelog-1.0.0.xml | 7 +++ src/main/resources/message_en.properties | 5 +-- src/main/resources/message_it.properties | 5 +-- 17 files changed, 45 insertions(+), 57 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 0b29c773..8e469734 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -425,7 +425,7 @@ public class GepafinConstant { public static final String CRITERIA_TABLE_COLUMNS="criteria_table_columns"; public static final String APPOINTMENT_CANNOT_BE_CREATED = "appointment.cannot.be.created"; - public static final String APPOINTMENT_CANNOT_BE_CREATED_BY_TEMPLATE = "appointment.cannot.be.created.by.template"; + public static final String APPOINTMENT_NOT_CREATED = "appointment.not.created"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index ef01dea6..6f326e2c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -23,7 +23,6 @@ import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.text.MessageFormat; -import java.time.Duration; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.*; @@ -296,7 +295,7 @@ public class ApplicationEvaluationDao { response.setCreatedDate(entity.getCreatedDate()); response.setUpdatedDate(entity.getUpdatedDate()); response.setNumberOfCheck(entity.getAssignedApplicationsEntity().getApplication().getCall().getNumberOfCheck()); - response.setProductId(entity.getAssignedApplicationsEntity().getApplication().getCall().getProductId()); + response.setAppointmentTemplateId(entity.getAssignedApplicationsEntity().getApplication().getCall().getAppointmentTemplateId()); } @@ -1157,7 +1156,7 @@ public class ApplicationEvaluationDao { LocalDateTime callEndDate = application.getCall().getEndDate(); response.setCallEndDate(callEndDate); response.setNumberOfCheck(call.getNumberOfCheck()); - response.setProductId(call.getProductId()); + response.setAppointmentTemplateId(call.getAppointmentTemplateId()); setCriteriaResponses(entity, application.getId(), response, evaluationCriterias); setChecklistResponses(entity, application.getId(), response, checklistEntities); setFileResponses(entity, application.getId(), response, applicationFormEntities); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index f6fbd088..876ac53d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -627,7 +627,10 @@ public class AppointmentDao { // Generate authorization token and fetch template data String authorizationToken = getBearerToken(hub); - Long appointmentTemplateId = hub.getAppointmentTemplateId(); + Long appointmentTemplateId = application.getCall().getAppointmentTemplateId(); + if (appointmentTemplateId == null) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPOINTMENT_CANNOT_BE_CREATED)); + } ResponseEntity response = appointmentApiService.getAppointmentTemplateForTemplateCreation(authorizationToken, appointmentTemplateId); if (response.getStatusCode() != HttpStatus.OK) { @@ -637,10 +640,10 @@ public class AppointmentDao { // Parse template data String responseDataForTemplate = Utils.convertObjectToJson(response.getBody()); - AppointmentCreationRequest templateRichiestaData = parseTemplateResponseData(responseDataForTemplate, application.getCall().getProductId()); + AppointmentCreationRequest templateRichiestaData = parseTemplateResponseData(responseDataForTemplate); // Build the appointment request body - AppointmentCreationRequest appointmentCreationRequest = buildAppointmentCreationRequest(applicationId, createAppointmentRequest, hub.getAppointmentTemplateId(), + AppointmentCreationRequest appointmentCreationRequest = buildAppointmentCreationRequest(applicationId, createAppointmentRequest, appointmentTemplateId, templateRichiestaData); String appointmentRequestBody = Utils.convertObjectToJson(appointmentCreationRequest); @@ -648,16 +651,17 @@ public class AppointmentDao { ResponseEntity appointmentResponse = appointmentApiService.createAppointment(authorizationToken, context, appointmentRequestBody); String appointmentId = extractAppointmentIdFromResponse(appointmentResponse); - if (appointmentId != null) { - // Update application with the appointment ID - application.setAppointmentId(appointmentId); - application.setStatus(ApplicationStatusTypeEnum.APPOINTMENT.getValue()); - applicationRepository.save(application); - - // Log version history - loggingUtil.addVersionHistory( - VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationData).newData(application).build()); + if (appointmentId == null) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPOINTMENT_NOT_CREATED)); } + // Update application with the appointment ID + application.setAppointmentId(appointmentId); + application.setStatus(ApplicationStatusTypeEnum.APPOINTMENT.getValue()); + 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; @@ -683,12 +687,10 @@ public class AppointmentDao { return null; } - public AppointmentCreationRequest parseTemplateResponseData(String jsonResponse, Long productId) { + public AppointmentCreationRequest parseTemplateResponseData(String jsonResponse) { try { - if (productId == null) { - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPOINTMENT_CANNOT_BE_CREATED)); - } + ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(jsonResponse); JsonNode richiesteClienteArray = rootNode.path(GepafinConstant.DATA_STRING).path(GepafinConstant.RICHIESTE_CLIENTE_STRING); @@ -701,7 +703,6 @@ public class AppointmentDao { log.warn("richiesteCliente array is missing or not an array."); return new AppointmentCreationRequest(); } - boolean isMatchedAtLeastOneId = false; for (JsonNode richiestaNode : richiesteClienteArray) { if (richiestaNode.isNull()) continue; @@ -710,11 +711,8 @@ public class AppointmentDao { JsonNode prodottoNode = richiestaNode.path(AppointmentApiConstant.PRODOTTO); String prodottoCode = prodottoNode.path(AppointmentApiConstant.PRODOTTO_CODE).asText(); - if (productId.toString().equals(prodottoCode)) { - isMatchedAtLeastOneId = true; richiestaCliente.setCodProdotto(prodottoCode); richiestaCliente.setIdMotivazione(getIntValue(richiestaNode)); - richiestaCliente.setCodProdotto(productId.toString()); richiestaCliente.setCodAbi(getTextValue(richiestaNode, AppointmentApiConstant.COD_ABI)); richiestaCliente.setCodCab(getTextValue(richiestaNode, AppointmentApiConstant.COD_CAB)); richiestaCliente.setIdNota(getTextValue(richiestaNode, AppointmentApiConstant.ID_NOTA)); @@ -727,11 +725,6 @@ public class AppointmentDao { richiestaClienteList.add(richiestaCliente); } - } - - if (!isMatchedAtLeastOneId) { - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPOINTMENT_CANNOT_BE_CREATED_BY_TEMPLATE)); - } input.setRichiestaCliente(richiestaClienteList); appointmentCreationRequest.setInput(input); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index 05c65292..92f2154f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -10,7 +10,6 @@ import net.gepafin.tendermanagement.model.request.ApplicationEvaluationRequest; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.UpdateAssignedApplicationRequest; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; -import net.gepafin.tendermanagement.model.response.ApplicationResponse; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository; @@ -31,7 +30,6 @@ import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -201,7 +199,7 @@ public class AssignedApplicationsDao { assignedApplicationsResponse.setEvaluationEndDate(applicationEvaluationEntity.get().getEndDate()); } assignedApplicationsResponse.setNumberOfCheck(application.getCall().getNumberOfCheck()); - assignedApplicationsResponse.setProductId(application.getCall().getProductId()); + assignedApplicationsResponse.setAppointmentTemplateId(application.getCall().getAppointmentTemplateId()); return assignedApplicationsResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 277fb68c..a913713f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -202,7 +202,7 @@ public class CallDao { callEntity.setEndTime(DateTimeUtil.parseTime(createCallRequest.getEndTime())); callEntity.setHub(userEntity.getHub()); callEntity.setNumberOfCheck(createCallRequest.getNumberOfCheck()); - callEntity.setProductId(createCallRequest.getProductId()); + callEntity.setAppointmentTemplateId(createCallRequest.getAppointmentTemplateId()); callEntity = callRepository.save(callEntity); /** This code is responsible for adding a version history log for the "Create Call" operation. **/ @@ -610,7 +610,7 @@ public class CallDao { setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi()); setIfUpdated(callEntity::getEvaluationVersion, callEntity::setEvaluationVersion, updateCallRequest.getEvaluationVersion().getValue()); setIfUpdated(callEntity::getNumberOfCheck, callEntity::setNumberOfCheck, updateCallRequest.getNumberOfCheck()); - setIfUpdated(callEntity::getProductId, callEntity::setProductId, updateCallRequest.getProductId()); + setIfUpdated(callEntity::getAppointmentTemplateId, callEntity::setAppointmentTemplateId, updateCallRequest.getAppointmentTemplateId()); callEntity = callRepository.save(callEntity); /** This code is responsible for adding a version history log for the "update call step 1" operation **/ @@ -718,7 +718,7 @@ public class CallDao { callDetailsResponseBean.setCreatedDate(callEntity.getCreatedDate()); callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); callDetailsResponseBean.setNumberOfCheck(callEntity.getNumberOfCheck()); - callDetailsResponseBean.setProductId(callEntity.getProductId()); + callDetailsResponseBean.setAppointmentTemplateId(callEntity.getAppointmentTemplateId()); return callDetailsResponseBean; } @@ -743,7 +743,7 @@ public class CallDao { createCallResponseBean.setAimedTo(amiedTo); createCallResponseBean.setCheckList(checkList); createCallResponseBean.setNumberOfCheck(callEntity.getNumberOfCheck()); - createCallResponseBean.setProductId(callEntity.getProductId()); + createCallResponseBean.setAppointmentTemplateId(callEntity.getAppointmentTemplateId()); return createCallResponseBean; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java index 36c370d1..25388138 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java @@ -95,7 +95,7 @@ public class CallEntity extends BaseEntity { @Column(name = "NUMBER_OF_CHECK") private Long numberOfCheck; - @Column(name = "PRODUCT_ID") - private Long productId; + @Column(name = "APPOINTMENT_TEMPLATE_ID") + private Long appointmentTemplateId; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java index ff6db1a6..ccd6c325 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java @@ -64,9 +64,6 @@ public class HubEntity extends BaseEntity{ @Column(name = "AREA_CODE") private String areaCode; - @Column(name = "APPOINTMENT_TEMPLATE_ID") - private Long appointmentTemplateId; - @Column(name = "EVALUATION_EXPIRATION_DAYS") private Long evaluationExpirationDays; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java index c54a1454..7d4bf8cf 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java @@ -26,7 +26,7 @@ public class CreateCallRequestStep1 { private Long numberOfCheck; - private Long productId; + private Long appointmentTemplateId; private List aimedTo; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java index ad55d544..01a0ea39 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateCallRequestStep1.java @@ -2,7 +2,6 @@ package net.gepafin.tendermanagement.model.request; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.time.LocalTime; import java.util.List; import lombok.Data; @@ -43,7 +42,7 @@ public class UpdateCallRequestStep1 { private Long numberOfCheck; - private Long productId; + private Long appointmentTemplateId; private EvaluationVersionEnum evaluationVersion; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java index f71cf808..f51378e0 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationFormResponse.java @@ -44,7 +44,5 @@ public class ApplicationEvaluationFormResponse { private LocalDateTime dateAccepted; private LocalDateTime dateRejected; private EvaluationVersionEnum evaluationVersion; - private BigDecimal numberOfCheck; - private BigDecimal productId; } 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 44f27c13..6ad84281 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -45,7 +45,7 @@ public class ApplicationEvaluationResponse { private LocalDateTime dateAccepted; private LocalDateTime dateRejected; private Long numberOfCheck; - private Long productId; + private Long appointmentTemplateId; private EvaluationVersionEnum evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java index 37311ff6..664bc946 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -5,7 +5,6 @@ import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.enums.EvaluationVersionEnum; import net.gepafin.tendermanagement.model.BaseBean; -import java.math.BigDecimal; import java.time.LocalDateTime; @Data @@ -25,7 +24,7 @@ public class AssignedApplicationsResponse extends BaseBean { private String companyName; private LocalDateTime evaluationEndDate; private Long numberOfCheck; - private Long productId; + private Long appointmentTemplateId; private EvaluationVersionEnum evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java index 76e892d1..7ee0b620 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java @@ -59,7 +59,7 @@ public class CallDetailsResponseBean { private Long numberOfCheck; - private Long productId; + private Long appointmentTemplateId; private EvaluationVersionEnum evaluationVersion; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java index a566ab37..76289b06 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java @@ -52,7 +52,7 @@ public class CallResponse { private Long numberOfCheck; - private Long productId; + private Long appointmentTemplateId; @JsonSerialize(using = DynamicLocalTimeSerializer.class) private LocalTime startTime; 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 6acccf72..beab6aac 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 @@ -2426,4 +2426,11 @@ + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 87163fb4..c3b03dd7 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -371,6 +371,5 @@ validation.required.requested.amount=The Requested Amount configuration should b company.id.not.null=Company ID cannot be null. formula.amount.not.matches.requested.amount= The {0} does not matches to calculated amount. -appointment.cannot.be.created = Appointment cannot be created because call doesn't have the productId. -appointment.cannot.be.created.by.template = Product ID does not match with appointment template. - +appointment.cannot.be.created = Appointment cannot be created because call doesn't have the template id. +appointment.not.created = Appointment not created please try again. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 66da42e2..20705aa8 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -362,6 +362,5 @@ validation.required.requested.amount=La configurazione dell'importo richiesto company.id.not.null=L'ID dell'azienda non pu? essere nullo. formula.amount.not.matches.requested.amount=Il {0} non corrisponde all'importo calcolato. -appointment.cannot.be.created = Impossibile creare l'appuntamento perch� la chiamata non ha l'ID prodotto. -appointment.cannot.be.created.by.template = L'ID prodotto non corrisponde al modello di appuntamento. - +appointment.cannot.be.created = Impossibile creare l'appuntamento perché la chiamata non ha l'ID del modello di appuntamento. +appointment.not.created = Appuntamento non creato, riprova From 47c4eb774a86f0b810e2444a184416bc939fe7bf Mon Sep 17 00:00:00 2001 From: piyushkag Date: Mon, 17 Feb 2025 16:22:29 +0530 Subject: [PATCH 07/34] Updated code. --- src/main/resources/db/changelog/db.changelog-1.0.0.xml | 9 --------- 1 file changed, 9 deletions(-) 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 beab6aac..47b4fd1a 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 @@ -2418,19 +2418,10 @@ - - - - UNIQUE_UUID = 'p4lk3bcx1RStqTaIVVbXs' - - - - From 812f13b523137d35b0a5b36c1e7d39f178b2b6be Mon Sep 17 00:00:00 2001 From: Piyush Date: Fri, 14 Feb 2025 12:37:13 +0530 Subject: [PATCH 08/34] Resolved conflicts. --- .../tendermanagement/dao/CompanyDao.java | 41 ++++++++++++++++--- .../entities/CompanyEntity.java | 3 ++ .../entities/UserWithCompanyEntity.java | 3 -- .../db/changelog/db.changelog-1.0.0.xml | 11 +++++ ...json_column_in_company_data_06_02_2025.sql | 18 ++++++++ 5 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java index 3a527d9f..1f0446a0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java @@ -122,10 +122,40 @@ public class CompanyDao { userWithCompanyEntity.setPec(companyRequest.getPec()); userWithCompanyEntity.setContactName(companyRequest.getContactName()); userWithCompanyEntity.setContactEmail(companyRequest.getContactEmail()); - userWithCompanyEntity.setJson(Utils.convertMapIntoJsonString(companyRequest.getVatCheckResponse()) ); UserWithCompanyEntity userWithCompany = userWithCompanyRepository.save(userWithCompanyEntity); /** This code is responsible for adding a version history log for the "adding user with company" operation. **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(userWithCompany).build()); + if (StringUtils.isEmpty(companyEntity.getJson())) { + companyEntity.setJson(Utils.convertMapIntoJsonString(companyRequest.getVatCheckResponse())); + Map vatCheckResponse = companyRequest.getVatCheckResponse(); + Map data = (Map) vatCheckResponse.get("data"); + if (data != null) { + if (data.containsKey("dettaglio")) { + Map dettaglio = (Map) data.get("dettaglio"); + if (dettaglio != null) { + if (dettaglio.containsKey("codice_ateco")) { + Object codiceAtecoObj = dettaglio.get("codice_ateco"); + String codiceAteco = (codiceAtecoObj != null) ? codiceAtecoObj.toString() : null; + + if (codiceAteco != null) { + companyEntity.setCodiceAteco(codiceAteco); + } + } + } + } + } + + companyEntity = companyRepository.save(companyEntity); + + /** This code is responsible for adding a version history log for "updating company json field" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder() + .request(request) + .actionType(VersionActionTypeEnum.INSERT) + .oldData(null) + .newData(companyEntity) + .build()); + } + return userWithCompany; } @@ -143,6 +173,7 @@ public class CompanyDao { entity.setNumberOfEmployees(request.getNumberOfEmployees()); entity.setAnnualRevenue(request.getAnnualRevenue()); entity.setHub(userEntity.getHub()); + entity.setJson(Utils.convertMapIntoJsonString(request.getVatCheckResponse())); if (request.getVatCheckResponse() != null) { Map vatCheckResponse = request.getVatCheckResponse(); Map data = (Map) vatCheckResponse.get("data"); @@ -226,10 +257,10 @@ public class CompanyDao { UserWithCompanyEntity userWithCompanyEntity = getUserWithCompany(userEntity.getId(), companyId); //cloned entity for old data UserWithCompanyEntity oldUserWithCompanyData = Utils.getClonedEntityForData(userWithCompanyEntity); - if(StringUtils.isNotBlank(companyRequest.getVatNumber())) { - String responseJson = companyRequest.getVatCheckResponse() != null ? Utils.convertMapIntoJsonString(companyRequest.getVatCheckResponse()) : null; - setIfUpdated(userWithCompanyEntity::getJson, userWithCompanyEntity::setJson, responseJson); - } +// if(StringUtils.isNotBlank(companyRequest.getVatNumber())) { +// String responseJson = companyRequest.getVatCheckResponse() != null ? Utils.convertMapIntoJsonString(companyRequest.getVatCheckResponse()) : null; +// setIfUpdated(companyEntity::getJson, companyEntity::setJson, responseJson); +// } setIfUpdated(userWithCompanyEntity::getPec, userWithCompanyEntity::setPec, companyRequest.getPec()); setIfUpdated(userWithCompanyEntity::getEmail, userWithCompanyEntity::setEmail, companyRequest.getEmail()); setIfUpdated(userWithCompanyEntity::getContactName, userWithCompanyEntity::setContactName, companyRequest.getContactName()); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java index 932a8758..12dc2a15 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java @@ -59,4 +59,7 @@ public class CompanyEntity extends BaseEntity{ @Column(name = "CODICE_ATECO") private String codiceAteco; + + @Column(name = "JSON") + private String json; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java index 1f067a90..65afbe76 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java @@ -35,9 +35,6 @@ public class UserWithCompanyEntity extends BaseEntity{ @Column(name = "EMAIL") private String email; - @Column(name = "JSON") - private String json; - @Column(name = "IS_DELETED") private Boolean isDeleted = false; 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 47b4fd1a..7fec2eb4 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 @@ -2423,5 +2423,16 @@ oldColumnName="product_id" newColumnName="appointment_template_id"/> + + + + + + + + + + diff --git a/src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql b/src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql new file mode 100644 index 00000000..42c00d43 --- /dev/null +++ b/src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql @@ -0,0 +1,18 @@ +UPDATE COMPANY C +SET JSON = ( + SELECT U.JSON + FROM USER_WITH_COMPANY U + WHERE U.COMPANY_ID = C.ID + AND U.IS_DELETED = false + AND U.JSON IS NOT NULL + AND U.JSON <> '' + ORDER BY U.ID ASC + LIMIT 1 +) +WHERE EXISTS ( + SELECT 1 FROM USER_WITH_COMPANY U + WHERE U.COMPANY_ID = C.ID + AND U.IS_DELETED = false + AND U.JSON IS NOT NULL + AND U.JSON <> '' +); From 967c53fa9963ad08ab9c5ccb9fecfc8b573aee8a Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 17 Feb 2025 15:46:59 +0530 Subject: [PATCH 09/34] Updated company json script --- .../db/dump/insert_json_column_in_company_data_06_02_2025.sql | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql b/src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql index 42c00d43..42fa12b7 100644 --- a/src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql +++ b/src/main/resources/db/dump/insert_json_column_in_company_data_06_02_2025.sql @@ -3,7 +3,6 @@ SET JSON = ( SELECT U.JSON FROM USER_WITH_COMPANY U WHERE U.COMPANY_ID = C.ID - AND U.IS_DELETED = false AND U.JSON IS NOT NULL AND U.JSON <> '' ORDER BY U.ID ASC @@ -12,7 +11,6 @@ SET JSON = ( WHERE EXISTS ( SELECT 1 FROM USER_WITH_COMPANY U WHERE U.COMPANY_ID = C.ID - AND U.IS_DELETED = false AND U.JSON IS NOT NULL AND U.JSON <> '' ); From 243b13d7ebb9221a6f3ad7759742c7b115a57065 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 14 Feb 2025 13:19:45 +0530 Subject: [PATCH 10/34] Removed stack trace code for few exceptions --- .../tendermanagement/util/UserActionAspect.java | 2 +- .../web/rest/api/errors/GlobalExceptionHandler.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/util/UserActionAspect.java b/src/main/java/net/gepafin/tendermanagement/util/UserActionAspect.java index 0064bb82..2262e4a0 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/UserActionAspect.java +++ b/src/main/java/net/gepafin/tendermanagement/util/UserActionAspect.java @@ -61,7 +61,7 @@ public class UserActionAspect { handleSuccessResponse((ResponseEntity) result, storedUserActionId == null ? userActionId : storedUserActionId); } } catch (Exception ex) { - log.error("Exception occurred: ", ex); +// log.error("Exception occurred: ", ex); handleError(ex, getUserActionIdFromRequest(request)); throw ex; } finally { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java index cec3c224..8b431b54 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java @@ -36,7 +36,7 @@ public class GlobalExceptionHandler { @ResponseBody public Response handleCustomValidationException(final CustomValidationException ex) { log.error(ex.getMessage()); - log.error(ex.getLocalizedMessage(), ex); +// log.error(ex.getLocalizedMessage(), ex); return new Response<>(null, ex.getStatus(), ex.getMessage()); } @@ -45,14 +45,14 @@ public class GlobalExceptionHandler { @ResponseBody public Response handleValidationException(final ValidationException ex) { log.error(ex.getMessage()); - log.error(ex.getLocalizedMessage(), ex); +// log.error(ex.getLocalizedMessage(), ex); return new Response<>(ex.getErrors(), ex.getStatus(), ex.getMessage()); } @ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity> handleResourceNotFoundException(ResourceNotFoundException ex) { log.error(ex.getMessage()); - log.error(ex.getLocalizedMessage(), ex); +// log.error(ex.getLocalizedMessage(), ex); return ResponseEntity.status(HttpStatus.NOT_FOUND) .body(new Response<>(null, ex.getStatus(), ex.getMessage())); } @@ -71,7 +71,7 @@ public class GlobalExceptionHandler { @ResponseBody public Response handleInvalidTokenException(final Throwable ex) { log.error(ex.getMessage()); - log.error(ex.getLocalizedMessage(), ex); +// log.error(ex.getLocalizedMessage(), ex); return new Response<>(ex.getMessage(), Status.UNAUTHORIZED, Translator.toLocale("invalid_signature")); } @@ -80,7 +80,7 @@ public class GlobalExceptionHandler { @ResponseBody public Response unauthorizedAccessException(final Throwable ex) { log.error(ex.getMessage()); - log.error(ex.getLocalizedMessage(), ex); +// log.error(ex.getLocalizedMessage(), ex); return new Response<>(null, Status.UNAUTHORIZED, ex.getMessage()); } @@ -115,7 +115,7 @@ public class GlobalExceptionHandler { @ResponseBody public Response handleUnAuthorizedException(final Throwable ex) { log.error(ex.getMessage()); - log.error(ex.getLocalizedMessage(), ex); +// log.error(ex.getLocalizedMessage(), ex); return new Response<>(null, Status.VALIDATION_ERROR, Translator.toLocale("invalid_login")); } From 4c9695db59b73f6faa1752b1132adc90ce798f7c Mon Sep 17 00:00:00 2001 From: Piyush Date: Wed, 19 Feb 2025 16:12:38 +0530 Subject: [PATCH 11/34] Added two fields in the response of get amendment api --- .../gepafin/tendermanagement/dao/AssignedApplicationsDao.java | 2 ++ .../model/response/AssignedApplicationsResponse.java | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index 92f2154f..ad156cf4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -200,6 +200,8 @@ public class AssignedApplicationsDao { } assignedApplicationsResponse.setNumberOfCheck(application.getCall().getNumberOfCheck()); assignedApplicationsResponse.setAppointmentTemplateId(application.getCall().getAppointmentTemplateId()); + assignedApplicationsResponse.setNdg(application.getNdg()); + assignedApplicationsResponse.setAppointmentId(application.getAppointmentId()); return assignedApplicationsResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java index 664bc946..7f80e8f0 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -26,7 +26,8 @@ public class AssignedApplicationsResponse extends BaseBean { private Long numberOfCheck; private Long appointmentTemplateId; private EvaluationVersionEnum evaluationVersion; - + private String ndg; + private String appointmentId; } From 017e769c5e742d42272b07177297f87822bf5e98 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 13 Feb 2025 19:32:14 +0530 Subject: [PATCH 12/34] Updated code for email in application submission --- .../tendermanagement/dao/ApplicationDao.java | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 9c65b574..18e522dc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1132,22 +1132,28 @@ public class ApplicationDao { // mailUtil.sendByMailGun(subject, body, List.of(defaultSystemReceiverEmail), null); // mailUtil.sendByMailGun(subject, body, List.of(gepafinEmail), null); // mailUtil.sendByMailGun(subject, body, List.of(rinaldoEmail), null); - if(Boolean.TRUE.equals(hub.getUniqueUuid().equals(defaultHubUuid))) { - if (validator.isProductionProfileActivated()) { - emailLogRequest.setRecipientEmails(carloEmail); -// mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null); - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(carloEmail),emailLogRequest); - } - List listDefaultSystemReceiverEmail = Arrays.stream(defaultSystemReceiverEmail.split(",")) - .map(String::trim) - .filter(email -> !email.isEmpty()) - .toList(); +// if(Boolean.TRUE.equals(hub.getUniqueUuid().equals(defaultHubUuid))) { +// if (validator.isProductionProfileActivated()) { +// emailLogRequest.setRecipientEmails(carloEmail); +//// mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null); +// emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(carloEmail),emailLogRequest); +// } +// List listDefaultSystemReceiverEmail = Arrays.stream(defaultSystemReceiverEmail.split(",")) +// .map(String::trim) +// .filter(email -> !email.isEmpty()) +// .toList(); +// +// emailLogRequest.setRecipientEmails(defaultSystemReceiverEmail); +// emailNotificationDao.sendMail(hub.getId(), subject, body, listDefaultSystemReceiverEmail, emailLogRequest); +// } + + List hubEmails = Arrays.stream(hub.getEmail().split(",")) + .map(String::trim) + .filter(email -> !email.isEmpty()) + .toList(); - emailLogRequest.setRecipientEmails(defaultSystemReceiverEmail); - emailNotificationDao.sendMail(hub.getId(), subject, body, listDefaultSystemReceiverEmail, emailLogRequest); - } emailLogRequest.setRecipientEmails(hub.getEmail()); - emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(hub.getEmail()),emailLogRequest); + emailNotificationDao.sendMail(hub.getId(), subject, body,hubEmails,emailLogRequest); emailLogRequest.setRecipientEmails(rinaldoEmail); emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(rinaldoEmail),emailLogRequest); } From 6abacd20b41844558a6b4ccaa4e32efdbc7dd772 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 24 Feb 2025 16:59:33 +0530 Subject: [PATCH 13/34] Fixed pdf sequence issue --- .../net/gepafin/tendermanagement/dao/PdfDao.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 8247c321..0569e28d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -285,12 +285,12 @@ public class PdfDao { private Document createPdfTable(List> extractedData, Document document, ContentResponseBean contentResponseBean) throws DocumentException { // Create a PdfPTable with dynamic column count based on stateFieldMap size - Map stateFieldMap = new HashMap<>(); - Map stateFieldBoolean = new HashMap<>(); - Map formulaEnabledMap = new HashMap<>(); - Map formulaTypeMap = new HashMap<>(); - Map fieldTypeMap = new HashMap<>(); - Map totalMap = new HashMap<>(); + Map stateFieldMap = new LinkedHashMap<>(); + Map stateFieldBoolean = new LinkedHashMap<>(); + Map formulaEnabledMap = new LinkedHashMap<>(); + Map formulaTypeMap = new LinkedHashMap<>(); + Map fieldTypeMap = new LinkedHashMap<>(); + Map totalMap = new LinkedHashMap<>(); Font lightGrayFont = FontFactory.getFont(FontFactory.HELVETICA, 12, Font.NORMAL, new BaseColor(110, 110, 110)); // Light gray From 65a8d6e9715c034a2be80064aec9a39c75ee70ce Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 27 Feb 2025 16:43:07 +0530 Subject: [PATCH 14/34] Updated code for call end date time updation --- .../gepafin/tendermanagement/dao/CallDao.java | 35 ++++++++++++++++--- .../enums/UserActionContextEnum.java | 3 +- .../service/impl/CallServiceImpl.java | 2 +- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index a913713f..87398d17 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -571,7 +571,7 @@ public class CallDao { } } - public CallResponse updateCallStep1(CallEntity callEntity, UpdateCallRequestStep1 updateCallRequest, UserEntity userEntity) { + public CallResponse updateCallStep1(HttpServletRequest request,CallEntity callEntity, UpdateCallRequestStep1 updateCallRequest, UserEntity userEntity) { CallEntity oldCallEntity = Utils.getClonedEntityForData(callEntity); isValidDateRange(updateCallRequest, callEntity); setIfUpdated(callEntity::getName, callEntity::setName, updateCallRequest.getName()); @@ -580,15 +580,41 @@ public class CallDao { setIfUpdated(callEntity::getDescriptionLong, callEntity::setDescriptionLong, updateCallRequest.getDescriptionLong()); List dates=updateCallRequest.getDates(); - + boolean isEndDateUpdated = false; + boolean isEndTimeUpdated = false; if (dates != null && dates.size()>1) { if (dates.size() > 0) { setIfUpdated(callEntity::getStartDate, callEntity::setStartDate, dates.get(0)); } if (dates.size() > 1) { - setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, dates.get(1)); + LocalDate requestEndDate = dates.get(1).toLocalDate(); // Extract only the date + LocalDate storedEndDate = callEntity.getEndDate().toLocalDate(); // Extract only the date + + if (!requestEndDate.equals(storedEndDate)) { // Check if dates are different + + setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, dates.get(1)); + isEndDateUpdated = true; + } } } + + if (updateCallRequest.getEndTime() != null) { + LocalTime requestEndTime = DateTimeUtil.parseTime(updateCallRequest.getEndTime()); + LocalTime storedEndTime = callEntity.getEndTime(); + + if (!requestEndTime.equals(storedEndTime)) { + setIfUpdated(callEntity::getEndTime, callEntity::setEndTime, DateTimeUtil.parseTime(updateCallRequest.getEndTime())); + isEndTimeUpdated = true; + } + } + if (isEndDateUpdated || isEndTimeUpdated) { + loggingUtil.logUserAction(UserActionRequest.builder() + .request(request) + .actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.UPDATE_CALL_END_DATE_AND_TIME) + .build()); + } + // setIfUpdated(callEntity::getStartDate, callEntity::setStartDate, updateCallRequest.getStartDate()); // setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, updateCallRequest.getEndDate()); setIfUpdated(callEntity::getAmount, callEntity::setAmount, updateCallRequest.getAmount()); @@ -606,7 +632,6 @@ public class CallDao { setIfUpdated(callEntity::getEmail, callEntity::setEmail, updateCallRequest.getEmail()); setIfUpdated(callEntity::getPhoneNumber, callEntity::setPhoneNumber, updateCallRequest.getPhoneNumber()); setIfUpdated(callEntity::getStartTime, callEntity::setStartTime, DateTimeUtil.parseTime(updateCallRequest.getStartTime())); - setIfUpdated(callEntity::getEndTime, callEntity::setEndTime, DateTimeUtil.parseTime(updateCallRequest.getEndTime())); setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi()); setIfUpdated(callEntity::getEvaluationVersion, callEntity::setEvaluationVersion, updateCallRequest.getEvaluationVersion().getValue()); setIfUpdated(callEntity::getNumberOfCheck, callEntity::setNumberOfCheck, updateCallRequest.getNumberOfCheck()); @@ -1089,4 +1114,4 @@ public class CallDao { createCallResponseBean.setCurrentStep(GepafinConstant.EVALUATION_V2_STEP_2); return createCallResponseBean; } -} + } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 1029d9b1..23695ca6 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -211,7 +211,8 @@ public enum UserActionContextEnum { GET_ALL_ASSIGNED_APPLICATION_BY_PAGINATION("GET_ALL_ASSIGNED_APPLICATION_BY_PAGINATION"), GET_ALL_APPLICATION_AMENDMENT_BY_PAGINATION("GET_ALL_APPLICATION_AMENDMENT_BY_PAGINATION"), GET_ALL_USER_ACTION_BY_PAGINATION("GET_ALL_USER_ACTION_BY_PAGINATION"), - GET_ALL_USER_BY_PAGINATION("GET_ALL_USER_BY_PAGINATION"); + GET_ALL_USER_BY_PAGINATION("GET_ALL_USER_BY_PAGINATION"), + UPDATE_CALL_END_DATE_AND_TIME("UPDATE_CALL_END_DATE_AND_TIME"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index a621662c..c5b6952b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -50,7 +50,7 @@ public class CallServiceImpl implements CallService { UpdateCallRequestStep1 updateCallRequest) { UserEntity user = validator.validateUser(request); CallEntity call = validator.validateUserWithCall(user, callId); - return callDao.updateCallStep1(call, updateCallRequest, user); + return callDao.updateCallStep1(request,call, updateCallRequest, user); } @Override @Transactional(readOnly = true) From ec6fe90000492786c4ed81b121e83d04804e76ab Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 27 Feb 2025 19:11:27 +0530 Subject: [PATCH 15/34] Done ticket GEPAFINBE-175 --- .../constants/GepafinConstant.java | 1 + .../tendermanagement/dao/ApplicationDao.java | 50 ++++++++++++++++++- .../dao/ApplicationEvaluationDao.java | 2 +- .../dao/EmailNotificationDao.java | 2 +- .../enums/ApplicationStatusTypeEnum.java | 3 +- .../enums/EmailScenarioTypeEnum.java | 2 +- .../db/changelog/db.changelog-1.0.0.xml | 5 ++ ...ail_template_email_scenario_27_02_2025.sql | 2 + src/main/resources/message_en.properties | 3 +- src/main/resources/message_it.properties | 2 + 10 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/db/dump/updated_system_email_template_email_scenario_27_02_2025.sql diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 4afb7238..c673a85d 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -468,6 +468,7 @@ public class GepafinConstant { public static final String SWITCH="switch"; public static final String IS_CHECK_LIST_ITEM="isChecklistItem"; public static final String VALIDATION_FAILED_FOR_CHECKLIST="validation.failed.checklist"; + public static final String INSUFFICIENT_SCORE_MESSAGE ="insufficient.score.msg"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 491e9796..ef145bc3 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1,9 +1,10 @@ package net.gepafin.tendermanagement.dao; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.Root; import net.gepafin.tendermanagement.config.Translator; -import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; @@ -917,8 +918,10 @@ public class ApplicationDao { public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { + log.info("Updating status for Application id : " + applicationId); ApplicationEntity applicationEntity = validateApplication(applicationId); checkCallEndDate(applicationEntity.getCall()); + log.info("Call end date verified successfully | callId: {}", applicationEntity.getCall().getId()); //cloned entity for old application data ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity); @@ -949,14 +952,22 @@ public class ApplicationDao { sendMailToUserAndCompany(userEntity, applicationEntity); sendMailTodefaultSystemAndGepafin(userEntity, applicationEntity); applicationEntity.setStatus(status.getValue()); + log.info("Status updated to SUBMIT for applicationId: " + applicationId); } if (status.equals(ApplicationStatusTypeEnum.DRAFT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.AWAITING.getValue()))) { applicationEntity.setStatus(status.getValue()); + log.info("Status updated to DRAFT for applicationId: " + applicationId); } if(status.equals(ApplicationStatusTypeEnum.ADMISSIBLE) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.APPOINTMENT.getValue()))){ applicationEntity.setStatus(status.getValue()); + log.info("Status updated to ADMISSIBLE for applicationId: " + applicationId); + emailNotificationDao.sendAdmissibilityNotificationEmailForAdmissibleApplication(applicationEntity); + } + if(status.equals(ApplicationStatusTypeEnum.TECHNICAL_EVALUATION) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.ADMISSIBLE.getValue()))){ + processTechnicalEvaluation(applicationId, applicationEntity, status); } applicationEntity = applicationRepository.save(applicationEntity); + log.info("Application status updated successfully | applicationId: {}, newStatus: {}", applicationId, applicationEntity.getStatus()); if (!status.equals(ApplicationStatusTypeEnum.SUBMIT)) { /** This code is responsible for adding a version history log for "Update application status" operation. **/ @@ -966,6 +977,43 @@ public class ApplicationDao { return getApplicationResponse(applicationEntity); } + private void processTechnicalEvaluation(Long applicationId, ApplicationEntity applicationEntity, ApplicationStatusTypeEnum status){ + Optional evaluationEntityOpt = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationId); + if (evaluationEntityOpt.isPresent()){ + ApplicationEvaluationEntity evaluationEntity = evaluationEntityOpt.get(); + String criteriaJson = evaluationEntity.getCriteria(); + if (criteriaJson != null){ + Integer totalScore = calculateTotalScore(evaluationEntity.getCriteria()); + if (totalScore > 40) { + applicationEntity.setStatus(status.getValue()); + log.info("Status updated to TECHNICAL_EVALUATION for applicationId: " + applicationId); + } + else{ + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.INSUFFICIENT_SCORE_MESSAGE)); + } + } + } + } + + private Integer calculateTotalScore(String criteriaJson){ + try { + ObjectMapper objectMapper = new ObjectMapper(); + // Convert JSON string to List of Maps + List> criteriaList = objectMapper.readValue(criteriaJson, new TypeReference<>() { + }); + + // Sum all scores (ignoring null scores) + Integer totalScore = criteriaList.stream() + .mapToInt(obj -> obj.get("score") != null ? ((Number) obj.get("score")).intValue() : 0) + .sum(); + + return totalScore; + } + catch (Exception e) { + log.error(" Error parsing criteria JSON: {}", e.getMessage()); + return 0; + } + } public Integer calculateProgress(Long totalSteps, Long completedSteps) { if (FieldValidator.isNullOrZero(totalSteps)) { throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.TOTAL_STEPS_NOT_BE_ZERO)); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 4902cc57..24ce6d55 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1899,7 +1899,7 @@ public class ApplicationEvaluationDao { application.setDateAccepted(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); application.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); application = applicationRepository.save(application); - emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application); +// emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application); } if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.REJECTED.getValue())))) { application.setDateRejected(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 3988b35a..25b54319 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -249,7 +249,7 @@ public class EmailNotificationDao { sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, bodyPlaceholders, null,amendmentRequest.getId()); } - public void sendAdmissibilityNotificationEmailForApprovedApplication(ApplicationEntity applicationEntity) { + public void sendAdmissibilityNotificationEmailForAdmissibleApplication(ApplicationEntity applicationEntity) { Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java index b6fd00b3..041ec85a 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java @@ -15,7 +15,8 @@ public enum ApplicationStatusTypeEnum { EVALUATION("EVALUATION"), APPOINTMENT("APPOINTMENT"), NDG("NDG"), - ADMISSIBLE("ADMISSIBLE"); + ADMISSIBLE("ADMISSIBLE"), + TECHNICAL_EVALUATION("TECHNICAL_EVALUATION"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java index 415f1dd2..479912d7 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/EmailScenarioTypeEnum.java @@ -8,7 +8,7 @@ public enum EmailScenarioTypeEnum { APPLICATION_AMENDMENT_REQUESTED("APPLICATION_AMENDMENT_REQUESTED"), APPLICATION_AMENDMENT_EXPIRED("APPLICATION_AMENDMENT_EXPIRED"), APPLICATION_AMENDMENT_REMINDER("APPLICATION_AMENDMENT_REMINDER"), - APPLICATION_APPROVED("APPLICATION_APPROVED"), + APPLICATION_ADMISSIBLE("APPLICATION_ADMISSIBLE"), USER_CREATION("USER_CREATION"), PASSWORD_RESET_REQUEST("PASSWORD_RESET_REQUEST"), APPLICATION_REJECTED("APPLICATION_REJECTED"); 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 e4232f22..5f3bbf66 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 @@ -2532,4 +2532,9 @@ newColumnName="appointment_template_id"/> + + + + diff --git a/src/main/resources/db/dump/updated_system_email_template_email_scenario_27_02_2025.sql b/src/main/resources/db/dump/updated_system_email_template_email_scenario_27_02_2025.sql new file mode 100644 index 00000000..2605b579 --- /dev/null +++ b/src/main/resources/db/dump/updated_system_email_template_email_scenario_27_02_2025.sql @@ -0,0 +1,2 @@ + +UPDATE gepafin_schema.system_email_template SET email_scenario='APPLICATION_ADMISSIBLE' WHERE "type"='ADMISSIBILITY_NOTIFICATION' AND "system"=true ; \ No newline at end of file diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 36970d79..d312160e 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -390,7 +390,8 @@ company.document.copied.successfully = Company Document Copied successfully. invalid.expiration.date = Invalid Expiration Date - appointment.cannot.be.created = Appointment cannot be created because call doesn't have the template id. appointment.not.created = Appointment not created please try again. validation.failed.checklist=Validation failed for checklist. + +insufficient.score.msg = Insufficient score to pass to the technical and economic-financial evaluation diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index ce2e539d..67a3921c 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -384,3 +384,5 @@ invalid.expiration.date = Data di scadenza non valida appointment.cannot.be.created = Impossibile creare l'appuntamento perch� la chiamata non ha l'ID del modello di appuntamento. appointment.not.created = Appuntamento non creato, riprova validation.failed.checklist=Convalida fallita per la checklist. + +insufficient.score.msg = Punteggio non sufficiente per passaggio alla valutazione tecnica ed economico finanziaria From 5b8020b3f9adbfd616f1ac92c34bf4450377790f Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 27 Feb 2025 19:26:48 +0530 Subject: [PATCH 16/34] updated code --- src/main/resources/db/changelog/db.changelog-1.0.0.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index e88c0116..de68936a 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 @@ -2532,7 +2532,7 @@ newColumnName="appointment_template_id"/> - + From a22be9dc77b173f186478223752e159ed6ac7629 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 27 Feb 2025 21:59:47 +0530 Subject: [PATCH 17/34] Fixed issue of getAllCompanyDocument Api --- .../net/gepafin/tendermanagement/dao/CompanyDocumentDao.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java index 9cee39b6..f43c6a90 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java @@ -306,6 +306,8 @@ public class CompanyDocumentDao { return (root, query, builder) -> { Predicate predicate = builder.equal(root.get("companyId"), companyId); + predicate = builder.and(predicate, builder.isFalse(root.get("isDeleted"))); + if (typeEnum != null) { if (typeEnum == CompanyDocumentTypeEnum.COMPANY_DOCUMENT) { // Case 1: Fetch only COMPANY_DOCUMENT type documents for the given company From e3faef9c59e646d9997a556c60e79213d39ff643 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 28 Feb 2025 11:42:11 +0530 Subject: [PATCH 18/34] Updated code --- src/main/java/net/gepafin/tendermanagement/dao/CallDao.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 87398d17..c495d1d5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -593,6 +593,8 @@ public class CallDao { if (!requestEndDate.equals(storedEndDate)) { // Check if dates are different setIfUpdated(callEntity::getEndDate, callEntity::setEndDate, dates.get(1)); + callEntity.setStatus(CallStatusEnum.PUBLISH.getValue()); + callRepository.save(callEntity); isEndDateUpdated = true; } } @@ -604,6 +606,8 @@ public class CallDao { if (!requestEndTime.equals(storedEndTime)) { setIfUpdated(callEntity::getEndTime, callEntity::setEndTime, DateTimeUtil.parseTime(updateCallRequest.getEndTime())); + callEntity.setStatus(CallStatusEnum.PUBLISH.getValue()); + callRepository.save(callEntity); isEndTimeUpdated = true; } } From 6c818d299a5738e29f0625f58e32177f0c48dceb Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 28 Feb 2025 11:42:48 +0530 Subject: [PATCH 19/34] Updated code for date filter in pagination --- .../tendermanagement/dao/ApplicationDao.java | 42 ++++++++++++++++--- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 87f81625..eb17503f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -57,6 +57,7 @@ import java.text.ParseException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.*; @@ -1704,15 +1705,44 @@ public class ApplicationDao { private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode, Root root) { if (fieldPath.getJavaType().equals(LocalDateTime.class)) { - LocalDateTime testDateTime = DateTimeUtil.parseStringToLocalDateTime(value.toString()); + // Convert input string: Replace 'T' with space + String formattedValue = value.toString().replace("T", " "); + + // Handle timezones and UTC (`Z` or `+HH:mm`) + if (formattedValue.contains("Z") || formattedValue.matches(".*[+-]\\d{2}:\\d{2}$")) { + OffsetDateTime offsetDateTime = OffsetDateTime.parse(value.toString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME); + formattedValue = offsetDateTime.toLocalDateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")); + } + + // Check if more than 3 decimal places exist + if (formattedValue.contains(".")) { + int dotIndex = formattedValue.indexOf("."); + if (formattedValue.length() > dotIndex + 4) { + formattedValue = formattedValue.substring(0, dotIndex + 4); // Keep only 3 decimals + } + } else { + formattedValue += ".000"; // Ensure 3 decimals + } + + // Define correct date-time format + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + + // Parse the formatted value into LocalDateTime + LocalDateTime dateTimeValue = LocalDateTime.parse(formattedValue, formatter); + + // Extract only the date portion + LocalDate dateValue = dateTimeValue.toLocalDate(); + + // Convert database field to LocalDate for date-only comparison + Expression dateField = criteriaBuilder.function("DATE", LocalDate.class, fieldPath); + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); - switch (mode) { -// case DATEIS -> predicates.add(criteriaBuilder.equal(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); - case DATEISNOT -> predicates.add(criteriaBuilder.notEqual(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); - case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); - case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); + case DATEIS -> predicates.add(criteriaBuilder.equal(dateField, dateValue)); + case DATEISNOT -> predicates.add(criteriaBuilder.notEqual(dateField, dateValue)); + case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(dateTimeValue))); + case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(dateTimeValue))); } } } From f24df88f64b7ca212381f38cd44ecfd2ae7fb277 Mon Sep 17 00:00:00 2001 From: Piyush Date: Fri, 28 Feb 2025 18:03:18 +0530 Subject: [PATCH 20/34] Fixed issue related to amendment documents in evaluation --- .../dao/ApplicationEvaluationDao.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 24ce6d55..e07a65d2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -206,23 +206,27 @@ public class ApplicationEvaluationDao { amendmentDocumentResponseBean.setAmendmentId(applicationAmendmentRequestEntity.getId()); String amendmentDocument=applicationAmendmentRequestEntity.getAmendmentDocument(); String formField=applicationAmendmentRequestEntity.getFormFields(); - AmendmentDetailsResponseBean amendmentDetails = Utils.convertStringToObject(amendmentDocument, AmendmentDetailsResponseBean.class); - if (amendmentDetails != null) { - 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()); + if (StringUtils.isNotBlank(amendmentDocument)) { + AmendmentDetailsResponseBean amendmentDetails = Utils.convertStringToObject(amendmentDocument, AmendmentDetailsResponseBean.class); - amendmentDocumentResponseBean.setFileDetail(documentResponseBeans); + if (amendmentDetails != null) { + if (StringUtils.isNotBlank(amendmentDetails.getAmendmentDocuments())) { + 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.setFileDetail(documentResponseBeans); + } + + amendmentDocumentResponseBean.setFieldId("amend_" + applicationAmendmentRequestEntity.getId()); + amendmentDocumentResponseBean.setLabel(amendmentDetails.getAmendmentNotes()); + amendmentDocumentResponseBean.setValid(amendmentDetails.getValid()); + amendmentDocumentResponseBeans.add(amendmentDocumentResponseBean); } - 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) { for (AmendmentFormField amendmentFormField : amendmentFormFields) { From f11020bd7292f4f2977fac0100a97f30665bd05d Mon Sep 17 00:00:00 2001 From: Piyush Date: Fri, 28 Feb 2025 18:03:18 +0530 Subject: [PATCH 21/34] Fixed issue related to amendment documents in evaluation --- .../dao/ApplicationEvaluationDao.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 6f326e2c..a1d247eb 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -204,23 +204,27 @@ public class ApplicationEvaluationDao { amendmentDocumentResponseBean.setAmendmentId(applicationAmendmentRequestEntity.getId()); String amendmentDocument=applicationAmendmentRequestEntity.getAmendmentDocument(); String formField=applicationAmendmentRequestEntity.getFormFields(); - AmendmentDetailsResponseBean amendmentDetails = Utils.convertStringToObject(amendmentDocument, AmendmentDetailsResponseBean.class); - if (amendmentDetails != null) { - 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()); + if (StringUtils.isNotBlank(amendmentDocument)) { + AmendmentDetailsResponseBean amendmentDetails = Utils.convertStringToObject(amendmentDocument, AmendmentDetailsResponseBean.class); - amendmentDocumentResponseBean.setFileDetail(documentResponseBeans); + if (amendmentDetails != null) { + if (StringUtils.isNotBlank(amendmentDetails.getAmendmentDocuments())) { + 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.setFileDetail(documentResponseBeans); + } + + amendmentDocumentResponseBean.setFieldId("amend_" + applicationAmendmentRequestEntity.getId()); + amendmentDocumentResponseBean.setLabel(amendmentDetails.getAmendmentNotes()); + amendmentDocumentResponseBean.setValid(amendmentDetails.getValid()); + amendmentDocumentResponseBeans.add(amendmentDocumentResponseBean); } - 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) { for (AmendmentFormField amendmentFormField : amendmentFormFields) { From a0db6e8f20a0b6dd5b4e464a27bd6d71dea6a643 Mon Sep 17 00:00:00 2001 From: nisha Date: Mon, 3 Mar 2025 13:10:04 +0530 Subject: [PATCH 22/34] Updated code --- .../web/rest/api/errors/GlobalExceptionHandler.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java index 8b431b54..e6ee9234 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java @@ -25,6 +25,7 @@ import org.springframework.security.authorization.AuthorizationDeniedException; import org.springframework.security.core.AuthenticationException; import org.springframework.validation.FieldError; import org.springframework.validation.ObjectError; +import org.springframework.web.servlet.resource.NoResourceFoundException; @ControllerAdvice public class GlobalExceptionHandler { @@ -49,6 +50,7 @@ public class GlobalExceptionHandler { return new Response<>(ex.getErrors(), ex.getStatus(), ex.getMessage()); } + @ResponseStatus(value = HttpStatus.NOT_FOUND) @ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity> handleResourceNotFoundException(ResourceNotFoundException ex) { log.error(ex.getMessage()); @@ -178,5 +180,14 @@ public class GlobalExceptionHandler { String exceptionString = ex.getMessage().substring(ex.getMessage().indexOf("]: [") + 4, ex.getMessage().length() - 1); return Utils.convertIntoJson(exceptionString); } - + + @ResponseStatus(value = HttpStatus.NOT_FOUND) + @ExceptionHandler(NoResourceFoundException.class) + public ResponseEntity> handlNoeResourceNotFoundException(NoResourceFoundException ex) { + log.error(ex.getMessage()); +// log.error(ex.getLocalizedMessage(), ex); + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(null, Status.NOT_FOUND, ex.getMessage())); + } + } From 507447b4e42cbebd11b93d7697fa9a0a919efa94 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 3 Mar 2025 14:48:04 +0530 Subject: [PATCH 23/34] updated code --- src/main/java/net/gepafin/tendermanagement/dao/CallDao.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index c495d1d5..c34b32aa 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -612,11 +612,15 @@ public class CallDao { } } if (isEndDateUpdated || isEndTimeUpdated) { + loggingUtil.logUserAction(UserActionRequest.builder() .request(request) .actionType(UserActionLogsEnum.UPDATE) .actionContext(UserActionContextEnum.UPDATE_CALL_END_DATE_AND_TIME) .build()); + + /** This code is responsible for adding a version history log for the "update call end date and time" operation **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallEntity).newData(callEntity).build()); } // setIfUpdated(callEntity::getStartDate, callEntity::setStartDate, updateCallRequest.getStartDate()); From d64779ae382c9b1982d5b7a09a2a8ff61789ed13 Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 3 Mar 2025 14:49:03 +0530 Subject: [PATCH 24/34] Fixed issue of fileselect --- .../tendermanagement/dao/ApplicationDao.java | 9 +++++---- .../resources/db/changelog/db.changelog-1.0.0.xml | 11 +++++++++++ .../db/dump/update_form_field_data_03-03-2025.sql | 13 +++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/db/dump/update_form_field_data_03-03-2025.sql diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index eb17503f..62289ed7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -277,7 +277,8 @@ public class ApplicationDao { for (ApplicationFormFieldEntity applicationFormFieldEntity : applicationFormFieldEntities) { Optional fileUploadContent = contentResponseBeans.stream() - .filter(contentResponseBean -> "fileupload".equals(contentResponseBean.getName()) && + .filter(contentResponseBean -> ("fileupload".equals(contentResponseBean.getName()) || + "fileselect".equals(contentResponseBean.getName())) && contentResponseBean.getId().equals(applicationFormFieldEntity.getFieldId())) .findFirst(); @@ -613,7 +614,7 @@ public class ApplicationDao { List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); for (ContentResponseBean contentResponseBean : contentResponseBeans) { - if (Boolean.FALSE.equals(contentResponseBean.getName().equals("fileupload"))) { + if (Boolean.FALSE.equals(contentResponseBean.getName().equals("fileupload") || contentResponseBean.getName().equals("fileselect"))) { return; } } @@ -669,7 +670,7 @@ public class ApplicationDao { // List contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class); List contentResponseBeans=formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); for (ContentResponseBean contentResponseBean:contentResponseBeans){ - if(Boolean.TRUE.equals(contentResponseBean.getName().equals("fileupload"))) { + if(Boolean.TRUE.equals(contentResponseBean.getName().equals("fileupload")) || Boolean.TRUE.equals(contentResponseBean.getName().equals("fileselect"))) { if (contentResponseBean.getId().equals(applicationFormFieldRequestBean.getFieldId())) { Object fieldValueObject = applicationFormFieldRequestBean.getFieldValue(); if (fieldValueObject instanceof String) { @@ -1405,7 +1406,7 @@ public class ApplicationDao { FormEntity formEntity = applicationForm.getForm(); if (formEntity != null) { List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); - contentResponseBeans.stream().filter(content -> "fileupload".equals(content.getName())).forEach(content -> { + contentResponseBeans.stream().filter(content -> "fileupload".equals(content.getName()) || "fileselect".equals(content.getName())).forEach(content -> { Optional formField = applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( content.getId(), applicationForm.getId(), applicationId); formField.ifPresent(field -> { 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 de68936a..66bf7b3b 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 @@ -2550,5 +2550,16 @@ + + + + select + setval('gepafin_schema.form_field_id_seq', (select + max(id)+1 + from gepafin_schema.form_field), false) + + + diff --git a/src/main/resources/db/dump/update_form_field_data_03-03-2025.sql b/src/main/resources/db/dump/update_form_field_data_03-03-2025.sql new file mode 100644 index 00000000..8f377847 --- /dev/null +++ b/src/main/resources/db/dump/update_form_field_data_03-03-2025.sql @@ -0,0 +1,13 @@ + +INSERT INTO FORM_FIELD (SORT_ORDER, NAME, LABEL, DESCRIPTION, SETTINGS, VALIDATORS, CREATED_DATE, UPDATED_DATE) +VALUES +( + 23, + 'fileselect', + 'Caricamento File', + 'Per selezionare di documenti o immagini', + '[{name: "label",value: "Seleziona File"},{ name: "isDelegation", value: false }]', + '{"isRequired":false}', + CURRENT_TIMESTAMP, + CURRENT_TIMESTAMP +); \ No newline at end of file From b4165e38fda045cf36066da17deb4487c7d28539 Mon Sep 17 00:00:00 2001 From: Piyush Date: Mon, 3 Mar 2025 16:00:46 +0530 Subject: [PATCH 25/34] Done ticket GEPAFINBE-179 --- .../repositories/ApplicationRepository.java | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 6eba956e..3b817314 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -8,8 +8,6 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.math.BigDecimal; -import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -112,24 +110,31 @@ public interface ApplicationRepository extends JpaRepository findRequestedVsApprovedAmountsPerMonth( - @Param("hubId") Long hubId, - @Param("userId") Long userId, - @Param("userWithCompanyId") Long userWithCompanyId - ); + @Query(value = """ + WITH months AS ( + SELECT TO_CHAR(generate_series(CURRENT_DATE - INTERVAL '5 months', CURRENT_DATE, INTERVAL '1 month'), 'Mon') AS month_label, + EXTRACT(YEAR FROM generate_series(CURRENT_DATE - INTERVAL '5 months', CURRENT_DATE, INTERVAL '1 month')) AS year_value, + EXTRACT(MONTH FROM generate_series(CURRENT_DATE - INTERVAL '5 months', CURRENT_DATE, INTERVAL '1 month')) AS month_value + ) + SELECT m.month_label AS month, + COALESCE(SUM(a.amount_requested), 0) AS totalRequested, + COALESCE(SUM(a.amount_accepted), 0) AS totalApproved + FROM months m + LEFT JOIN {h-schema}application a ON EXTRACT(YEAR FROM a.date_accepted) = m.year_value + AND EXTRACT(MONTH FROM a.date_accepted) = m.month_value + AND a.is_deleted = false + AND a.status = 'APPROVED' + AND a.hub_id = :hubId + AND a.user_id = :userId + AND a.user_with_company_id = :userWithCompanyId + GROUP BY m.month_label, m.year_value, m.month_value + ORDER BY m.year_value, m.month_value + """, nativeQuery = true) + List findRequestedVsApprovedAmountsPerMonth(@Param("hubId") Long hubId, + @Param("userId") Long userId, + @Param("userWithCompanyId") Long userWithCompanyId); + + @Query("SELECT COUNT(a) FROM ApplicationEntity a " + "WHERE a.hubId = :hubId " + @@ -164,4 +169,5 @@ public interface ApplicationRepository extends JpaRepository Date: Tue, 4 Mar 2025 12:32:24 +0530 Subject: [PATCH 26/34] Updated code for changes in evaluation Api --- .../tendermanagement/dao/ApplicationDao.java | 45 ---------------- .../dao/ApplicationEvaluationDao.java | 54 ++++++++++++++++++- .../enums/ApplicationStatusForEvaluation.java | 4 +- 3 files changed, 56 insertions(+), 47 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 62289ed7..0b565c89 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -964,14 +964,6 @@ public class ApplicationDao { applicationEntity.setStatus(status.getValue()); log.info("Status updated to DRAFT for applicationId: " + applicationId); } - if(status.equals(ApplicationStatusTypeEnum.ADMISSIBLE) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.APPOINTMENT.getValue()))){ - applicationEntity.setStatus(status.getValue()); - log.info("Status updated to ADMISSIBLE for applicationId: " + applicationId); - emailNotificationDao.sendAdmissibilityNotificationEmailForAdmissibleApplication(applicationEntity); - } - if(status.equals(ApplicationStatusTypeEnum.TECHNICAL_EVALUATION) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.ADMISSIBLE.getValue()))){ - processTechnicalEvaluation(applicationId, applicationEntity, status); - } applicationEntity = applicationRepository.save(applicationEntity); log.info("Application status updated successfully | applicationId: {}, newStatus: {}", applicationId, applicationEntity.getStatus()); @@ -983,43 +975,6 @@ public class ApplicationDao { return getApplicationResponse(applicationEntity); } - private void processTechnicalEvaluation(Long applicationId, ApplicationEntity applicationEntity, ApplicationStatusTypeEnum status){ - Optional evaluationEntityOpt = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationId); - if (evaluationEntityOpt.isPresent()){ - ApplicationEvaluationEntity evaluationEntity = evaluationEntityOpt.get(); - String criteriaJson = evaluationEntity.getCriteria(); - if (criteriaJson != null){ - Integer totalScore = calculateTotalScore(evaluationEntity.getCriteria()); - if (totalScore > 40) { - applicationEntity.setStatus(status.getValue()); - log.info("Status updated to TECHNICAL_EVALUATION for applicationId: " + applicationId); - } - else{ - throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.INSUFFICIENT_SCORE_MESSAGE)); - } - } - } - } - - private Integer calculateTotalScore(String criteriaJson){ - try { - ObjectMapper objectMapper = new ObjectMapper(); - // Convert JSON string to List of Maps - List> criteriaList = objectMapper.readValue(criteriaJson, new TypeReference<>() { - }); - - // Sum all scores (ignoring null scores) - Integer totalScore = criteriaList.stream() - .mapToInt(obj -> obj.get("score") != null ? ((Number) obj.get("score")).intValue() : 0) - .sum(); - - return totalScore; - } - catch (Exception e) { - log.error(" Error parsing criteria JSON: {}", e.getMessage()); - return 0; - } - } public Integer calculateProgress(Long totalSteps, Long completedSteps) { if (FieldValidator.isNullOrZero(totalSteps)) { throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.TOTAL_STEPS_NOT_BE_ZERO)); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index e07a65d2..336db880 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1862,7 +1862,21 @@ public class ApplicationEvaluationDao { // UserEntity userEntity = userService.validateUser(application.getUserId()); // callService.validatePublishedCall(application.getCall().getId(), userEntity.getHub().getId()); ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(application); - application.setStatus(newStatus.getValue()); + + + if(newStatus.equals(ApplicationStatusForEvaluation.ADMISSIBLE) && Boolean.TRUE.equals(application.getStatus().equals(ApplicationStatusTypeEnum.APPOINTMENT.getValue()))){ + application.setStatus(newStatus.getValue()); + log.info("Status updated to ADMISSIBLE for applicationId: " + application.getId()); + emailNotificationDao.sendAdmissibilityNotificationEmailForAdmissibleApplication(application); + } + + if(newStatus.equals(ApplicationStatusForEvaluation.TECHNICAL_EVALUATION) && Boolean.TRUE.equals(application.getStatus().equals(ApplicationStatusTypeEnum.ADMISSIBLE.getValue()))){ + processTechnicalEvaluation(application.getId(), application, newStatus); + } + + if((newStatus.equals(ApplicationStatusForEvaluation.APPROVED) || newStatus.equals(ApplicationStatusForEvaluation.REJECTED)) && application.getStatus().equals(ApplicationStatusTypeEnum.EVALUATION.getValue())) { + application.setStatus(newStatus.getValue()); + } application = applicationRepository.save(application); /** This code is responsible for adding a version history log for the "Update Application" operation. **/ @@ -2423,5 +2437,43 @@ public class ApplicationEvaluationDao { } return false; } + private void processTechnicalEvaluation(Long applicationId, ApplicationEntity applicationEntity, ApplicationStatusForEvaluation status){ + Optional evaluationEntityOpt = applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(applicationId); + if (evaluationEntityOpt.isPresent()){ + ApplicationEvaluationEntity evaluationEntity = evaluationEntityOpt.get(); + String criteriaJson = evaluationEntity.getCriteria(); + if (criteriaJson != null){ + Integer totalScore = calculateTotalScore(evaluationEntity.getCriteria()); + if (totalScore > 40) { + applicationEntity.setStatus(status.getValue()); + log.info("Status updated to TECHNICAL_EVALUATION for applicationId: " + applicationId); + } + else{ + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.INSUFFICIENT_SCORE_MESSAGE)); + } + } + } + } + + private Integer calculateTotalScore(String criteriaJson){ + try { + ObjectMapper objectMapper = new ObjectMapper(); + // Convert JSON string to List of Maps + List> criteriaList = objectMapper.readValue(criteriaJson, new TypeReference<>() { + }); + + // Sum all scores (ignoring null scores) + Integer totalScore = criteriaList.stream() + .mapToInt(obj -> obj.get("score") != null ? ((Number) obj.get("score")).intValue() : 0) + .sum(); + + return totalScore; + } + catch (Exception e) { + log.error(" Error parsing criteria JSON: {}", e.getMessage()); + return 0; + } + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusForEvaluation.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusForEvaluation.java index 61c39b8e..f0f6acb8 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusForEvaluation.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusForEvaluation.java @@ -4,7 +4,9 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum ApplicationStatusForEvaluation { APPROVED("APPROVED"), - REJECTED("REJECTED"); + REJECTED("REJECTED"), + ADMISSIBLE("ADMISSIBLE"), + TECHNICAL_EVALUATION("TECHNICAL_EVALUATION"); private String value; From a9166ae3fe4d633ab7a462770ba3fd0c3f75b730 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 4 Mar 2025 12:42:50 +0530 Subject: [PATCH 27/34] Updated code for fileselect config in pdf --- src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 0569e28d..68129e98 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -560,7 +560,7 @@ public class PdfDao { } // Process 'fileupload' and 'checkboxes' cases as in the original logic - if (name.equals("fileupload")) { + if (name.equals("fileupload") || name.equals("fileselect")) { if (fieldValue instanceof List && ((List) fieldValue).stream().allMatch(item -> item instanceof DocumentResponseBean)) { List documentList = (List) fieldValue; List names = documentList.stream() From cb6189baffdc1a7794a01a76daab1bad14fe41f9 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 4 Mar 2025 15:45:09 +0530 Subject: [PATCH 28/34] Fixed application amendment issue --- .../tendermanagement/dao/ApplicationAmendmentRequestDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 23747301..e9621798 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -1047,7 +1047,7 @@ public class ApplicationAmendmentRequestDao { List amendmentRequests = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse( existingApplicationAmendment.getApplicationEvaluationEntity().getId()); - Boolean allClosed = amendmentRequests.stream().allMatch(amendment -> amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue())); + Boolean allClosed = amendmentRequests.stream().allMatch(amendment -> (amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue()) || amendment.getStatus().equals(ApplicationAmendmentRequestEnum.EXPIRED.getValue()))); ApplicationEntity application = applicationService.validateApplication(existingApplicationAmendment.getApplicationId()); ApplicationEntity oldApplicationEntityData = Utils.getClonedEntityForData(application); if (Boolean.TRUE.equals(allClosed)) { From 59d6387b3fa03be8807382b367a8580655f697bf Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 4 Mar 2025 16:41:34 +0530 Subject: [PATCH 29/34] updated code --- .../tendermanagement/dao/CompanyDocumentDao.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java index f43c6a90..0ef3349a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDocumentDao.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.dao; +import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.CopyObjectRequest; import jakarta.persistence.criteria.Predicate; @@ -33,6 +34,7 @@ import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; +import java.net.URL; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -86,6 +88,9 @@ public class CompanyDocumentDao { @Autowired private Validator validator; + @Autowired + private AmazonS3 amazonS3; + public List uploadFileForCompany(HttpServletRequest request, Long userId, List files, Long companyId, Long documentCategoryId, CompanyDocumentTypeEnum companyDocumentSourceTypeEnum, LocalDateTime expirationDate,String name){ DocumentCategoryEntity categoryEntity = categoryDao.validateCategory(documentCategoryId); validator.validateUserWithCompany(request,companyId); @@ -271,8 +276,11 @@ public class CompanyDocumentDao { s3Client.copyObject(copyRequest); log.info("File copied successfully from {} to {}", oldS3Path, newS3Path); + URL amazonS3Url = amazonS3.getUrl(bucketName, newS3Path); + String fileUrl = amazonS3Url.toString(); + DocumentEntity entity = new DocumentEntity(); - entity.setFilePath(newS3Path); + entity.setFilePath(fileUrl); entity.setFileName(companyDocumentEntity.getFileName()); entity.setSource(DocumentSourceTypeEnum.APPLICATION.getValue()); entity.setType(documentTypeEnum.getValue()); From d1ee521e18a6c823ccdd2c7ccf4e07be726aa03a Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 4 Mar 2025 19:15:27 +0530 Subject: [PATCH 30/34] Fixed issue for application updated date --- .../java/net/gepafin/tendermanagement/dao/ApplicationDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 0b565c89..9b3466fe 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -424,7 +424,7 @@ public class ApplicationDao { responseBean.setCallTitle(applicationEntity.getCall().getName()); responseBean.setCallEndDate(applicationEntity.getCall().getEndDate()); responseBean.setCallEndTime(applicationEntity.getCall().getEndTime()); - responseBean.setModifiedDate(applicationEntity.getCall().getUpdatedDate()); + responseBean.setModifiedDate(applicationEntity.getUpdatedDate()); responseBean.setCallId(applicationEntity.getCall().getId()); responseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); responseBean.setStatus(applicationEntity.getStatus()); From 63a60b2522d0a8693f36c0dd25abfadde2eff96d Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 5 Mar 2025 15:03:51 +0530 Subject: [PATCH 31/34] Done ticket GEPAFINBE-181 --- .../constants/GepafinConstant.java | 5 + .../gepafin/tendermanagement/dao/CallDao.java | 137 +++++++++++++++++- .../request/CallPageableRequestBean.java | 3 + 3 files changed, 141 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 8f29a46f..ff6ac233 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -485,6 +485,11 @@ public class GepafinConstant { public static final String USAGE="usage"; public static final String LIMIT="limit"; public static final String DATA="data"; + + public static final String PREFERRED_CALL_ID="preferredCallId"; + + public static final String REGION_ID="regionId"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index c34b32aa..bef8c76f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -4,17 +4,18 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; +import java.sql.Timestamp; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.Predicate; -import jakarta.persistence.criteria.Root; +import jakarta.persistence.criteria.*; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.*; @@ -1058,10 +1059,14 @@ public class CallDao { Integer year = null; String search = null; + Map filters = new HashMap<>(); if (callPageableRequestBean.getGlobalFilters() != null) { year = callPageableRequestBean.getGlobalFilters().getYear(); search = callPageableRequestBean.getGlobalFilters().getSearch(); } + if (callPageableRequestBean.getFilters() != null) { + filters = callPageableRequestBean.getFilters(); + } List predicates = new ArrayList<>(); if (year != null && year > 0) { int filterYear = callPageableRequestBean.getGlobalFilters().getYear(); @@ -1104,7 +1109,7 @@ public class CallDao { .toList(); predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); } - + applyFilters(root, criteriaBuilder, predicates, filters); predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB).get(GepafinConstant.ID), userEntity.getHub().getId())); @@ -1112,6 +1117,130 @@ public class CallDao { } + private void applyFilters(Root root, CriteriaBuilder criteriaBuilder, List predicates, Map filters) { + if (Boolean.FALSE.equals(filters.isEmpty())) { + for (Map.Entry entry : filters.entrySet()) { + String fieldName = entry.getKey(); + FilterCriteria filterCriteria = entry.getValue(); + Object value = filterCriteria.getValue(); + MatchModeEnum matchMode = filterCriteria.getMatchMode(); + + if (value != null && matchMode != null) { + Path fieldPath = getFieldPath(root, fieldName); + if (fieldPath != null) { + applyStringFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); + applyNumberFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); + applyDateFilter(fieldPath, criteriaBuilder, predicates, value, matchMode,root); + } + } + } + } + } + + private void applyStringFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode) { + if (value instanceof String) { + String valueStr = (String) value; + if (fieldPath.getJavaType().equals(String.class)) { + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); + switch (mode) { + case CONTAINS -> + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase() + "%")); + case EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, valueStr)); + case STARTSWITH -> + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), valueStr.toLowerCase() + "%")); + case ENDSWITH -> + predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase())); + } + } + } + } + + private void applyNumberFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode) { + if (Number.class.isAssignableFrom(fieldPath.getJavaType())) { + Number numberValue = null; + if (value instanceof Number) { + numberValue = (Number) value; + } + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); + switch (mode) { + case EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, numberValue)); + } + } + } + + + + + private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode, Root root) { + if (fieldPath.getJavaType().equals(LocalDateTime.class)) { + // Convert input string: Replace 'T' with space + String formattedValue = value.toString().replace("T", " "); + + // Handle timezones and UTC (`Z` or `+HH:mm`) + if (formattedValue.contains("Z") || formattedValue.matches(".*[+-]\\d{2}:\\d{2}$")) { + OffsetDateTime offsetDateTime = OffsetDateTime.parse(value.toString(), DateTimeFormatter.ISO_OFFSET_DATE_TIME); + formattedValue = offsetDateTime.toLocalDateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS")); + } + + // Check if more than 3 decimal places exist + if (formattedValue.contains(".")) { + int dotIndex = formattedValue.indexOf("."); + if (formattedValue.length() > dotIndex + 4) { + formattedValue = formattedValue.substring(0, dotIndex + 4); // Keep only 3 decimals + } + } else { + formattedValue += ".000"; // Ensure 3 decimals + } + + // Define correct date-time format + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + + // Parse the formatted value into LocalDateTime + LocalDateTime dateTimeValue = LocalDateTime.parse(formattedValue, formatter); + + // Extract only the date portion + LocalDate dateValue = dateTimeValue.toLocalDate(); + + // Convert database field to LocalDate for date-only comparison + Expression dateField = criteriaBuilder.function("DATE", LocalDate.class, fieldPath); + + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); + + switch (mode) { + case DATEIS -> predicates.add(criteriaBuilder.equal(dateField, dateValue)); + case DATEISNOT -> predicates.add(criteriaBuilder.notEqual(dateField, dateValue)); + case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(dateTimeValue))); + case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(dateTimeValue))); + } + } + } + + + + + private Path getFieldPath(Root root, String fieldName) { + try { + return switch (fieldName) { + + case GepafinConstant.REGION_ID -> { + // Ensure join is only created if not already present + Join regionJoin = root.getJoins().stream() + .filter(j -> j.getAttribute().getName().equals("region")) + .findFirst() + .map(j -> (Join) j) + .orElseGet(() -> root.join("region", JoinType.LEFT)); + + yield regionJoin.get("id"); + } + + default -> root.get(fieldName); + }; + } catch (IllegalArgumentException e) { + return null; + } + } + + public CallResponse createCallStep2EvaluationV2(CallEntity callEntity, CreateCallRequestStep2EvaluationV2 createCallRequest, UserEntity user) { convertToDocumentEntities(createCallRequest.getDocs(), callEntity.getId(), DocumentTypeEnum.DOCUMENT); diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java index 8b848c85..260a45e5 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java @@ -4,6 +4,7 @@ import lombok.Data; import net.gepafin.tendermanagement.enums.CallStatusEnum; import java.util.List; +import java.util.Map; @Data public class CallPageableRequestBean { @@ -11,4 +12,6 @@ public class CallPageableRequestBean { private GlobalFilters globalFilters; private List status; + + private Map filters; } From aa092a49d8c99c213a786a25d4c353fd11aed93d Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 5 Mar 2025 16:15:30 +0530 Subject: [PATCH 32/34] Updated code for call pagination filter --- .../tendermanagement/enums/MatchModeEnum.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java index f3ee252c..89eb4268 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java @@ -4,14 +4,14 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum MatchModeEnum { - STARTSWITH("Starts with"), - ENDSWITH("Ends with"), - CONTAINS("Contains"), - EQUALS("Equals"), - DATEIS("Date is"), - DATEISNOT("Date is not"), - BEFORE("Date is before"), - AFTER("Date is after"); + STARTSWITH("starts with"), + ENDSWITH("ends with"), + CONTAINS("contains"), + EQUALS("equals"), + DATEIS("date is"), + DATEISNOT("date is not"), + BEFORE("date is before"), + AFTER("date is after"); private String value; From b6f20674cbc63f90fd273b43f5f2cf97463cd5a5 Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 5 Mar 2025 17:31:43 +0530 Subject: [PATCH 33/34] Updated code for date filter in call pagination endpoint --- .../tendermanagement/enums/MatchModeEnum.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java index 89eb4268..878c7f85 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java @@ -4,14 +4,14 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum MatchModeEnum { - STARTSWITH("starts with"), - ENDSWITH("ends with"), + STARTSWITH("startsWith"), + ENDSWITH("endsWith"), CONTAINS("contains"), EQUALS("equals"), - DATEIS("date is"), - DATEISNOT("date is not"), - BEFORE("date is before"), - AFTER("date is after"); + DATEIS("dateIs"), + DATEISNOT("dateIsNot"), + BEFORE("dateBefore"), + AFTER("dateAfter"); private String value; From 0580751b5e3b36e99f0a8b34f7f295b9185f4c8d Mon Sep 17 00:00:00 2001 From: nisha Date: Wed, 5 Mar 2025 19:01:27 +0530 Subject: [PATCH 34/34] Inserted new role and a user for confidi --- .../db/changelog/db.changelog-1.0.0.xml | 61 ++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 66bf7b3b..04ed853f 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -2561,5 +2561,64 @@ - + + select + setval('gepafin_schema.role_id_seq', (select + max(id)+1 + from gepafin_schema.role), false) + + select + setval('gepafin_schema.beneficiary_id_seq', (select + max(id)+1 + from gepafin_schema.beneficiary), false) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +