diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 577d5dd4..3874fc83 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -549,7 +549,31 @@ public class GepafinConstant { public static final String CAUSE_STRING = "cause" ; public static final String ERROR_DESCRIPTION_STRING = "errorDescription" ; public static final String ERROR_STRING = "errors"; + public static final String PROTOCOL_SERVICE_URL="http://65.108.55.96:8080"; + public static final String PROTOCOL_SERVICE_BEARER_TOKEN="/auth/login"; + public static final String PROTOCOL_SERVICE_CREATE_PROTOCOL="/documenti/protocollaUD"; + public static final String PROTOCOL_CALL_NAME="BANDO"; + public static final String PROTOCOL_DOC_URL="DOC_URL"; + public static final String PROTOCOL_COMPANY_NAME_VAT_NUMBER="OGGETTO_PG"; + public static final String PROTOCOL_DOC_HASH="URL_CONTENT_HASH"; + public static final String PROTOCOL_TIPO_PROTOCOLLAZIONE="TIPO_PROTOCOLLAZIONE"; + public static final String PROTOCOL_TIPO_CORRISPONDENTE_COMPANY="tipoCorrispondente"; + public static final String PROTOCOL_COMPANY_NAME="denominazione"; + public static final String PROTOCOL_MEZZO="mezzo"; + public static final String PROTOCOL_INDIRIZZO_PEC="indirizzoPec"; + public static final String PROTOCOL_COMPANY_VAT_NUMBER="identificativo"; + public static final String PROTOCOL_CODICE_UO="codiceUo"; + public static final String PROTOCOL_COMPETENTE="competente"; + public static final String PROTOCOL_TIPO_CORRISPONDENTE="tipoCorrispondente"; + public static final String PROTOCOL_MITTENTE="mittente"; + public static final String PROTOCOL_DESTINATARI="destinatari"; + public static final String PROTOCOL_EXTERNAL_YEAR="ANNO_PG"; + public static final String PROTOCOL_EXTERNAL_NUMBER="NUM_PG"; + 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/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index f6e87839..2882dc7f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -378,6 +378,7 @@ public class ApplicationAmendmentRequestDao { ProtocolEntity protocolEntity = protocolDao.createProtocolEntity( applicationEvaluationEntity.getAssignedApplicationsEntity().getApplication(), protocolNumber, userEntity.getHub().getId(),false); + protocolDao.saveProtocolEntity(protocolEntity); applicationAmendmentRequestEntity.setProtocol(protocolEntity); ApplicationAmendmentRequestEntity applicationAmendment = saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity, null, VersionActionTypeEnum.INSERT); log.info("Amendment request saved with ID={}", applicationAmendment.getId()); @@ -1106,7 +1107,10 @@ public class ApplicationAmendmentRequestDao { application.setStatus(ApplicationStatusTypeEnum.EVALUATION.getValue()); applicationRepository.save(application); - log.info("Updated Application status to EVALUATION for Application ID: {}", application.getId()); + log.info("Updated Application status to EVALUATION for Application ID: {}", application.getId()); + + existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity().setStatus(AssignedApplicationEnum.OPEN.getValue()); + AssignedApplicationsEntity assignedApplicationsEntity = assignedApplicationsDao.validateAssignedApplication( existingApplicationAmendment.getApplicationEvaluationEntity().getAssignedApplicationsEntity().getId()); @@ -1140,6 +1144,7 @@ public class ApplicationAmendmentRequestDao { } public ApplicationAmendmentRequestResponse extendResponseDays(Long id, Long newResponseDays) { + log.info("Extending response days for Application Amendment ID: {}, Additional Days: {}", id, newResponseDays); ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validatApplicationAmendmentRequestByStatus(id,ApplicationAmendmentRequestEnum.EXPIRED.getValue()); log.info("Extending response days for Application Amendment ID: {}, Additional Days: {}", id, newResponseDays); @@ -1208,9 +1213,7 @@ public class ApplicationAmendmentRequestDao { } public EmailReminderResponse sendReminderEmail(Long amendmentId) { - - log.info("Initiating reminder email process for Amendment ID: {}", amendmentId); - + log.info("Initiating reminder email process for Amendment ID: {}", amendmentId); ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(amendmentId) .orElseThrow(() -> { log.error("Amendment not found with ID: {}", amendmentId); return new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG)); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 108b49da..198a4ede 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.dao; +import com.amazonaws.services.dynamodbv2.xspec.S; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -16,6 +17,11 @@ import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.model.request.*; +import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; +import net.gepafin.tendermanagement.model.request.ApplicationRequest; +import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; +import net.gepafin.tendermanagement.model.request.EmailLogRequest; +import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.SortBy; import net.gepafin.tendermanagement.repositories.*; @@ -136,6 +142,9 @@ public class ApplicationDao { @Value("${call.id}") private String callId; + @Value("${sviluppumbriaUuid}") + private String sviluppumbriaUuid; + @Autowired private AmazonS3Service amazonS3Service; @@ -548,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; @@ -978,7 +1031,7 @@ public class ApplicationDao { log.info("Call end date verified successfully | callId: {}", applicationEntity.getCall().getId()); //cloned entity for old application data ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(applicationEntity); - + HubEntity hub=hubService.valdateHub(applicationEntity.getHubId()); UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); validator.validateUserWithCompany(request, applicationEntity.getCompanyId()); if (ApplicationStatusTypeEnum.SUBMIT.getValue().equals(applicationEntity.getStatus())) { @@ -998,11 +1051,17 @@ public class ApplicationDao { } if (status.equals(ApplicationStatusTypeEnum.SUBMIT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.READY.getValue()))) { + CompanyEntity company=companyService.validateCompany(applicationEntity.getCompanyId()); + // callService.validatePublishedCall(applicationEntity.getCall().getId(), userEntity.getHub().getId()); checkCallEndDate(applicationEntity.getCall()); Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub()); ProtocolEntity protocolEntity = protocolDao.createProtocolEntity(applicationEntity, protocolNumber, userEntity.getHub().getId(),true); + protocolDao.saveProtocolEntity(protocolEntity); applicationEntity.setProtocol(protocolEntity); + if(Boolean.TRUE.equals(hub.getUniqueUuid().equals(sviluppumbriaUuid))) { + protocolEntity = protocolDao.createExternalProtocol(applicationEntity, company, protocolEntity); + } applicationEntity.setStatus(ApplicationStatusTypeEnum.SUBMIT.getValue()); applicationEntity.setSubmissionDate(protocolEntity.getCreatedDate()); applicationEntity = applicationRepository.save(applicationEntity); @@ -1013,7 +1072,7 @@ public class ApplicationDao { loggingUtil.addVersionHistory( VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEntity).newData(applicationEntity).build()); - sendMailToUserAndCompany(userEntity, applicationEntity); + sendMailToUserAndCompany(userEntity, applicationEntity,company); sendMailTodefaultSystemAndGepafin(userEntity, applicationEntity); applicationEntity.setStatus(status.getValue()); log.info("Status updated to SUBMIT for applicationId: " + applicationId); @@ -1126,10 +1185,9 @@ public class ApplicationDao { } } - private void sendMailToUserAndCompany(UserEntity userEntity, ApplicationEntity applicationEntity) { + private void sendMailToUserAndCompany(UserEntity userEntity, ApplicationEntity applicationEntity,CompanyEntity company) { log.info("Preparing to send submission email | applicationId: {}, userId: {}", applicationEntity.getId(), userEntity.getId()); CallEntity call =applicationEntity.getCall(); - CompanyEntity company=companyService.validateCompany(applicationEntity.getCompanyId()); UserWithCompanyEntity userWithCompany=companyService.getUserWithCompany(userEntity.getId(),company.getId()); ProtocolEntity protocol= applicationEntity.getProtocol(); HubEntity hub = hubService.valdateHub(applicationEntity.getHubId()); @@ -1145,8 +1203,16 @@ public class ApplicationDao { // Create the map for body placeholders Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", call.getName()); - bodyPlaceholders.put("{{protocol_number}}", protocol.getProtocolNumber().toString()); - bodyPlaceholders.put("{{date}}", DateTimeUtil.formatLocalDateTime(protocol.getCreatedDate(), GepafinConstant.DD_MM_YYYY)); + String protocolNumber=applicationEntity.getProtocol().getExternalProtocolNumber(); + if(protocolNumber==null){ + protocolNumber= String.valueOf(applicationEntity.getProtocol().getProtocolNumber()); + } + bodyPlaceholders.put("{{protocol_number}}",protocolNumber); + String protocolDate= DateTimeUtil.formatLocalDateTime(protocol.getCreatedDate(), GepafinConstant.DD_MM_YYYY); + if(protocol.getExternalProtocolDate()!=null){ + protocolDate= DateTimeUtil.formatLocalDateTime(protocol.getExternalProtocolDate(), GepafinConstant.DD_MM_YYYY); + } + bodyPlaceholders.put("{{date}}", protocolDate); bodyPlaceholders.put("{{time}}", DateTimeUtil.parseLocalTimeToString(protocol.getTime(), GepafinConstant.HH_MM_SS)); // Replace placeholders in the subject and body @@ -1156,26 +1222,39 @@ public class ApplicationDao { String email = userEntity.getEmail(); if (userEntity.getBeneficiary() != null) { emailLogRequest.setRecipientType(RecipientTypeEnum.BENEFICIARY); - email = userEntity.getBeneficiary().getEmail(); - emailLogRequest.setRecipientId(userEntity.getBeneficiary().getId()); + + if(Boolean.TRUE.equals(hub.getUniqueUuid().equals(defaultHubUuid))){ + email=applicationEntity.getPecEmail(); + }else { + email = userEntity.getBeneficiary().getEmail(); + } + emailLogRequest.setRecipientId(userEntity.getBeneficiary().getId()); } emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email),emailLogRequest); List recipientEmails = new ArrayList<>(); // recipientEmails.add(email); String companyEmail = userWithCompany.getEmail(); String contactEmail = userWithCompany.getContactEmail(); + if(Boolean.TRUE.equals(hub.getUniqueUuid().equals(defaultHubUuid))){ + if (company.getPec()!=null) { + recipientEmails.add(company.getPec()); + }else { + recipientEmails.add(userWithCompany.getPec()); + } + } + else { + if (companyEmail != null && !companyEmail.isEmpty()) { + recipientEmails.add(companyEmail); + } - if (companyEmail != null && !companyEmail.isEmpty()) { - recipientEmails.add(companyEmail); - } - - if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { - recipientEmails.add(contactEmail); - } + if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { + recipientEmails.add(contactEmail); + } + } if(Boolean.FALSE.equals(recipientEmails.isEmpty())){ emailLogRequest.setRecipientId(applicationEntity.getCompanyId()); emailLogRequest.setRecipientType(RecipientTypeEnum.COMPANY); - emailLogRequest.setRecipientEmails(companyEmail); + emailLogRequest.setRecipientEmails(String.valueOf(recipientEmails)); } emailNotificationDao.sendMail(hub.getId(), subject, body, recipientEmails,emailLogRequest); } @@ -1196,8 +1275,17 @@ public class ApplicationDao { // Create the map for body placeholders Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", call.getName()); - bodyPlaceholders.put("{{protocol_number}}", protocol.getProtocolNumber().toString()); - bodyPlaceholders.put("{{date}}", DateTimeUtil.formatLocalDateTime(protocol.getCreatedDate(), GepafinConstant.DD_MM_YYYY)); + String protocolNumber=applicationEntity.getProtocol().getExternalProtocolNumber(); + + if(protocolNumber==null){ + protocolNumber= String.valueOf(applicationEntity.getProtocol().getProtocolNumber()); + } + String protocolDate= DateTimeUtil.formatLocalDateTime(protocol.getCreatedDate(), GepafinConstant.DD_MM_YYYY); + if(protocol.getExternalProtocolDate()!=null){ + protocolDate= DateTimeUtil.formatLocalDateTime(protocol.getExternalProtocolDate(), GepafinConstant.DD_MM_YYYY); + } + bodyPlaceholders.put("{{protocol_number}}", protocolNumber); + bodyPlaceholders.put("{{date}}",protocolDate); bodyPlaceholders.put("{{time}}", DateTimeUtil.parseLocalTimeToString(protocol.getTime(), GepafinConstant.HH_MM_SS)); // Replace placeholders in the subject and body @@ -1234,6 +1322,12 @@ public class ApplicationDao { log.info("Existing active signed document found and will be deleted | applicationId: {}, fileName: {}", applicationId, applicationSignedDocument.getFileName()); deleteSignedDocumentFromS3(applicationSignedDocument); } + String hash =""; + try { + hash = FileHashUtil.calculateSHA256(file.getInputStream()); + } catch (IOException e) { + throw new RuntimeException(e); + } UploadFileOnAmazonS3Response uploadFileOnAmazonS3 = uploadFileOnAmazonS3ForUserSignedDocument(file, applicationEntity.getCall().getId(), applicationId); log.info("File uploaded to S3 successfully | applicationId: {}", applicationId); applicationSignedDocument = new ApplicationSignedDocumentEntity(); @@ -1241,6 +1335,7 @@ public class ApplicationDao { applicationSignedDocument.setFileName(uploadFileOnAmazonS3.getFileName()); applicationSignedDocument.setFilePath(uploadFileOnAmazonS3.getFilePath()); applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); + applicationSignedDocument.setFileHash(hash); applicationSignedDocument = applicationSignedDocumentRepository.save(applicationSignedDocument); /** This code is responsible for adding a version history log for the "assign application document" operation. **/ @@ -1316,6 +1411,7 @@ public class ApplicationDao { .setStatus(ApplicationSignedDocumentStatusEnum.valueOf(applicationSignedDocument.getStatus())); applicationSignedDocumentResponse.setCreatedDate(applicationSignedDocument.getCreatedDate()); applicationSignedDocumentResponse.setUpdatedDate(applicationSignedDocument.getUpdatedDate()); + applicationSignedDocumentResponse.setFileHash(applicationSignedDocument.getFileHash()); return applicationSignedDocumentResponse; } @@ -2307,7 +2403,11 @@ public class ApplicationDao { bodyPlaceholders.put("{{call_name}}", call.getName()); bodyPlaceholders.put("{{application_id}}", applicationEntity.getId().toString()); bodyPlaceholders.put("{{company_name}}", company.getCompanyName()); - bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); + String protocolNumber=applicationEntity.getProtocol().getExternalProtocolNumber(); + if(protocolNumber==null){ + protocolNumber= String.valueOf(applicationEntity.getProtocol().getProtocolNumber()); + } + bodyPlaceholders.put("{{protocol_number}}", protocolNumber); bodyPlaceholders.put("{{user_action_id}}",emailLogRequest.getUserActionId().toString()); String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 57f54964..3cb7237a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -710,7 +710,11 @@ public class ApplicationEvaluationDao { Map placeHolders = new HashMap<>(); placeHolders.put("{{call_name}}", application.getCall().getName()); - placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber())); + String protocolNumber=application.getProtocol().getExternalProtocolNumber(); + if(protocolNumber==null){ + protocolNumber= String.valueOf(application.getProtocol().getProtocolNumber()); + } + placeHolders.put("{{protocol_number}}", protocolNumber); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_CREATION); notificationDao.sendNotificationToInstructor(placeHolders,entity,NotificationTypeEnum.EVALUATION_CREATION); @@ -1997,7 +2001,11 @@ public class ApplicationEvaluationDao { Map placeHolders = new HashMap<>(); placeHolders.put("{{call_name}}", application.getCall().getName()); - placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber())); + String protocolNumber=application.getProtocol().getExternalProtocolNumber(); + if(protocolNumber==null){ + protocolNumber= String.valueOf(application.getProtocol().getProtocolNumber()); + } + placeHolders.put("{{protocol_number}}", protocolNumber); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_RESULT); notificationDao.sendNotificationToInstructor(placeHolders,existingEntity,NotificationTypeEnum.EVALUATION_RESULT); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AppointmentDao.java index 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 9cf2e0e2..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; @@ -52,13 +53,13 @@ public class CompanyDao { private ApplicationRepository applicationRepository; @Autowired private FaqRepository faqRepository; - + @Autowired private BeneficiaryPreferredCallRepository beneficiaryPreferredCallRepository; @Autowired private UserCompanyDelegationRepository userCompanyDelegationRepository; - + @Autowired private CompanyService companyService; @@ -105,7 +106,7 @@ public class CompanyDao { private void validateCompany(UserEntity userEntity, CompanyRequest companyRequest) { - + if (Boolean.FALSE.equals(StringUtils.isEmpty(companyRequest.getEmail())) && Boolean.FALSE.equals(Utils.isValidEmail(companyRequest.getEmail()))) { throw new CustomValidationException(Status.VALIDATION_ERROR, @@ -173,7 +174,7 @@ public class CompanyDao { entity.setHub(userEntity.getHub()); entity.setJson(Utils.convertMapIntoJsonString(request.getVatCheckResponse())); updateCodiceAtecoFieldWithNewJson(entity); - + return entity; } @@ -413,7 +414,7 @@ public class CompanyDao { Translator.toLocale(GepafinConstant.INVALID_LIMIT)); } - int successfulUpdates = 0; + int successfulUpdates = 0; int failedUpdates = 0; int invalidVatNumbers = 0; @@ -498,12 +499,19 @@ public class CompanyDao { return; } + + Object pecEmailObj = dettaglio.get("pec"); + if (pecEmailObj instanceof String pec && !pec.isEmpty()) { + company.setPec(pec); // Only set if valid string + } else { + log.warn("Company ID {}: 'pec' is missing, empty, or not a string.", company.getId()); + } + Object codiceAtecoObj = dettaglio.get("codice_ateco"); if (!(codiceAtecoObj instanceof String codiceAteco) || codiceAteco.isEmpty()) { log.warn("Company ID {}: 'codice_ateco' is missing, empty, or not a string.", company.getId()); return; } - company.setCodiceAteco(codiceAteco); logCodiceAtecoUpdate(company, codiceAteco); } @@ -524,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; } @@ -532,6 +544,13 @@ public class CompanyDao { // if data is a single object updateCodiceAtecoField(company); } else { + + Object pecEmail = dataMap.get("pec"); + if (pecEmail == null) { + log.warn("Company ID {}: 'pec' section is missing or invalid.", company.getId()); + } + company.setPec((String) pecEmail); + // Extract 'atecoClassification' section Map atecoClassificationMap = Utils.extractMap(dataMap, "atecoClassification"); if (atecoClassificationMap == null) { @@ -561,4 +580,81 @@ public class CompanyDao { log.info("Company ID {}: codiceAteco updated to {}", company.getId(), atecoCode); } + + public void getCompanyEntity() { + List companyEntities=companyRepository.findByJsonIsNotNullAndPecIsNull(); + List companyEntityList=new ArrayList<>(); + for (CompanyEntity company:companyEntities){ + 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."); + continue; + } + Map vatCheckResponse = Utils.convertJsonStringToMap(company.getJson()); + + if (vatCheckResponse == null) { + log.warn("Company ID {}: Invalid JSON response.", company.getId()); + continue; + } + Map companyDataMap = Utils.convertJsonStringToMap(company.getJson()); + if (companyDataMap == null) { + log.warn("Company ID {}: Failed to parse JSON data.", company.getId()); + continue; + } + + + Object dataObj = vatCheckResponse.get("data"); + 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()); + continue; + } + + + Object dettaglioObj = dataMap.get("dettaglio"); + if (!(dettaglioObj instanceof Map dettaglio)) { + log.warn("Company ID {}: 'dettaglio' is not a valid object.", company.getId()); + continue; + } + Object pecEmailObj = dettaglio.get("pec"); + if (pecEmailObj instanceof String pec && !pec.isEmpty()) { + 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/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 3772ad71..59d6193f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -67,6 +67,9 @@ public class EmailNotificationDao { @Autowired private ApplicationEvaluationRepository applicationEvaluationRepository; + @Value("${default.hub.uuid}") + private String defaultHubUuid; + @Value("${rinaldo_email}") private String rinaldoEmail; @@ -109,20 +112,37 @@ public class EmailNotificationDao { UserWithCompanyEntity userWithCompany=companyService.getUserWithCompany(userEntity.getId(),company.getId()); String companyEmail = userWithCompany.getEmail(); String contactEmail = userWithCompany.getContactEmail(); - - if (companyEmail != null && !companyEmail.isEmpty()) { - EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.COMPANY,company.getId() , - companyEmail, userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId()); - sendMail(applicationEntity.getHubId(), subject, body, List.of(companyEmail), emailLogRequest); - } - if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { - EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.COMPANY,company.getId(), - contactEmail, userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId()); - sendMail(applicationEntity.getHubId(), subject, body, List.of(contactEmail), emailLogRequest); - } + if (Boolean.TRUE.equals(userEntity.getHub().getUniqueUuid().equals(defaultHubUuid))){ + List recipientEmails=new ArrayList<>(); + if (company.getPec()!=null) { + recipientEmails.add(company.getPec()); + }else { + recipientEmails.add(userWithCompany.getPec()); + } + EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.COMPANY,company.getId() , + String.valueOf(recipientEmails), userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId()); + sendMail(applicationEntity.getHubId(), subject, body, recipientEmails, emailLogRequest); + } + else { + if (companyEmail != null && !companyEmail.isEmpty()) { + EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.COMPANY, company.getId(), + companyEmail, userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId()); + sendMail(applicationEntity.getHubId(), subject, body, List.of(companyEmail), emailLogRequest); + } + if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { + EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.COMPANY, company.getId(), + contactEmail, userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId()); + sendMail(applicationEntity.getHubId(), subject, body, List.of(contactEmail), emailLogRequest); + } + } if (userEntity.getBeneficiary().getEmail() != null) { - String beneficiaryEmail = userEntity.getBeneficiary().getEmail(); + String beneficiaryEmail = null; + if (Boolean.TRUE.equals(userEntity.getHub().getUniqueUuid().equals(defaultHubUuid))){ + beneficiaryEmail=applicationEntity.getPecEmail(); + }else { + beneficiaryEmail=userEntity.getBeneficiary().getEmail(); + } EmailLogRequest emailLogRequest = emailLogDao.createEmailLogRequest(systemEmailTemplateResponse.getEmailScenario(), RecipientTypeEnum.BENEFICIARY,userEntity.getBeneficiary().getId() , beneficiaryEmail, userEntity.getId(), applicationEntity.getId(), amendmentId, applicationEntity.getCall().getId()); sendMail(applicationEntity.getHubId(), subject, body, List.of(beneficiaryEmail), emailLogRequest); @@ -174,8 +194,16 @@ public class EmailNotificationDao { public Map prepareEmailPlaceholders(ApplicationEntity applicationEntity, ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity){ Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); - bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY)); + String protocolNumber=applicationEntity.getProtocol().getExternalProtocolNumber(); + if(protocolNumber==null){ + protocolNumber= String.valueOf(applicationEntity.getProtocol().getProtocolNumber()); + } + bodyPlaceholders.put("{{protocol_number}}", protocolNumber); + String protocolDate= DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY); + if(applicationEntity.getProtocol().getExternalProtocolDate()!=null){ + protocolDate= DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getExternalProtocolDate(), GepafinConstant.DD_MM_YYYY); + } + bodyPlaceholders.put("{{protocol_date}}", protocolDate); bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); bodyPlaceholders.put("{{response_days}}", applicationAmendmentRequestEntity.getResponseDays().toString()); @@ -259,8 +287,16 @@ public class EmailNotificationDao { public void sendAdmissibilityNotificationEmailForAdmissibleApplication(ApplicationEntity applicationEntity) { Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); - bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); + String protocolNumber=applicationEntity.getProtocol().getExternalProtocolNumber(); + if(protocolNumber==null){ + protocolNumber= String.valueOf(applicationEntity.getProtocol().getProtocolNumber()); + } + bodyPlaceholders.put("{{protocol_number}}", protocolNumber); + String protocolDate= DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY); + if(applicationEntity.getProtocol().getExternalProtocolDate()!=null){ + protocolDate= DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getExternalProtocolDate(), GepafinConstant.DD_MM_YYYY); + } + bodyPlaceholders.put("{{protocol_date}}", protocolDate); bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, bodyPlaceholders, null,null); @@ -269,8 +305,16 @@ public class EmailNotificationDao { public void sendInadmissibilityEmailForRejectedApplication(ApplicationEntity applicationEntity,ApplicationEvaluationEntity applicationEvaluationEntity) { Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); - bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); + String protocolNumber=applicationEntity.getProtocol().getExternalProtocolNumber(); + if(protocolNumber==null){ + protocolNumber= String.valueOf(applicationEntity.getProtocol().getProtocolNumber()); + } + bodyPlaceholders.put("{{protocol_number}}", protocolNumber); + String protocolDate= DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY); + if(applicationEntity.getProtocol().getExternalProtocolDate()!=null){ + protocolDate= DateTimeUtil.formatLocalDateTime(applicationEntity.getProtocol().getExternalProtocolDate(), GepafinConstant.DD_MM_YYYY); + } + bodyPlaceholders.put("{{protocol_date}}", protocolDate); bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); bodyPlaceholders.put("{{form_text}}", applicationEvaluationEntity.getMotivation()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java index 17b86d6e..55ec6665 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java @@ -174,7 +174,11 @@ public class NotificationDao { Map placeHolders = new HashMap<>(); placeHolders.put("{{call_name}}", application.getCall().getName()); - placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber())); + String protocolNumber=application.getProtocol().getExternalProtocolNumber(); + if(protocolNumber==null){ + protocolNumber= String.valueOf(application.getProtocol().getProtocolNumber()); + } + placeHolders.put("{{protocol_number}}", protocolNumber); NotificationReq notificationReq = createNotificationReq(notificationTypeEnum.getValue(), placeHolders, application.getUserId(), application.getUserWithCompany(), listOf(application.getCompanyId())); sendNotification(notificationReq); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java index b70bc588..d198c599 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ProtocolDao.java @@ -1,20 +1,36 @@ package net.gepafin.tendermanagement.dao; +import java.net.URI; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import feign.FeignException; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.enums.ApplicationSignedDocumentStatusEnum; import net.gepafin.tendermanagement.enums.ProtocolTypeEnum; import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; +import net.gepafin.tendermanagement.repositories.ApplicationSignedDocumentRepository; +import net.gepafin.tendermanagement.service.feignClient.ProtocolService; import net.gepafin.tendermanagement.util.LoggingUtil; +import net.gepafin.tendermanagement.util.Utils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; -import net.gepafin.tendermanagement.entities.ApplicationEntity; -import net.gepafin.tendermanagement.entities.HubEntity; -import net.gepafin.tendermanagement.entities.ProtocolEntity; import net.gepafin.tendermanagement.repositories.ProtocolRepository; import net.gepafin.tendermanagement.util.DateTimeUtil; @@ -33,6 +49,53 @@ public class ProtocolDao { @Autowired private HttpServletRequest request; + + @Autowired + private ProtocolService protocolService; + + @Value("${codAoo}") + private String codAoo; + + @Value("${sviluppumbria.username}") + private String username; + + @Value("${password}") + private String password; + + @Value("${CLASSIFICA}") + private String classifica; + + @Value("${TIPO_PROTOCOLLAZIONE}") + private String TIPO_PROTOCOLLAZIONE; + + @Value("${tipoCorrispondenteCompany}") + private String tipoCorrispondenteCompany; + + @Value("${tipoCorrispondenteWithoutCompany}") + private String tipoCorrispondenteWithoutCompany; + + @Value("${mezzo}") + private String mezzo; + + @Value("${indirizzoPec}") + private String indirizzoPec; + + @Value("${codiceUo}") + private String codiceUo; + + @Value("${competente}") + private Boolean competente; + + @Value("${tipoCorrispondente}") + private String tipoCorrispondente; + + @Value("${isSviluppumbriaProtocolEnabled}") + private String isSviluppUmbriaProtocolEnabled; + + @Autowired + private ApplicationSignedDocumentRepository applicationSignedDocumentRepository; + + public final Logger log = LoggerFactory.getLogger(ProtocolDao.class); public Long getProtocolNumber(HubEntity hubEntity) { Long maxProtocolNumber = protocolRepository.findMaxProtocolNumberAndHubId(hubEntity.getId()); @@ -58,11 +121,164 @@ public class ProtocolDao { }else { protocolEntity.setType(ProtocolTypeEnum.OUTPUT.getValue()); } + + return protocolEntity; + } + + public void saveProtocolEntity(ProtocolEntity protocolEntity) { protocolRepository.save(protocolEntity); /** This code is responsible for adding a version history log for "create protocol" operation. **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.INSERT).oldData(null).newData(protocolEntity).build()); - - return protocolEntity; } + + public String getBearerToken(String codAoo, String username, String password) { + log.info("Requesting bearer token for user: {} and codAoo: {}", username, codAoo); + + HttpHeaders httpHeaders = Utils.getHeaders(); + URI url = URI.create(GepafinConstant.PROTOCOL_SERVICE_BEARER_TOKEN); + + try { + ResponseEntity response = protocolService.getBearerToken(httpHeaders, codAoo,username,password); + + if (response != null && response.getStatusCode().is2xxSuccessful()) { + log.debug("Bearer token successfully retrieved. HTTP Status: {}", response.getStatusCode()); + return response.getBody().toString(); // Use getBody() instead of toString() + } else { + log.warn("Bearer token request failed or returned unexpected status. Response: {}", response); + } + } catch (FeignException ex) { + log.error("FeignException while retrieving bearer token for user {}: {}", username, ex.getMessage(), ex); + Utils.callException(ex.status(), ex); + } catch (Exception ex) { + log.error("Unexpected exception while retrieving bearer token: {}", ex.getMessage(), ex); + } + + log.warn("Returning null bearer token for user: {}", username); + return null; + } + + public ProtocolEntity createExternalProtocol(ApplicationEntity application, CompanyEntity company, ProtocolEntity protocol) { + + if (Boolean.FALSE.equals(Boolean.parseBoolean(isSviluppUmbriaProtocolEnabled))) { + return protocol; + } + + log.info("Starting createExternalProtocol for application ID: {}", application.getId()); + + log.debug("Successfully retrieved bearer token"); + ApplicationSignedDocumentEntity applicationSignedDocumentEntity=applicationSignedDocumentRepository.findByApplicationIdAndStatus(application.getId(), ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); + + String year = String.valueOf(LocalDateTime.now().getYear()); + String applicationId = String.valueOf(application.getId()); + String mittenteValue=""; + String vatNumber =""; + if(company!=null) { + mittenteValue= tipoCorrispondenteCompany; + vatNumber=company.getVatNumber(); + }else { + mittenteValue = tipoCorrispondenteWithoutCompany; + vatNumber = company.getCodiceFiscale(); + } + String companyName = company.getCompanyName() + " " + vatNumber; + String callName = application.getCall().getName()+" "+ application.getCall().getId(); + String callId = GepafinConstant.PROTOCOL_CALL_NAME+ String.valueOf(application.getCall().getId()); + String pecEmail=company.getPec(); + String docUrl=applicationSignedDocumentEntity.getFilePath()+GepafinConstant.PROTOCOL_DOC_SUFFIX; + + + Map requestBody = new HashMap<>(); + requestBody.put(GepafinConstant.PROTOCOL_DOC_URL,docUrl); + requestBody.put(GepafinConstant.PROTOCOL_DOC_HASH,applicationSignedDocumentEntity.getFileHash()); + requestBody.put(GepafinConstant.PROTOCOL_TIPO_PROTOCOLLAZIONE,TIPO_PROTOCOLLAZIONE); + requestBody.put(GepafinConstant.PROTOCOL_COMPANY_NAME_VAT_NUMBER,company.getCompanyName()); + Map mittente = new HashMap<>(); + mittente.put(GepafinConstant.PROTOCOL_TIPO_CORRISPONDENTE, mittenteValue); + mittente.put(GepafinConstant.PROTOCOL_MEZZO,mezzo); + mittente.put(GepafinConstant.PROTOCOL_INDIRIZZO_PEC,pecEmail); + mittente.put(GepafinConstant.PROTOCOL_COMPANY_VAT_NUMBER,vatNumber); + mittente.put(GepafinConstant.PROTOCOL_COMPANY_NAME,company.getCompanyName()); + List> destinatariObject=new ArrayList<>(); + Map destinatari = new HashMap<>(); + destinatari.put(GepafinConstant.PROTOCOL_CODICE_UO,codiceUo); + destinatari.put(GepafinConstant.PROTOCOL_COMPETENTE,competente); + destinatari.put(GepafinConstant.PROTOCOL_TIPO_CORRISPONDENTE,tipoCorrispondente); + requestBody.put(GepafinConstant.PROTOCOL_MITTENTE,mittente); + destinatariObject.add(destinatari); + requestBody.put(GepafinConstant.PROTOCOL_DESTINATARI,destinatariObject); + List> listObject=new ArrayList<>(); + listObject.add(requestBody); + + log.info("Preparing to create protocol with data: year={}, applicationId={}, companyName={}, callName={}, callId={}", + year, applicationId, companyName, callName, callId); + ResponseEntity response=null; + try { + + String bearerToken = getBearerToken(codAoo, username, password); + if (bearerToken == null) { + log.error("Bearer token retrieval failed for user: {}", username); + return protocol; + } + HttpHeaders httpHeaders = Utils.getHeaders(); + httpHeaders.set(GepafinConstant.AUTHORIZATION, "Bearer " + bearerToken); + URI url = URI.create(GepafinConstant.PROTOCOL_SERVICE_CREATE_PROTOCOL); + + response = protocolService.createProtocol(httpHeaders, classifica, year, applicationId, companyName, callName, callId,listObject + ); + + log.info("Protocol creation response: status={}, body={}", response.getStatusCode(), response.getBody()); + + } catch (FeignException ex) { + log.error("FeignException during protocol creation for application ID {}: {}", applicationId, ex.getMessage(), ex); +// Utils.callException(ex.status(), ex); + } catch (Exception ex) { + log.error("Unexpected exception during protocol creation for application ID {}: {}", applicationId, ex.getMessage(), ex); + } + + log.info("Finished createExternalProtocol for application ID: {}", application.getId()); + if(response!=null && response.getBody()!=null) { + protocol = extractDetailForProtocol((List>) response.getBody(), protocol); + } + return protocol; + } + + public ProtocolEntity extractDetailForProtocol(List> responseObject, ProtocolEntity protocol) { + Map responseField= responseObject.get(0); + Object yearObj = responseField.get(GepafinConstant.PROTOCOL_EXTERNAL_YEAR); + Integer externalProtocolYear = null; + if (yearObj instanceof Integer) { + externalProtocolYear = (Integer) yearObj; + } else if (yearObj instanceof String) { + try { + externalProtocolYear = Integer.parseInt((String) yearObj); + } catch (NumberFormatException e) { + // handle invalid format gracefully + externalProtocolYear = null; + } + } + + Object dateObj = responseField.get(GepafinConstant.PROTOCOL_EXTERNAL_DATE); + LocalDateTime externalProtocolDate = null; + + if (dateObj instanceof LocalDateTime) { + externalProtocolDate = (LocalDateTime) dateObj; + } else if (dateObj instanceof String) { + externalProtocolDate = DateTimeUtil.parseStringToLocalDateTime((String) dateObj); + } + if(externalProtocolDate!=null){ + protocol.setExternalProtocolDate(externalProtocolDate); + } + if (externalProtocolYear!=null){ + protocol.setExternalProtocolYear(externalProtocolYear); + + } + + String externalProtocolNumber = (String) responseField.get(GepafinConstant.PROTOCOL_EXTERNAL_NUMBER); + if (Boolean.FALSE.equals(StringUtils.isEmpty(externalProtocolNumber))) { + protocol.setExternalProtocolNumber(externalProtocolNumber); + } + protocolRepository.save(protocol); + return protocol; + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java index eb71f5c1..c0112618 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Data; +import org.hibernate.annotations.Where; import net.gepafin.tendermanagement.model.response.EmailSendResponse; import java.time.LocalDateTime; @@ -10,6 +11,7 @@ import java.util.List; @Entity @Table(name="application_amendment_request") @Data +@Where(clause = "is_deleted = false") public class ApplicationAmendmentRequestEntity extends BaseEntity { @Column(name = "NOTE") @@ -33,9 +35,6 @@ public class ApplicationAmendmentRequestEntity extends BaseEntity { @Column(name = "FORM_FIELDS") private String formFields; - @Column(name="IS_DELETED") - private Boolean isDeleted=false; - @Column(name = "STATUS") private String status; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java index 50d16557..8e783c70 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.Where; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -9,6 +10,7 @@ import java.time.LocalDateTime; @Entity @Table(name = "APPLICATION") @Data +@Where(clause = "is_deleted = false") public class ApplicationEntity extends BaseEntity { @Column(name = "USER_ID") @@ -29,9 +31,6 @@ public class ApplicationEntity extends BaseEntity { @ManyToOne @JoinColumn(name = "CALL_ID", nullable = false) private CallEntity call; - - @Column(name="IS_DELETED") - private Boolean isDeleted; @OneToOne @JoinColumn(name = "PROTOCOL_NUMBER") @@ -74,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/ApplicationEvaluationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java index b8b00d3b..ae080d48 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Data; +import org.hibernate.annotations.Where; import net.gepafin.tendermanagement.model.response.EmailSendResponse; import java.time.LocalDateTime; @@ -10,6 +11,7 @@ import java.util.List; @Data @Entity @Table(name = "application_evaluation") +@Where(clause = "is_deleted = false") public class ApplicationEvaluationEntity extends BaseEntity{ @Column(name = "application_Id") @@ -39,9 +41,6 @@ public class ApplicationEvaluationEntity extends BaseEntity{ @Column(name = "MOTIVATION") private String motivation; - @Column(name="IS_DELETED") - private Boolean isDeleted; - @ManyToOne @JoinColumn(name = "assigned_applications_id", nullable = true) private AssignedApplicationsEntity assignedApplicationsEntity; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormEntity.java index 251fb262..78a881a0 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormEntity.java @@ -2,16 +2,15 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Data @Table(name = "APPLICATION_EVALUATION_FORM") +@Where(clause = "is_deleted = false") public class ApplicationEvaluationFormEntity extends BaseEntity{ private Long applicationId; - @Column(name="IS_DELETED") - private Boolean isDeleted; - @ManyToOne @JoinColumn(name = "EVALUATION_ID") private ApplicationEvaluationEntity applicationEvaluation; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormFieldEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormFieldEntity.java index 913d8831..f4324a2a 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormFieldEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationFormFieldEntity.java @@ -2,10 +2,12 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Data @Table(name = "APPLICATION_EVALUATION_FORM_FIELD") +@Where(clause = "is_deleted = false") public class ApplicationEvaluationFormFieldEntity extends BaseEntity { @ManyToOne @@ -18,7 +20,4 @@ public class ApplicationEvaluationFormFieldEntity extends BaseEntity { @Column(name = "FIELD_VALUE") private String fieldValue; - @Column(name="IS_DELETED") - private Boolean isDeleted; - } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormEntity.java index a6cc56aa..cf407cda 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormEntity.java @@ -2,11 +2,12 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.*; - +import org.hibernate.annotations.Where; @Entity @Table(name = "APPLICATION_FORM") @Data +@Where(clause = "is_deleted = false") public class ApplicationFormEntity extends BaseEntity { @ManyToOne diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormFieldEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormFieldEntity.java index fbab986d..206be527 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormFieldEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationFormFieldEntity.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.Where; import java.time.LocalDateTime; @@ -11,6 +12,7 @@ import java.time.LocalDateTime; @NoArgsConstructor @AllArgsConstructor @Builder +@Where(clause = "is_deleted = false") public class ApplicationFormFieldEntity extends BaseEntity { @ManyToOne diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationSignedDocumentEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationSignedDocumentEntity.java index 58975cca..3f50c14b 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationSignedDocumentEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationSignedDocumentEntity.java @@ -6,10 +6,12 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Data @Entity @Table(name = "application_signed_document") +@Where(clause = "is_deleted = false") public class ApplicationSignedDocumentEntity extends BaseEntity { @ManyToOne @@ -25,4 +27,6 @@ public class ApplicationSignedDocumentEntity extends BaseEntity { @Column(name="STATUS") private String status; + @Column(name="FILE_HASH") + private String fileHash; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsEntity.java index bd26f527..0c80c7af 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsEntity.java @@ -2,13 +2,14 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Data; +import org.hibernate.annotations.Where; import java.time.LocalDateTime; @Entity @Data @Table(name = "assigned_applications") - +@Where(clause = "is_deleted = false") public class AssignedApplicationsEntity extends BaseEntity{ @ManyToOne @@ -27,9 +28,7 @@ public class AssignedApplicationsEntity extends BaseEntity{ @Column(name = "NOTE") private String note; - @Column(name="IS_DELETED") - private Boolean isDeleted=false; - @Column(nullable = false) private LocalDateTime assignedAt; + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/BaseEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/BaseEntity.java index f8427719..16c7e94f 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/BaseEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/BaseEntity.java @@ -21,8 +21,13 @@ public class BaseEntity { @Column(name = "UPDATED_DATE") LocalDateTime updatedDate; - - @PrePersist + + + @Column(name="IS_DELETED") + private Boolean isDeleted = false; + + + @PrePersist public void setCreatedDate() { this.createdDate = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); this.updatedDate = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java index 2e84dd51..0985c37f 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java @@ -7,10 +7,12 @@ import jakarta.persistence.Entity; import jakarta.persistence.Table; import jakarta.validation.constraints.Email; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Table(name = "BENEFICIARY") @Data +@Where(clause = "is_deleted = false") public class BeneficiaryEntity extends BaseEntity { @Email diff --git a/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryPreferredCallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryPreferredCallEntity.java index 5bbc316d..22333d18 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryPreferredCallEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryPreferredCallEntity.java @@ -5,6 +5,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.hibernate.annotations.Where; import java.time.LocalDateTime; @@ -14,6 +15,7 @@ import java.time.LocalDateTime; @NoArgsConstructor @AllArgsConstructor @Builder +@Where(clause = "is_deleted = false") public class BeneficiaryPreferredCallEntity extends BaseEntity{ @Id @@ -35,9 +37,6 @@ public class BeneficiaryPreferredCallEntity extends BaseEntity{ @Column(name = "STATUS", length = 255) private String status; - @Column(name="IS_DELETED") - private Boolean isDeleted; - @ManyToOne @JoinColumn(name = "USER_WITH_COMPANY_ID") private UserWithCompanyEntity userWithCompany; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java index 25388138..dc8c05d8 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java @@ -5,6 +5,7 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; import lombok.Builder; +import org.hibernate.annotations.Where; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -16,6 +17,7 @@ import java.time.LocalTime; @NoArgsConstructor @AllArgsConstructor @Builder +@Where(clause = "is_deleted = false") public class CallEntity extends BaseEntity { @Column(name = "NAME", length = 255) diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallTargetAudienceChecklistEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallTargetAudienceChecklistEntity.java index 6b14df58..465baf67 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CallTargetAudienceChecklistEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallTargetAudienceChecklistEntity.java @@ -2,10 +2,12 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Table(name = "CALL_TARGET_AUDIENCE_CHECKLIST") @Data +@Where(clause = "is_deleted = false") public class CallTargetAudienceChecklistEntity extends BaseEntity{ @ManyToOne @@ -18,9 +20,5 @@ public class CallTargetAudienceChecklistEntity extends BaseEntity{ @Column(name = "IS_VALIDATED") private Boolean isValidated; - - @Column(name ="IS_DELETED", nullable = false) - private Boolean isDeleted = false; - } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CommunicationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CommunicationEntity.java index 9029649e..a1c3ff45 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CommunicationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CommunicationEntity.java @@ -6,12 +6,14 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; import java.time.LocalDateTime; @Entity @Table(name = "communication") @Data +@Where(clause = "is_deleted = false") public class CommunicationEntity extends BaseEntity { @Column(name = "COMMUNICATION_TITLE") @@ -20,9 +22,6 @@ public class CommunicationEntity extends BaseEntity { @Column(name = "COMMUNICATION_COMMENT") private String communicationComment; - @Column(name = "IS_DELETED") - private Boolean isDeleted = false; - @Column(name = "COMMENTED_DATE") private LocalDateTime commentedDate; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java index 15c3457c..1a08fffc 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CompanyDocumentEntity.java @@ -2,12 +2,14 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Data; +import org.hibernate.annotations.Where; import java.time.LocalDateTime; @Entity @Table(name = "COMPANY_DOCUMENT") @Data +@Where(clause = "is_deleted = false") public class CompanyDocumentEntity extends BaseEntity { @Column(name = "FILE_NAME") @@ -25,9 +27,6 @@ public class CompanyDocumentEntity extends BaseEntity { @Column(name="COMPANY_ID") private Long companyId; - @Column(name ="IS_DELETED") - private Boolean isDeleted = false; - @Column(name="UPLOADED_BY") private Long uploadedBy; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java index 12dc2a15..8a6c94e1 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java @@ -8,10 +8,12 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Table(name = "COMPANY") @Data +@Where(clause = "is_deleted = false") public class CompanyEntity extends BaseEntity{ @Column(name = "COMPANY_NAME") @@ -51,9 +53,6 @@ public class CompanyEntity extends BaseEntity{ @JoinColumn(name = "HUB_ID") private HubEntity hub; -// @Column(name = "JSON") -// private String json; - @Column(name = "NDG") private String ndg; @@ -62,4 +61,7 @@ public class CompanyEntity extends BaseEntity{ @Column(name = "JSON") private String json; + + @Column(name = "PEC") + private String pec; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java index 1177bbd2..8a65ee5e 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java @@ -4,10 +4,12 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Table(name = "criteria_form_field") @Data +@Where(clause = "is_deleted = false") public class CriteriaFormFieldEntity extends BaseEntity { private Long callId; @@ -17,8 +19,5 @@ public class CriteriaFormFieldEntity extends BaseEntity { private String formFieldId; private Long evaluationCriteriaId; - - @Column(name ="IS_DELETED", nullable = false) - private Boolean isDeleted = false; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/DocumentCategoryEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/DocumentCategoryEntity.java index 25a25d6d..3307e2d0 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/DocumentCategoryEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/DocumentCategoryEntity.java @@ -4,10 +4,12 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Table(name = "document_category") @Data +@Where(clause = "is_deleted = false") public class DocumentCategoryEntity extends BaseEntity { @Column(name = "CATEGORY_NAME") @@ -16,7 +18,4 @@ public class DocumentCategoryEntity extends BaseEntity { @Column(name = "DESCRIPTION") private String description; - @Column(name ="IS_DELETED") - private Boolean isDeleted = false; - } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java index 08bfd623..8c658411 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/DocumentEntity.java @@ -6,10 +6,12 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Table(name = "DOCUMENT") @Data +@Where(clause = "is_deleted = false") public class DocumentEntity extends BaseEntity{ @Column(name = "FILE_NAME", length = 255) private String fileName; @@ -26,9 +28,6 @@ public class DocumentEntity extends BaseEntity{ @Column(name="SOURCE_ID") private Long sourceId; - @Column(name ="IS_DELETED", nullable = false) - private Boolean isDeleted = false; - @Column(name="DOCUMENT_ATTACHMENT_ID") private String documentAttachmentId; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java index 1a582a21..1f8f3fe5 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/EmailLogEntity.java @@ -1,12 +1,14 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Data; +import org.hibernate.annotations.Where; import java.time.LocalDateTime; @Entity @Data @Table(name = "email_log") +@Where(clause = "is_deleted = false") public class EmailLogEntity extends BaseEntity{ @Column(name = "email_type", nullable = false, length = 255) @@ -54,9 +56,6 @@ public class EmailLogEntity extends BaseEntity{ @Column(name = "call_id") private Long callId; - @Column(name = "is_deleted") - private Boolean isDeleted; - @ManyToOne @JoinColumn(name = "user_action_id") private UserActionEntity userAction; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java index 8d1c0c69..0322911b 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/EvaluationCriteriaEntity.java @@ -5,6 +5,9 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; + +import java.math.BigDecimal; import java.math.BigDecimal; @@ -12,6 +15,7 @@ import java.math.BigDecimal; @Entity @Table(name = "EVALUATION_CRITERIA") @Data +@Where(clause = "is_deleted = false") public class EvaluationCriteriaEntity extends BaseEntity { @ManyToOne diff --git a/src/main/java/net/gepafin/tendermanagement/entities/EvaluationFormEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/EvaluationFormEntity.java index 9d3bd3fa..e839814a 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/EvaluationFormEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/EvaluationFormEntity.java @@ -5,12 +5,15 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.hibernate.annotations.Where; + @Entity @Table(name = "EVALUATION_FORM") @Data @NoArgsConstructor @AllArgsConstructor @Builder +@Where(clause = "is_deleted = false") public class EvaluationFormEntity extends BaseEntity{ @@ -24,6 +27,4 @@ public class EvaluationFormEntity extends BaseEntity{ @Column(name = "CONTENT") private String content; - @Column(name="IS_DELETED") - private Boolean isDeleted; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ExpirationConfigEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ExpirationConfigEntity.java index 83159e3a..0f8336db 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ExpirationConfigEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ExpirationConfigEntity.java @@ -4,10 +4,12 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Table(name = "expiration_config") @Data +@Where(clause = "is_deleted = false") public class ExpirationConfigEntity extends BaseEntity { @Column(name="INTERVAL_DAYS") @@ -15,7 +17,4 @@ public class ExpirationConfigEntity extends BaseEntity { @Column(name="TYPE") private String type; - - @Column(name="IS_DELETED") - private Boolean isDeleted; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java index 46ebff24..5df715c9 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java @@ -9,11 +9,12 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Data; - +import org.hibernate.annotations.Where; @Entity @Table(name = "FAQ") @Data +@Where(clause = "is_deleted = false") public class FaqEntity extends BaseEntity { @ManyToOne @@ -38,10 +39,7 @@ public class FaqEntity extends BaseEntity { @Column(name = "RESPONSE_DATE") private LocalDateTime responseDate; - - @Column(name ="IS_DELETED", nullable = false) - private Boolean isDeleted = false; - + @Column(name ="COMPANY_ID") private Long companyId; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FlowDataEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FlowDataEntity.java index cdffe410..a8c99131 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FlowDataEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FlowDataEntity.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.Where; import java.time.LocalDateTime; @@ -10,6 +11,7 @@ import java.time.LocalDateTime; @NoArgsConstructor @AllArgsConstructor @Builder +@Where(clause = "is_deleted = false") public class FlowDataEntity extends BaseEntity{ @Column(name = "FORM_ID") @@ -23,4 +25,5 @@ public class FlowDataEntity extends BaseEntity{ @Column(name="CALL_ID") private Long callId; + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FlowEdgesEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FlowEdgesEntity.java index 119af700..4bcab38d 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FlowEdgesEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FlowEdgesEntity.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.*; +import org.hibernate.annotations.Where; import java.time.LocalDateTime; @@ -11,6 +12,7 @@ import java.time.LocalDateTime; @NoArgsConstructor @AllArgsConstructor @Builder +@Where(clause = "is_deleted = false") public class FlowEdgesEntity extends BaseEntity { @Column(name = "SOURCE_ID") diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java index 588619a5..5861b7a8 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FormEntity.java @@ -5,6 +5,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.Builder; import lombok.NoArgsConstructor; +import org.hibernate.annotations.Where; @Entity @Table(name = "FORM") @@ -12,6 +13,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor @Builder +@Where(clause = "is_deleted = false") public class FormEntity extends BaseEntity{ @Column(name = "LABEL", length = 255) diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java index b75b0c57..66e1485d 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FormFieldEntity.java @@ -5,6 +5,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.Builder; import lombok.NoArgsConstructor; +import org.hibernate.annotations.Where; @Entity @Table(name = "FORM_FIELD") @@ -12,6 +13,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor @Builder +@Where(clause = "is_deleted = false") public class FormFieldEntity extends BaseEntity{ @Column(name = "NAME", length = 255) @@ -31,4 +33,5 @@ public class FormFieldEntity extends BaseEntity{ @Column(name = "SORT_ORDER") private Integer sortOrder; + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FormTemplateEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FormTemplateEntity.java index 897a9dfd..93f20e18 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FormTemplateEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FormTemplateEntity.java @@ -5,6 +5,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.Builder; import lombok.NoArgsConstructor; +import org.hibernate.annotations.Where; @Entity @Table(name = "FORM_TEMPLATE") @@ -12,6 +13,7 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor @Builder +@Where(clause = "is_deleted = false") public class FormTemplateEntity extends BaseEntity{ @Column(name = "LABEL", length = 255) diff --git a/src/main/java/net/gepafin/tendermanagement/entities/GlobalConfigEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/GlobalConfigEntity.java index 3f55abdf..21201ba5 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/GlobalConfigEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/GlobalConfigEntity.java @@ -15,7 +15,4 @@ public class GlobalConfigEntity extends BaseEntity{ @Column(name = "TYPE") private String type; - - @Column(name = "IS_DELETED") - private Boolean isDeleted = false; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java index 603b42b4..f59e3d3c 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java @@ -4,12 +4,13 @@ import jakarta.persistence.*; import jakarta.validation.constraints.Size; import lombok.Getter; import lombok.Setter; - +import org.hibernate.annotations.Where; @Entity @Table(name="hub") @Setter @Getter +@Where(clause = "is_deleted = false") public class HubEntity extends BaseEntity{ @Column(name = "COMPANY_NAME") diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubUserEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubUserEntity.java index 1bec68ce..ebed1915 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/HubUserEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubUserEntity.java @@ -3,11 +3,13 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; +import org.hibernate.annotations.Where; @Entity @Table(name = "hub_user") @Getter @Setter +@Where(clause = "is_deleted = false") public class HubUserEntity extends BaseEntity{ @ManyToOne diff --git a/src/main/java/net/gepafin/tendermanagement/entities/LoginAttemptEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/LoginAttemptEntity.java index bc3e445e..6ad5a652 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/LoginAttemptEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/LoginAttemptEntity.java @@ -2,12 +2,14 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Data; +import org.hibernate.annotations.Where; import java.time.LocalDateTime; @Entity @Table(name = "LOGIN_ATTEMPT") @Data +@Where(clause = "is_deleted = false") public class LoginAttemptEntity extends BaseEntity{ @Column(name = "USERNAME") diff --git a/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java index 1afe87aa..21475d82 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/LookUpDataEntity.java @@ -3,10 +3,12 @@ package net.gepafin.tendermanagement.entities; import com.fasterxml.jackson.annotation.JsonValue; import jakarta.persistence.*; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Table(name = "LOOKUP_DATA") @Data +@Where(clause = "is_deleted = false") public class LookUpDataEntity extends BaseEntity{ @Column(name = "TITLE", columnDefinition = "TEXT", nullable = true) 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/entities/NotificationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/NotificationEntity.java index 718a7367..9896140b 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/NotificationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/NotificationEntity.java @@ -6,10 +6,12 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Table(name = "NOTIFICATION") @Data +@Where(clause = "is_deleted = false") public class NotificationEntity extends BaseEntity { @Column(name = "USER_ID") @@ -24,9 +26,6 @@ public class NotificationEntity extends BaseEntity { @Column(name = "STATUS") private String status; - @Column(name = "IS_DELETED") - private Boolean isDeleted; - @Column(name = "NOTIFICATION_TYPE") private String notificationType; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/NotificationTypeEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/NotificationTypeEntity.java index 40d3f220..8a56b9ab 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/NotificationTypeEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/NotificationTypeEntity.java @@ -4,10 +4,12 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Data @Table(name = "NOTIFICATION_TYPE") +@Where(clause = "is_deleted = false") public class NotificationTypeEntity extends BaseEntity { @Column(name = "NOTIFICATION_NAME") @@ -18,7 +20,4 @@ public class NotificationTypeEntity extends BaseEntity { @Column(name = "TITLE") private String title; - - @Column(name="IS_DELETED") - private Boolean isDeleted; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java index 69303b41..cc46095a 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java @@ -3,12 +3,15 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Data; import net.gepafin.tendermanagement.config.LocalTimeAttributeConverter; +import org.hibernate.annotations.Where; +import java.time.LocalDateTime; import java.time.LocalTime; @Entity @Table(name = "PROTOCOL") @Data +@Where(clause = "is_deleted = false") public class ProtocolEntity extends BaseEntity { @Column(name = "PROTOCOL_NUMBER", nullable = false) @@ -33,4 +36,14 @@ public class ProtocolEntity extends BaseEntity { @Column(name = "type") private String type; + @Column(name = "external_protocol_year") + private Integer externalProtocolYear; + + @Column(name = "external_protocol_date") + private LocalDateTime externalProtocolDate; + + @Column(name = "external_protocol_number") + private String externalProtocolNumber; + + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/RegionEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/RegionEntity.java index 386b9787..d18020bd 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/RegionEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/RegionEntity.java @@ -6,6 +6,7 @@ import jakarta.persistence.Table; import lombok.Getter; import lombok.Setter; +import org.hibernate.annotations.Where; import java.math.BigDecimal; @@ -13,6 +14,7 @@ import java.math.BigDecimal; @Table(name = "REGION") @Getter @Setter +@Where(clause = "is_deleted = false") public class RegionEntity extends BaseEntity { @Column(name = "REGION_NAME", length = 255, nullable = true) diff --git a/src/main/java/net/gepafin/tendermanagement/entities/RoleActionContextEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/RoleActionContextEntity.java index a3ff676f..88408904 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/RoleActionContextEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/RoleActionContextEntity.java @@ -4,10 +4,12 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Data @Table(name ="role_action_context") +@Where(clause = "is_deleted = false") public class RoleActionContextEntity extends BaseEntity { @Column(name = "action_context") @@ -16,9 +18,6 @@ public class RoleActionContextEntity extends BaseEntity { @Column(name = "role_id") private Long roleId; - @Column(name="is_deleted") - private Boolean isDeleted; - @Column(name = "is_viewed") private Boolean isViewed; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java index c94b36b9..55091136 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java @@ -4,11 +4,13 @@ import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; +import org.hibernate.annotations.Where; @Entity @Table(name = "ROLE") @Getter @Setter +@Where(clause = "is_deleted = false") public class RoleEntity extends BaseEntity { @Column(name = "ROLE_NAME", length = 255, nullable = true) diff --git a/src/main/java/net/gepafin/tendermanagement/entities/S3ConfigEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/S3ConfigEntity.java index 66502bbc..b058aa70 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/S3ConfigEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/S3ConfigEntity.java @@ -4,10 +4,12 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Table(name = "s3_path_configuration") @Data +@Where(clause = "is_deleted = false") public class S3ConfigEntity extends BaseEntity { @Column(name = "TYPE") @@ -21,5 +23,6 @@ public class S3ConfigEntity extends BaseEntity { @Column(name = "PARENT_FOLDER") private String parentFolder; + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java index 05535e97..a3dcd2c8 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java @@ -4,10 +4,12 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Table(name = "SAML_RESPONSE") @Data +@Where(clause = "is_deleted = false") public class SamlResponseEntity extends BaseEntity{ @Column(name = "AUTHENTICATION_OBJECT") @@ -30,6 +32,5 @@ public class SamlResponseEntity extends BaseEntity{ @Column(name = "TOKEN") private String token; - } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java index 92d97e9f..a4c40863 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/SystemEmailTemplatesEntity.java @@ -8,10 +8,12 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Table(name = "system_email_template") @Data +@Where(clause = "is_deleted = false") public class SystemEmailTemplatesEntity extends BaseEntity { @@ -32,9 +34,6 @@ public class SystemEmailTemplatesEntity extends BaseEntity { @Column(name = "SYSTEM") private Boolean system; - - @Column(name ="IS_DELETED", nullable = false) - private Boolean isDeleted = false; @Column(name = "email_scenario") private String emailScenario; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserActionEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserActionEntity.java index 6f85f6ef..f15e173c 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/UserActionEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserActionEntity.java @@ -4,10 +4,12 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Data @Entity @Table(name = "user_action") +@Where(clause = "is_deleted = false") public class UserActionEntity extends BaseEntity { @Column(name = "USER_ID") @@ -40,7 +42,4 @@ public class UserActionEntity extends BaseEntity { @Column(name = "RESPONSE") private String response; - @Column(name = "IS_DELETED", nullable = false) - private Boolean isDeleted = false; - } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserCompanyDelegationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserCompanyDelegationEntity.java index 9def5dc3..8659d16a 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/UserCompanyDelegationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserCompanyDelegationEntity.java @@ -2,10 +2,12 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Data; +import org.hibernate.annotations.Where; @Data @Entity @Table(name = "user_company_delegation") +@Where(clause = "is_deleted = false") public class UserCompanyDelegationEntity extends BaseEntity{ @Column(name="USER_ID") diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java index 86147cdf..3dbd21d4 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Getter; import lombok.Setter; +import org.hibernate.annotations.Where; import net.gepafin.tendermanagement.model.response.EmailSendResponse; import java.time.LocalDateTime; @@ -16,6 +17,7 @@ import java.util.List; @Table(name = "GEPAFIN_USER") @Getter @Setter +@Where(clause = "is_deleted = false") public class UserEntity extends BaseEntity { @Column(name = "PASSWORD", columnDefinition = "TEXT",nullable = true) diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java index 65afbe76..9c067b32 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java @@ -4,10 +4,12 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Entity @Table(name = "USER_WITH_COMPANY") @Data +@Where(clause = "is_deleted = false") public class UserWithCompanyEntity extends BaseEntity{ @Column(name = "USER_ID") @@ -34,8 +36,5 @@ public class UserWithCompanyEntity extends BaseEntity{ @Column(name = "EMAIL") private String email; - - @Column(name = "IS_DELETED") - private Boolean isDeleted = false; - + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/VersionHistoryEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/VersionHistoryEntity.java index 2445fb44..cca7dfc2 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/VersionHistoryEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/VersionHistoryEntity.java @@ -4,10 +4,12 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Table; import lombok.Data; +import org.hibernate.annotations.Where; @Data @Entity @Table(name = "version_history") +@Where(clause = "is_deleted = false") public class VersionHistoryEntity extends BaseEntity { @Column(name = "OLD_DATA", columnDefinition = "LONGTEXT") @@ -30,7 +32,4 @@ public class VersionHistoryEntity extends BaseEntity { @Column(name = "USER_ID") private Long userId; - - @Column(name = "IS_DELETED", nullable = false) - private Boolean isDeleted = false; } 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/model/response/ApplicationSignedDocumentResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationSignedDocumentResponse.java index 64b380f5..249ed7f8 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationSignedDocumentResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationSignedDocumentResponse.java @@ -11,4 +11,5 @@ public class ApplicationSignedDocumentResponse extends BaseBean{ private String fileName; private String filePath; private ApplicationSignedDocumentStatusEnum status; + private String fileHash; } 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/scheduler/ApplicationEvaluationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java index af4cb6be..413efe37 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java @@ -91,7 +91,11 @@ public class ApplicationEvaluationScheduler { // Map placeHolders = notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_EXPIRED); Map placeHolders = new HashMap<>(); placeHolders.put("{{call_name}}", application.getCall().getName()); - placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber())); + String protocolNumber=application.getProtocol().getExternalProtocolNumber(); + if(protocolNumber==null){ + protocolNumber= String.valueOf(application.getProtocol().getProtocolNumber()); + } + placeHolders.put("{{protocol_number}}", protocolNumber); notificationDao.sendNotificationToSuperUser(application,placeHolders,NotificationTypeEnum.EVALUATION_EXPIRED); notificationDao.sendNotificationToInstructor(placeHolders,evaluation,NotificationTypeEnum.EVALUATION_EXPIRED); notificationDao.sendNotificationToInstructorManager(placeHolders,evaluation,NotificationTypeEnum.EVALUATION_EXPIRED); 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/feignClient/ProtocolService.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/ProtocolService.java new file mode 100644 index 00000000..07322a0c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/ProtocolService.java @@ -0,0 +1,32 @@ +package net.gepafin.tendermanagement.service.feignClient; + +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; + +import java.net.URI; +import java.util.List; +import java.util.Map; + +@FeignClient(value = "protocol-service" ,url = GepafinConstant.PROTOCOL_SERVICE_URL) +public interface ProtocolService { + + @PostMapping(GepafinConstant.PROTOCOL_SERVICE_BEARER_TOKEN) + ResponseEntity getBearerToken(@RequestHeader HttpHeaders headers,@RequestParam("codAoo") String codAoo,@RequestParam("username") String username,@RequestParam("password") String password + ); + + @PutMapping(GepafinConstant.PROTOCOL_SERVICE_CREATE_PROTOCOL) + ResponseEntity createProtocol(@RequestHeader HttpHeaders headers, @RequestParam("CLASSIFICA") String classifica, @RequestParam("ANNO_FASCICOLO") String year, @RequestParam("PROGR_FASCICOLO") String applicationId, + @RequestParam("DES_FASCICOLO") String companyName, @RequestParam("PARENT_DES_FASCICOLO") String callName, @RequestParam("PARENT_PROGR_FASCICOLO") String callId, @RequestBody List> requestBody + + + ); + +} 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/util/DateTimeUtil.java b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java index bafd5d6d..e9bfe870 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java +++ b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java @@ -98,11 +98,19 @@ public class DateTimeUtil { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); return LocalDateTime.parse(dateTimeStr, formatter); } - public static LocalDateTime parseStringToLocalDateTime(String timestampStr) { - // Use ISO_LOCAL_DATE_TIME to parse the input string - return LocalDateTime.parse(timestampStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME); + public static LocalDateTime parseStringToLocalDateTime(String dateStr) { + if (dateStr == null || dateStr.isEmpty()) return null; + + try { + return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } catch (Exception e) { + try { + return LocalDateTime.parse(dateStr, DateTimeFormatter.ISO_DATE_TIME); // fallback + } catch (Exception ignored) { + } + } + return null; } - public static String parseLocalTimeToString(LocalTime time, String format) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format); return time.format(formatter); diff --git a/src/main/java/net/gepafin/tendermanagement/util/FileHashUtil.java b/src/main/java/net/gepafin/tendermanagement/util/FileHashUtil.java new file mode 100644 index 00000000..5e9542a3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/util/FileHashUtil.java @@ -0,0 +1,40 @@ +package net.gepafin.tendermanagement.util; + +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.io.InputStream; +import java.security.DigestInputStream; +import java.security.MessageDigest; + +@Component +public class FileHashUtil { + + public static String calculateSHA256(InputStream inputStream) throws IOException { + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + + try (DigestInputStream dis = new DigestInputStream(inputStream, md)) { + byte[] buffer = new byte[8192]; + while (dis.read(buffer) != -1) { + // reading to compute hash + } + } + + byte[] digest = md.digest(); + return bytesToHex(digest); + } catch (Exception e) { + throw new RuntimeException("Could not generate hash", e); + } + } + + private static String bytesToHex(byte[] bytes) { + StringBuilder hexString = new StringBuilder(); + for (byte b : bytes) { + String hex = Integer.toHexString(0xff & b); + if (hex.length() == 1) hexString.append('0'); + hexString.append(hex); + } + return hexString.toString(); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 2fbe8dd9..19feb0e2 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -48,6 +48,7 @@ import net.objecthunter.exp4j.ExpressionBuilder; import org.apache.commons.collections4.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import com.fasterxml.jackson.core.JsonProcessingException; @@ -60,6 +61,7 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import feign.FeignException; import io.micrometer.common.util.StringUtils; +import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -1043,6 +1045,13 @@ public class Utils { return new ArrayList<>(responseMap.values()); } + public static HttpHeaders getHeaders(){ + HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.add(org.apache.http.HttpHeaders.USER_AGENT, "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"); + return headers; + } public static void setHttpServletRequestForThread(HttpServletRequest request,String methodType, String remoteUser, Long userActionId) { MockHttpServletRequest mockRequest = new MockHttpServletRequest(); 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/application-production.properties b/src/main/resources/application-production.properties index c4ad1fe9..ef5f73f2 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -37,3 +37,5 @@ spring.rabbitmq.port=61613 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.rabbitmq.virtual-host=/ + +isSviluppumbriaProtocolEnabled = false \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b165e997..4cb55816 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -75,4 +75,20 @@ spring.cloud.openfeign.client.config.default.readTimeout=300000 spring.rabbitmq.connection-timeout=120000 app.bandi.login.url.suffix=/loginadmin -app.confidi.login.url.suffix=/confidi \ No newline at end of file +app.confidi.login.url.suffix=/confidi + +#sviluppumbria protocol +codAoo=SVILUMBRIA-01 +sviluppumbria.username=protocollatoresvilumbria +password=8e85ea4265e49497d697168fd3d34916 +CLASSIFICA=06.004.3 +TIPO_PROTOCOLLAZIONE=E +tipoCorrispondenteCompany=PersonaGiuridica +tipoCorrispondenteWithoutCompany=Persona +mezzo=Altro +indirizzoPec=ufficio01@domain.com +codiceUo=101_10 +competente=true +tipoCorrispondente=Amministrazione +sviluppumbriaUuid=t7jh5wfg9QXylNaTZkPoE +isSviluppumbriaProtocolEnabled = true 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 76bfc067..147dd7f7 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 @@ -2737,6 +2737,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/dump/updated_form_field_05_06_2025.sql b/src/main/resources/db/dump/updated_form_field_05_06_2025.sql new file mode 100644 index 00000000..42766b94 --- /dev/null +++ b/src/main/resources/db/dump/updated_form_field_05_06_2025.sql @@ -0,0 +1,19 @@ +UPDATE FORM_FIELD +SET + NAME = 'textinput', + LABEL = 'Campo Email', + DESCRIPTION = 'Per l''inserimento di indirizzi email standard (non PEC)', + SETTINGS = '[{"name":"label","value":"Campo Email"},{"name":"placeholder","value":"nome@esempio.it"},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""},{"name": "isPecEmail", "value":false}]', + VALIDATORS = '{"isRequired": false, "custom": "isEmail"}', + UPDATED_DATE = CURRENT_TIMESTAMP +WHERE SORT_ORDER = 15; + +UPDATE FORM_FIELD +SET + NAME = 'textinput', + LABEL = 'Campo PEC', + DESCRIPTION = 'Specifico per l''inserimento di un indirizzo di Posta Elettronica Certificata', + SETTINGS = '[{"name":"label","value":"Campo PEC"},{"name":"placeholder","value":"nome@pec.it"},{"name":"reportEnable","value":false},{"name":"reportHeader","value":""},{"name": "isPecEmail", "value":false}]', + VALIDATORS = '{"isRequired": false, "custom": "isEmailPEC"}', + UPDATED_DATE = CURRENT_TIMESTAMP +WHERE SORT_ORDER = 16; 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.