From 6d66037adbb4a8728987b1733868ca98bb7d377f Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 18 Jun 2025 20:23:12 +0530 Subject: [PATCH] Done ticket GEPAFINBE-223 & GEPAFINBE-224 --- .../constants/GepafinConstant.java | 2 + .../tendermanagement/dao/ApplicationDao.java | 82 +++++++++++++----- .../tendermanagement/dao/AppointmentDao.java | 85 ++++++++++++++++--- .../tendermanagement/dao/CompanyDao.java | 67 +++++++++++---- .../entities/ApplicationEntity.java | 3 + .../entities/NdganagEntity.java | 33 +++++++ .../enums/UserActionContextEnum.java | 2 + .../repositories/CompanyRepository.java | 2 + .../repositories/NdganagRepository.java | 14 +++ .../service/AppointmentService.java | 3 + .../service/CompanyService.java | 1 + .../service/impl/AppointmentServiceImpl.java | 12 +++ .../service/impl/CompanyServiceImpl.java | 8 +- .../web/rest/api/AppointmentApi.java | 11 +++ .../web/rest/api/CompanyApi.java | 13 +++ .../rest/api/impl/AppointmentController.java | 16 ++++ .../rest/api/impl/CompanyApiController.java | 13 +++ .../db/changelog/db.changelog-1.0.0.xml | 20 +++++ src/main/resources/message_en.properties | 2 + src/main/resources/message_it.properties | 2 + 20 files changed, 344 insertions(+), 47 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/NdganagEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/NdganagRepository.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 90988320..3874fc83 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -572,6 +572,8 @@ public class GepafinConstant { public static final String PROTOCOL_EXTERNAL_DATE="DATA_PG_DT"; public static final String PROTOCOL_DOC_SUFFIX="#noauth"; public static final String CREATE_NDG="CHECK_OR_CREATE_NDG_CODE"; + public static final String NDG_NOT_FOUND="ndg.not.found"; + public static final String EMAIL_PEC_REQUIRED="email.pec.cannot.null"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 38067a66..02fb01d2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -557,25 +557,69 @@ public class ApplicationDao { VersionActionTypeEnum actionType = VersionActionTypeEnum.INSERT; List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); - contentResponseBeans.stream() - .filter(content -> "numberinput".equals(content.getName()) && content.getId().toString().equals(applicationFormFieldRequestBean.getFieldId())) - .map(ContentResponseBean::getSettings) - .flatMap(List::stream) - .filter(setting -> "isRequestedAmount".equals(setting.getName()) && Boolean.TRUE.equals(setting.getValue())) - .findFirst() - .ifPresent(setting -> { - Object fieldValue = applicationFormFieldRequestBean.getFieldValue(); - if(fieldValue!=null) { - try { - BigDecimal amountRequested = new BigDecimal(fieldValue.toString()); - applicationFormEntity.getApplication().setAmountRequested(amountRequested); - log.info("Set amountRequested to {} for Application ID: {}", amountRequested, applicationFormEntity.getApplication().getId()); - } catch (NumberFormatException e) { - log.error("Invalid number format for requested amount: {}", fieldValue, e); - throw new IllegalArgumentException("Field value is not a valid number: " + fieldValue, e); - } - } - }); +// contentResponseBeans.stream() +// .filter(content -> "numberinput".equals(content.getName()) && content.getId().toString().equals(applicationFormFieldRequestBean.getFieldId())) +// .map(ContentResponseBean::getSettings) +// .flatMap(List::stream) +// .filter(setting -> "isRequestedAmount".equals(setting.getName()) && Boolean.TRUE.equals(setting.getValue())) +// .findFirst() +// .ifPresent(setting -> { +// Object fieldValue = applicationFormFieldRequestBean.getFieldValue(); +// if(fieldValue!=null) { +// try { +// BigDecimal amountRequested = new BigDecimal(fieldValue.toString()); +// applicationFormEntity.getApplication().setAmountRequested(amountRequested); +// log.info("Set amountRequested to {} for Application ID: {}", amountRequested, applicationFormEntity.getApplication().getId()); +// } catch (NumberFormatException e) { +// log.error("Invalid number format for requested amount: {}", fieldValue, e); +// throw new IllegalArgumentException("Field value is not a valid number: " + fieldValue, e); +// } +// } +// }); + + contentResponseBeans.stream() + .filter(content -> content.getId().toString().equals(applicationFormFieldRequestBean.getFieldId())) + .findFirst() + .ifPresent(content -> { + Object fieldValue = applicationFormFieldRequestBean.getFieldValue(); + if (fieldValue == null) { + return; + } + + // Convert settings list to a map + Map settingMap = content.getSettings().stream() + .collect(Collectors.toMap(SettingResponseBean::getName, SettingResponseBean::getValue, (v1, v2) -> v1)); + + String fieldType = content.getName(); + + // Define handlers for different (fieldType + settingName) combinations + Map handlers = new HashMap<>(); + + // Add handler for isRequestedAmount + if ("numberinput".equals(fieldType) && Boolean.TRUE.equals(settingMap.get("isRequestedAmount"))) { + handlers.put("isRequestedAmount", () -> { + try { + BigDecimal amountRequested = new BigDecimal(fieldValue.toString()); + applicationFormEntity.getApplication().setAmountRequested(amountRequested); + log.info("Set amountRequested to {} for Application ID: {}", amountRequested, applicationFormEntity.getApplication().getId()); + } catch (NumberFormatException e) { + log.error("Invalid number format for requested amount: {}", fieldValue, e); + throw new IllegalArgumentException("Field value is not a valid number: " + fieldValue, e); + } + }); + } + + // Add handler for isPecEmail + if ("textinput".equals(fieldType) && Boolean.TRUE.equals(settingMap.get("isPecEmail"))) { + handlers.put("isPecEmail", () -> { + applicationFormEntity.getApplication().setPecEmail(fieldValue.toString()); + log.info("Set PEC to {} for Application ID: {}", fieldValue, applicationFormEntity.getApplication().getId()); + }); + } + + // Run all applicable handlers + handlers.values().forEach(Runnable::run); + }); ApplicationFormFieldEntity oldApplicationFormFieldData = null; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index 66bf44d7..76a7fcff 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java @@ -138,6 +138,9 @@ public class AppointmentDao { @Autowired private ApplicationEvaluationDao applicationEvaluationDao; + @Autowired + private NdganagRepository ndganagRepository; + private final Map executorMap = new ConcurrentHashMap<>(); @@ -535,7 +538,13 @@ public class AppointmentDao { String authorizationToken = getBearerToken(hub); // Try retrieving NDG by VAT number - AppointmentLoginResponse ndgResponse = retrieveNdgByVatNumber(company.getVatNumber(), authorizationToken, hub, application); + NdganagEntity ndganagEntity = ndganagRepository.findByVatNumber(company.getVatNumber()); + AppointmentLoginResponse ndgResponse=new AppointmentLoginResponse(); + if (ndganagEntity != null || ndganagEntity.getNdg() != null) { + ndgResponse.setNdg(ndganagEntity.getNdg()); + }else { + ndgResponse = retrieveNdgByVatNumber(company.getVatNumber(), authorizationToken, hub, application); + } if (isNdgValid(ndgResponse.getNdg())) { saveNdg(application, company, ndgResponse.getNdg()); log.info("NDG successfully generated for applicationId: {}", applicationId); @@ -716,10 +725,7 @@ public class AppointmentDao { try { log.info("Initiating NDG retrieval by VAT number | ApplicationId: {}, HubId: {}, VAT: {}", application.getId(), hub.getId(), vatNumber); // Prepare the NDG request - AppointmentNdgRequest ndgRequest = getAppointmentNdgRequest(vatNumber); - // Call the API to retrieve NDG - ResponseEntity response = appointmentApiService.getNdgByVatNumber(ndgRequest, authorizationToken); - String responseJson = Utils.convertObjectToJson(response.getBody()); + String responseJson = getNdgFromExternalService(vatNumber, authorizationToken); // Parse and return the NDG response return parseNdgResponse(responseJson); } catch (FeignException.Forbidden forbiddenException) { @@ -875,30 +881,38 @@ public class AppointmentDao { } public AppointmentLoginResponse parseNdgResponse(String jsonResponse) { + AppointmentLoginResponse loginResponse = new AppointmentLoginResponse(); + String ndg=extractNdg(jsonResponse); + if (ndg==null){ return null;} + else { + loginResponse.setNdg(ndg); + } + return loginResponse; + } + private String extractNdg(String jsonResponse) { try { ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(jsonResponse); JsonNode dataArray = rootNode.get(GepafinConstant.DATA_STRING); if (dataArray == null || !dataArray.isArray() || dataArray.isEmpty()) { log.info("NDG data is empty or missing in the response."); - AppointmentLoginResponse emptyResponse = new AppointmentLoginResponse(); - emptyResponse.setNdg(null); - return emptyResponse; + return null; } JsonNode firstDataEntry = dataArray.get(0); AppointmentLoginResponse response = new AppointmentLoginResponse(); if (firstDataEntry.has(GepafinConstant.NDG_STRING)) { - response.setNdg(normalizeNullValue(firstDataEntry.get(GepafinConstant.NDG_STRING).asText())); + String ndg=normalizeNullValue(firstDataEntry.get(GepafinConstant.NDG_STRING).asText()); + return ndg; } - return response; } catch (Exception e) { log.error("Failed to parse response: {}", e.getMessage(), e); throw new RuntimeException("Failed to parse NDG response.", e); } + return null; } - private String normalizeNullValue(String value) { + public String normalizeNullValue(String value) { return (value == null || GepafinConstant.NULL_STRING.equalsIgnoreCase(value.trim())) ? null : value; } @@ -1415,5 +1429,54 @@ public class AppointmentDao { futureRef.set(future); } + public NdgResponse getNdgByVatNumber(String vatNumber, UserEntity userEntity) { + HubEntity hub=userEntity.getHub(); + NdganagEntity ndganagEntity = ndganagRepository.findByVatNumber(vatNumber); + NdgResponse ndgResponse=new NdgResponse(); + String jsonResponse=null; + String authorizationToken = hub.getAppointmentAuthTokenId(); + if (ndganagEntity == null || ndganagEntity.getNdg() == null) { + + try { + log.info("Initiating NDG retrieval by VAT number | HubId: {}, VAT: {}", hub.getId(), vatNumber); + // Prepare the NDG request + jsonResponse=getNdgFromExternalService(vatNumber, authorizationToken); + checkAndSaveNdg(jsonResponse, ndgResponse); + // Parse and return the NDG response + } catch (FeignException.Forbidden forbiddenException) { + log.error("403 Forbidden during NDG retrieval | HubId: {}", hub.getId()); + logForbiddenError(); + // Regenerate the token and retry + String newAuthorizationToken = regenerateTokenAndSave(hub, null); + jsonResponse= getNdgFromExternalService(vatNumber,newAuthorizationToken); + if (checkAndSaveNdg(jsonResponse, ndgResponse)) return null; + } catch (Exception e) { + log.error("Error during NDG retrieval |, HubId: {}, Message: {}", hub.getId(), e.getMessage(), e); + throw new RuntimeException("NDG retrieval failed.", e); + } + }else { + ndgResponse.setNdg(ndganagEntity.getNdg()); + } + return ndgResponse; + } + + private boolean checkAndSaveNdg(String jsonResponse, NdgResponse ndgResponse) { + String ndg=extractNdg(jsonResponse); + if (ndg==null){ + return true; + } + else { + ndgResponse.setNdg(ndg); + } + return false; + } + + private String getNdgFromExternalService(String vatNumber, String authorizationToken) { + AppointmentNdgRequest ndgRequest = getAppointmentNdgRequest(vatNumber); + // Call the API to retrieve NDG + ResponseEntity response = appointmentApiService.getNdgByVatNumber(ndgRequest, authorizationToken); + String responseJson = Utils.convertObjectToJson(response.getBody()); + return responseJson; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java index 26ca3f29..8b59eebe 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.dao; import org.springframework.data.domain.Pageable; // Correct package +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -413,7 +414,7 @@ public class CompanyDao { Translator.toLocale(GepafinConstant.INVALID_LIMIT)); } - int successfulUpdates = 0; + int successfulUpdates = 0; int failedUpdates = 0; int invalidVatNumbers = 0; @@ -531,7 +532,11 @@ public class CompanyDao { Map dataMap = Utils.extractMap(companyDataMap, "data"); Object dataObj = companyDataMap.get("data"); - if (dataMap == null) { + if (dataObj instanceof Map singleMap) { + dataMap = (Map) singleMap; + } else if (dataObj instanceof List list && !list.isEmpty() && list.get(0) instanceof Map firstMap) { + dataMap = (Map) firstMap; + } else { log.warn("Company ID {}: 'data' section is missing or invalid in the JSON.", company.getId()); return; } @@ -540,11 +545,11 @@ public class CompanyDao { updateCodiceAtecoField(company); } else { - Object pecEmail = Utils.extractMap(dataMap, "pec"); + Object pecEmail = dataMap.get("pec"); if (pecEmail == null) { log.warn("Company ID {}: 'pec' section is missing or invalid.", company.getId()); - company.setPec((String) pecEmail); } + company.setPec((String) pecEmail); // Extract 'atecoClassification' section Map atecoClassificationMap = Utils.extractMap(dataMap, "atecoClassification"); @@ -577,49 +582,79 @@ public class CompanyDao { } public void getCompanyEntity() { - List companyEntities=companyRepository.findAll(); + List companyEntities=companyRepository.findByJsonIsNotNullAndPecIsNull(); + List companyEntityList=new ArrayList<>(); for (CompanyEntity company:companyEntities){ - if(company.getJson()!=null){ + if(company.getJson()!=null && company.getPec()==null){ if (company == null || company.getJson() == null || company.getJson().isEmpty()) { log.warn("Company is null or JSON data is empty."); - return; + continue; } Map vatCheckResponse = Utils.convertJsonStringToMap(company.getJson()); if (vatCheckResponse == null) { log.warn("Company ID {}: Invalid JSON response.", company.getId()); - return; + continue; } Map companyDataMap = Utils.convertJsonStringToMap(company.getJson()); if (companyDataMap == null) { log.warn("Company ID {}: Failed to parse JSON data.", company.getId()); - return; + continue; } + Object dataObj = vatCheckResponse.get("data"); - if (!(dataObj instanceof Map dataMap)) { - log.warn("Company ID {}: 'data' is missing or not a valid object.", company.getId()); - return; + Map dataMap=null; +// if (!(dataObj instanceof Map dataMap)) { +// log.warn("Company ID {}: 'data' is missing or not a valid object.", company.getId()); +// continue; +// } + + if (dataObj instanceof Map singleMap) { + dataMap = (Map) singleMap; + } else if (dataObj instanceof List list && !list.isEmpty() && list.get(0) instanceof Map firstMap) { + dataMap = (Map) firstMap; + } else { + log.warn("Company ID {}: 'data' section is missing or invalid in the JSON.", company.getId()); + continue; } + + if (dataMap.containsKey("pec")) { + Object pecEmailObj = dataMap.get("pec"); + if (pecEmailObj instanceof String pec && !pec.isEmpty()) { + company.setPec(pec); // Only set if valid string + companyEntityList.add(company); + } else { + log.warn("Company ID {}: 'pec' is missing, empty, or not a string.", company.getId()); + continue; + } + } + + if (!dataMap.containsKey("dettaglio")) { log.warn("Company ID {}: 'dettaglio' not present inside 'data'. Skipping codiceAteco update.", company.getId()); - return; + continue; } + Object dettaglioObj = dataMap.get("dettaglio"); if (!(dettaglioObj instanceof Map dettaglio)) { log.warn("Company ID {}: 'dettaglio' is not a valid object.", company.getId()); - return; + continue; } - Object pecEmailObj = dettaglio.get("pec"); if (pecEmailObj instanceof String pec && !pec.isEmpty()) { - company.setPec(pec); // Only set if valid string + if(pec!=null) { + company.setPec(pec); // Only set if valid string + companyEntityList.add(company); + } } else { log.warn("Company ID {}: 'pec' is missing, empty, or not a string.", company.getId()); + continue; } } } + companyRepository.saveAll(companyEntityList); } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java index e2208c77..8e783c70 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java @@ -73,4 +73,7 @@ public class ApplicationEntity extends BaseEntity { @Column(name = "APPLICATION_EVALUATION_ID") private Long applicationEvaluationId; + @Column(name = "PEC_EMAIL") + private String pecEmail; + } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/entities/NdganagEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/NdganagEntity.java new file mode 100644 index 00000000..463f31c9 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/NdganagEntity.java @@ -0,0 +1,33 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.Data; +import org.hibernate.annotations.Where; + +@Entity +@Table(name = "NDGANAG") +@Data +@Where(clause = "is_deleted = false") +public class NdganagEntity extends BaseEntity{ + + @Column(name = "NDG") + private String ndg; + + @Column(name = "COMPANY_NAME") + private String companyName; + + @Column(name = "VAT_NUMBER") + private String vatNumber; + + @Column(name = "CODICE_FISCALE") + private String codiceFiscale; + + @Column(name = "JSON") + private String json; + + @Column(name = "IS_DELETED") + private Boolean isDeleted; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index fe2e4cd1..1de6b333 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -67,6 +67,7 @@ public enum UserActionContextEnum { GET_COMPANY_BY_USER("GET_COMPANY_BY_USER"), REMOVE_COMPANY_FROM_USER("REMOVE_COMPANY_FROM_USER"), UPDATE_COMPANY_JSON("UPDATE_COMPANY_JSON"), + EXTRACT_PEC_FROM_COMPANY("EXTRACT_PEC_FROM_COMPANY"), /** LookUpData action context **/ CREATE_LOOKUP_DATA("CREATE_LOOKUP_DATA"), @@ -180,6 +181,7 @@ public enum UserActionContextEnum { CHECK_OR_CREATE_NDG_CODE("CHECK_OR_CREATE_NDG_CODE"), CREATE_APPOINTMENT("CREATE_APPOINTMENT"), UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM("UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM"), + GET_NDG_BY_VAT_NUMBER("GET_NDG_BY_VAT_NUMBER"), GET_ALL_NOTIFICATION_BY_PAGINATION("GET_ALL_NOTIFICATION_BY_PAGINATION"), GET_ALL_CALL_BY_PAGINATION("GET_ALL_CALL_BY_PAGINATION"), diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java index 350b9b49..39d261ea 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java @@ -31,5 +31,7 @@ public interface CompanyRepository extends JpaRepository { """) Page findCompaniesWithMissingVatCheck(Pageable pageable); + List findByJsonIsNotNullAndPecIsNull(); + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/NdganagRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/NdganagRepository.java new file mode 100644 index 00000000..ad0fe99a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/NdganagRepository.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.NdganagEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + + +@Repository +public interface NdganagRepository extends JpaRepository { + + NdganagEntity findByVatNumber(String vatNumber); + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/AppointmentService.java b/src/main/java/net/gepafin/tendermanagement/service/AppointmentService.java index 842901a4..e324804c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AppointmentService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AppointmentService.java @@ -13,4 +13,7 @@ public interface AppointmentService { AppointmentCreationResponse createAppointmentForApplication(HttpServletRequest request, Long applicationId, CreateAppointmentRequest createAppointmentRequest); DocumentUploadResponse uploadDocToExternalSystem(HttpServletRequest request, Long documentId, UploadDocToExternalSystemRequest docToExternalSystemRequest); + + NdgResponse getNdgByVatNumber(HttpServletRequest request,String vatNumber); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java b/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java index 74b6be0e..4c868f1e 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java @@ -47,4 +47,5 @@ public interface CompanyService { void updateMissingVatCheckResponses(HttpServletRequest request, LimitRequest limitRequest); + void extractPecFromJson(HttpServletRequest request); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AppointmentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AppointmentServiceImpl.java index 2e7960df..6c49b214 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AppointmentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AppointmentServiceImpl.java @@ -2,12 +2,14 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.AppointmentDao; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.CreateAppointmentRequest; import net.gepafin.tendermanagement.model.request.UploadDocToExternalSystemRequest; import net.gepafin.tendermanagement.model.response.AppointmentCreationResponse; import net.gepafin.tendermanagement.model.response.DocumentUploadResponse; import net.gepafin.tendermanagement.model.response.NdgResponse; import net.gepafin.tendermanagement.service.AppointmentService; +import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -17,6 +19,9 @@ public class AppointmentServiceImpl implements AppointmentService { @Autowired private AppointmentDao appointmentDao; + @Autowired + private Validator validator; + @Override public NdgResponse checkNdgForAppointment(HttpServletRequest request, Long applicationId) { @@ -34,4 +39,11 @@ public class AppointmentServiceImpl implements AppointmentService { return appointmentDao.uploadDocumentToExternalSystem(documentId, docToExternalSystemRequest); } + + @Override + public NdgResponse getNdgByVatNumber(HttpServletRequest request,String vatNumber) { + UserEntity userEntity = validator.validateUser(request); + NdgResponse ndgResponse= appointmentDao.getNdgByVatNumber(vatNumber,userEntity); + return ndgResponse; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java index f1d8f890..f9a8b8c8 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java @@ -140,6 +140,12 @@ public class CompanyServiceImpl implements CompanyService { @Override public void updateMissingVatCheckResponses(HttpServletRequest request, LimitRequest limitRequest) { UserEntity userEntity =validator.validateUser(request); - companyDao.updateMissingVatCheckResponses(request, limitRequest); + companyDao.updateMissingVatCheckResponses(request,limitRequest); + } + + @Override + public void extractPecFromJson(HttpServletRequest request) { + UserEntity userEntity =validator.validateUser(request); + companyDao.getCompanyEntity(); } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/AppointmentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AppointmentApi.java index 5507492a..64f767b9 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/AppointmentApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AppointmentApi.java @@ -56,4 +56,15 @@ public interface AppointmentApi { ResponseEntity> uploadDocumentToExternalSystem(HttpServletRequest request, @Parameter(description = "The document id", required = true) @PathVariable(value = "documentId", required = true) Long documentId, @RequestBody UploadDocToExternalSystemRequest docToExternalSystemRequest); + + @Operation(summary = "API to get ndg by vatNumber", responses = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/vatNumber/{vatNumber}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> getNdgByVatNumber(HttpServletRequest request,@PathVariable(value = "vatNumber", required = true) @Parameter(description = "vatNumber",required = true)String vatNumber); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java index fea29d0d..a30e18be 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java @@ -169,4 +169,17 @@ public interface CompanyApi { @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') ") ResponseEntity> updateMissingVatCheckResponses(HttpServletRequest request, @Parameter(description = "Limit request object ", required = true) @RequestBody LimitRequest limitRequest); + + @Operation(summary = "Api to extract pec from the company json", responses = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @GetMapping(value = "/pec", produces = { "application/json" }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN') ") + ResponseEntity> extractPecFromJson(HttpServletRequest request); + + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java index 1708b8cd..7212355a 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AppointmentController.java @@ -17,6 +17,7 @@ import net.gepafin.tendermanagement.service.AppointmentService; import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.web.rest.api.AppointmentApi; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.opensaml.xmlsec.signature.G; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -81,4 +82,19 @@ public class AppointmentController implements AppointmentApi { .body(new Response<>(documentUploadResponse, Status.SUCCESS, Translator.toLocale(message))); } + + @Override + public ResponseEntity> getNdgByVatNumber(HttpServletRequest request,String vatNumber) { + loggingUtil.logUserAction( + UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPLOAD).actionContext(UserActionContextEnum.GET_NDG_BY_VAT_NUMBER).build()); + + NdgResponse ndgResponse= appointmentService.getNdgByVatNumber(request,vatNumber); + if(ndgResponse==null){ + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(ndgResponse, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.NDG_NOT_FOUND))); + } + + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(ndgResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.NDG_FETCH_SUCCESSFULLY))); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java index 64dee16b..08d34ccf 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java @@ -201,4 +201,17 @@ public class CompanyApiController implements CompanyApi{ return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_UPDATED_SUCCESS_MSG))); } + + @Override + public ResponseEntity> extractPecFromJson(HttpServletRequest request) { + + log.info("Api to set pec from json field"); + + companyService.extractPecFromJson(request); + + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.EXTRACT_PEC_FROM_COMPANY).build()); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_UPDATED_SUCCESS_MSG))); + } } 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 f69ef624..36f52dee 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 @@ -2955,4 +2955,24 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index e69af662..8d9aae03 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -408,3 +408,5 @@ resend.email.sent.failed.msg = Failed to resend the email. application.readmit.success=Application has been readmitted successfully. no.email.log.msg = No failed emails found for given userActionId. user.action.id.not.found = User Action id not found. +ndg.not.found=NDG not found. +email.pec.cannot.null=Email pec is required. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index ef23cfac..5a94ede6 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -399,3 +399,5 @@ resend.email.sent.failed.msg = Impossibile inviare nuovamente l'e-mail. application.readmit.success=L'applicazione รจ stata riammessa con successo. no.email.log.msg = Nessuna email trovata per userActionId specificato. user.action.id.not.found = ID azione utente non trovato. +ndg.not.found=NDG non trovato. +email.pec.cannot.null=L'indirizzo email pec ่ obbligatorio.