diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java index d2337ee9..52b30dbd 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; + import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,9 +17,11 @@ import org.springframework.stereotype.Component; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.SamlResponseEntity; import net.gepafin.tendermanagement.enums.SamlResponseStatusEnum; import net.gepafin.tendermanagement.repositories.SamlResponseRepository; +import net.gepafin.tendermanagement.service.HubService; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -33,12 +36,16 @@ public class SamlFailureHandler implements AuthenticationFailureHandler { @Autowired private SamlResponseRepository samlResponseRepository; + @Autowired + private HubService hubService; + @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException { try { logger.error("SAML login failed: " + exception.getMessage()); - String inResponseTo = extractInResponseTo(feBaseUrl); + String inResponseTo = extractInResponseTo(exception.getMessage()); + if (Boolean.FALSE.equals(StringUtils.isEmpty(inResponseTo))) { SamlResponseEntity samlResponseLogEntity = samlResponseRepository .findByInResponseToAndStatus(inResponseTo, SamlResponseStatusEnum.INITIATED.getValue()) @@ -46,6 +53,10 @@ public class SamlFailureHandler implements AuthenticationFailureHandler { Translator.toLocale(GepafinConstant.INVALID_REQUEST))); samlResponseLogEntity.setStatus(SamlResponseStatusEnum.FAILED.getValue()); samlResponseRepository.save(samlResponseLogEntity); + HubEntity hub = hubService.getHubByUuid(samlResponseLogEntity.getHubUuid()); + if (Boolean.FALSE.equals(StringUtils.isEmpty(hub.getDomainName()))) { + feBaseUrl = hub.getDomainName(); + } } response.sendRedirect(feBaseUrl + "/login"); } catch (Exception e) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index b522354d..603a1b0f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.dao; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.persistence.criteria.Join; @@ -8,6 +9,7 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; +import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequest; import net.gepafin.tendermanagement.model.request.ApplicationAmendmentRequestBean; @@ -17,9 +19,8 @@ import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.*; import net.gepafin.tendermanagement.util.DateTimeUtil; -import net.gepafin.tendermanagement.util.Validator; -import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -28,10 +29,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; -import java.time.temporal.ChronoUnit; - - import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; @@ -174,7 +173,8 @@ public class ApplicationAmendmentRequestDao { try { List> dataList = objectMapper.readValue( - content, new TypeReference>>() {}); + content, new TypeReference>>() { + }); for (Map data : dataList) { if (target.equals(data.get("name"))) { @@ -188,19 +188,19 @@ public class ApplicationAmendmentRequestDao { return filteredList; } - public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(Long applicationEvaluationId, ApplicationAmendmentRequest applicationAmendmentRequest){ + public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(Long applicationEvaluationId, ApplicationAmendmentRequest applicationAmendmentRequest) { log.info("Submiting application data for amendment Process with details: {}", applicationEvaluationId); ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = createApplicationAmendmentRequestEntity(applicationAmendmentRequest, applicationEvaluationId); ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = convertEntityToResponse(applicationAmendmentRequestEntity); log.info("Application submitted successfully for amendment", applicationAmendmentRequestResponse); - if(Boolean.TRUE.equals(applicationAmendmentRequestResponse.isSendEmail())){ + if (Boolean.TRUE.equals(applicationAmendmentRequestResponse.getIsSendEmail())) { emailNotificationDao.sendMailToNotifyBeneficiaryRegardingNewAmendment(applicationAmendmentRequestEntity); } return applicationAmendmentRequestResponse; } - public ApplicationAmendmentRequestEntity createApplicationAmendmentRequestEntity(ApplicationAmendmentRequest applicationAmendmentRequest,Long applicationEvaluationId){ + public ApplicationAmendmentRequestEntity createApplicationAmendmentRequestEntity(ApplicationAmendmentRequest applicationAmendmentRequest,Long applicationEvaluationId) { ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = new ApplicationAmendmentRequestEntity(); applicationAmendmentRequestEntity.setNote(applicationAmendmentRequest.getNote()); applicationAmendmentRequestEntity.setResponseDays(applicationAmendmentRequest.getResponseDays()); @@ -216,11 +216,17 @@ public class ApplicationAmendmentRequestDao { applicationAmendmentRequestEntity.setApplicationId(applicationId); if (applicationAmendmentRequest.getFormFields() != null) { - String fieldIdsString = applicationAmendmentRequest.getFormFields().stream() + List formFieldRequestBean = applicationAmendmentRequest.getFormFields().stream() .filter(AmendmentFormFieldResponse::isSelected) - .map(AmendmentFormFieldResponse::getFieldId) - .collect(Collectors.joining(",")); - applicationAmendmentRequestEntity.setFormFields(fieldIdsString); + .map(amendmentFormFieldRequest -> { + ApplicationFormFieldRequestBean formField = new ApplicationFormFieldRequestBean(); + formField.setFieldId(amendmentFormFieldRequest.getFieldId()); + formField.setFieldValue(null); + return formField; + }) + .collect(Collectors.toList()); + String formFieldsJson = Utils.convertObjectToJson(formFieldRequestBean); + applicationAmendmentRequestEntity.setFormFields(formFieldsJson); } UserEntity userEntity = userService.validateUser(applicationEvaluationEntity.getUserId()); Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub()); @@ -245,15 +251,15 @@ public class ApplicationAmendmentRequestDao { return applicationAmendment; } - public ApplicationAmendmentRequestEntity saveApplicationAmendmentRequestEntity(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity){ - ApplicationAmendmentRequestEntity applicationAmendmentRequest= applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); + public ApplicationAmendmentRequestEntity saveApplicationAmendmentRequestEntity(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity) { + ApplicationAmendmentRequestEntity applicationAmendmentRequest = applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); return applicationAmendmentRequest; } - public ApplicationAmendmentRequestResponse convertEntityToResponse(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity){ + public ApplicationAmendmentRequestResponse convertEntityToResponse(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity) { ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = new ApplicationAmendmentRequestResponse(); applicationAmendmentRequestResponse.setId(applicationAmendmentRequestEntity.getId()); - Long applicationId= applicationAmendmentRequestEntity.getApplicationId(); + Long applicationId = applicationAmendmentRequestEntity.getApplicationId(); ApplicationEntity application = applicationService.validateApplication(applicationId); applicationAmendmentRequestResponse.setApplicationId(applicationId); @@ -269,8 +275,8 @@ public class ApplicationAmendmentRequestDao { LocalDateTime expirationDate = startDate.plus(expirationDays, ChronoUnit.DAYS); applicationAmendmentRequestResponse.setExpirationDate(expirationDate); - applicationAmendmentRequestResponse.setSendEmail(applicationAmendmentRequestEntity.getIsEmail()); - applicationAmendmentRequestResponse.setSendNotification(applicationAmendmentRequestEntity.getIsNotification()); + applicationAmendmentRequestResponse.setIsSendEmail(applicationAmendmentRequestEntity.getIsEmail()); + applicationAmendmentRequestResponse.setIsSendNotification(applicationAmendmentRequestEntity.getIsNotification()); String callName = application.getCall().getName(); Long protocolNumber = (applicationAmendmentRequestEntity.getProtocol() != null && applicationAmendmentRequestEntity.getProtocol().getProtocolNumber() != null) ? applicationAmendmentRequestEntity.getProtocol().getProtocolNumber() @@ -287,48 +293,64 @@ public class ApplicationAmendmentRequestDao { applicationAmendmentRequestResponse.setProtocolNumber(protocolNumber); applicationAmendmentRequestResponse.setBeneficiaryName(beneficiaryName); - String formFieldsString = applicationAmendmentRequestEntity.getFormFields(); - List storedFieldIds = (formFieldsString != null) ? Arrays.asList(formFieldsString.split(",")) : Collections.emptyList(); - List applicationForms = applicationFormRepository.findByApplicationId(application.getId()); - List formFields = new ArrayList<>(); - for (ApplicationFormEntity formEntity : applicationForms) { - String content = formEntity.getForm().getContent(); - List> result = filterByName(content, "fileupload"); + List forms = applicationFormRepository.findByApplicationId(applicationId); + List allFormFields = new ArrayList<>(); - List matchingFields = getIdAndLabelFromResult(result).stream() - .filter(field -> storedFieldIds.contains(field.getFieldId())) - .collect(Collectors.toList()); - formFields.addAll(matchingFields); + for (ApplicationFormEntity form : forms) { + String content = form.getForm().getContent(); + List> result = filterByName(content, "fileupload"); + allFormFields.addAll(getIdAndLabelFromResult(result)); } + + Map fieldIdToLabelMap = allFormFields.stream() + .collect(Collectors.toMap(AmendmentFormFieldResponse::getFieldId, AmendmentFormFieldResponse::getLabel)); + + String formFieldsJson = applicationAmendmentRequestEntity.getFormFields(); + List formFields = Utils.convertJsonToList( + formFieldsJson, new TypeReference>() { + }); + + for (AmendmentFormFieldResponse formField : formFields) { + String label = fieldIdToLabelMap.get(formField.getFieldId()); + formField.setLabel(label); + formField.setSelected(true); + } + // Set the filtered formFields in the response applicationAmendmentRequestResponse.setFormFields(formFields); - List formField = formFields.stream() - .map(field -> { - AmendmentFormFieldResponse responseField = new AmendmentFormFieldResponse(); - responseField.setFieldId(field.getFieldId()); - responseField.setLabel(field.getLabel()); - responseField.setSelected(true); - return responseField; - }) - .collect(Collectors.toList()); - - applicationAmendmentRequestResponse.setFormFields(formField); - - List formFieldEntities = applicationFormFieldRepository.findByApplicationFormIdIn( - applicationForms.stream().map(ApplicationFormEntity::getId).collect(Collectors.toList()) - ); + String applicationFormFieldsJson = applicationAmendmentRequestEntity.getFormFields(); + List applicationFormFields = Utils.convertJsonToList( + formFieldsJson, new TypeReference>() { + }); List fileDetailResponses = new ArrayList<>(); - for (AmendmentFormFieldResponse field : formFields) { - for (ApplicationFormFieldEntity formFieldEntity : formFieldEntities) { - if (formFieldEntity.getFieldId().equals(field.getFieldId()) && formFieldEntity.getFieldValue() != null) { - ApplicationFormFieldResponseBean responseBean = new ApplicationFormFieldResponseBean(); - responseBean.setFieldId(formFieldEntity.getFieldId()); + for (ApplicationFormFieldResponseBean field : applicationFormFields) { + ApplicationFormFieldResponseBean responseBean = new ApplicationFormFieldResponseBean(); + responseBean.setFieldId(field.getFieldId()); - String[] documentIds = formFieldEntity.getFieldValue().split(","); - List documentResponseBeans = new ArrayList<>(); + Optional formFieldEntity = Optional.empty(); + for (ApplicationFormEntity form : forms) { + formFieldEntity = applicationFormFieldRepository + .findByApplicationFormIdAndFieldId(form.getId(), field.getFieldId()); + if (formFieldEntity.isPresent()) { + // Set the applicationFormId from the matching form + responseBean.setApplicationFormId(form.getId()); + responseBean.setId(formFieldEntity.get().getId()); + responseBean.setCreatedDate(formFieldEntity.get().getCreatedDate()); + responseBean.setUpdatedDate(formFieldEntity.get().getUpdatedDate()); + break; + } + } - for (String docId : documentIds) { + // Check if fieldValue is not null and is a String + if (field.getFieldValue() instanceof String && field.getFieldValue() != null && !((String) field.getFieldValue()).isBlank()) { + String fieldValueString = (String) field.getFieldValue(); + String[] documentIds = fieldValueString.split(","); + List documentResponseBeans = new ArrayList<>(); + + // Process each document ID + for (String docId : documentIds) { + try { Long documentId = Long.valueOf(docId.trim()); documentRepository.findByIdAndNotDeleted(documentId).ifPresent(documentEntity -> { DocumentResponseBean docBean = new DocumentResponseBean(); @@ -342,12 +364,17 @@ public class ApplicationAmendmentRequestDao { docBean.setUpdatedDate(documentEntity.getUpdatedDate()); documentResponseBeans.add(docBean); }); + } catch (NumberFormatException e) { + // Handle the case where documentId is not a valid number + // Log the error if necessary } - - responseBean.setFieldValue(documentResponseBeans); - fileDetailResponses.add(responseBean); } + responseBean.setFieldValue(documentResponseBeans); + } else { + responseBean.setFieldValue(null); } + + fileDetailResponses.add(responseBean); } applicationAmendmentRequestResponse.setApplicationFormFields(fileDetailResponses); @@ -363,7 +390,7 @@ public class ApplicationAmendmentRequestDao { public void deleteById(Long id) { log.info("Deleting assigned application with ID: {}", id); - ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity= validateApplicationAmendmentRequest(id); + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validateApplicationAmendmentRequest(id); applicationAmendmentRequestEntity.setIsDeleted(true); saveApplicationAmendmentRequestEntity(applicationAmendmentRequestEntity); log.info(" Application amendment deleted with ID: {}", id); @@ -377,11 +404,11 @@ public class ApplicationAmendmentRequestDao { return response; } - public List getAllApplicationAmendmentRequest(HttpServletRequest request,Long userId) { - if(validator.checkIsPreInstructor() && userId == null) { + public List getAllApplicationAmendmentRequest(HttpServletRequest request, Long userId) { + if (validator.checkIsPreInstructor() && userId == null) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.USER_ID_NOT_NULL_MSG)); } - if(userId != null) { + if (userId != null) { validator.validatePreInstructor(request, userId); } Specification spec = search(userId); @@ -416,6 +443,7 @@ public class ApplicationAmendmentRequestDao { setIfUpdated(existingApplicationAmendment::getNote, existingApplicationAmendment::setNote, updateRequest.getNote()); if (updateRequest.getApplicationFormFields() != null) { updateApplicationFormFields(existingApplicationAmendment, updateRequest.getApplicationFormFields()); + updateFormFieldsJson(existingApplicationAmendment, updateRequest.getApplicationFormFields()); } existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); @@ -479,23 +507,71 @@ public class ApplicationAmendmentRequestDao { boolean fieldUpdated = false; + // Parse the formFields JSON string to get amendment field values + String amendmentFieldValue = null; + try { + ObjectMapper mapper = new ObjectMapper(); + List amendmentFields = mapper.readValue( + applicationAmendment.getFormFields(), + mapper.getTypeFactory().constructCollectionType(List.class, ApplicationFormFieldRequestBean.class) + ); + + // Find the matching field value and convert to string if found + Optional amendmentFieldObj = amendmentFields.stream() + .filter(field -> updatedFormField.getFieldId().equals(field.getFieldId())) + .map(ApplicationFormFieldRequestBean::getFieldValue) + .findFirst(); + + if (amendmentFieldObj.isPresent() && amendmentFieldObj.get() instanceof String) { + amendmentFieldValue = (String) amendmentFieldObj.get(); + } + + } catch (JsonProcessingException e) { + log.error("Error parsing formFields JSON: {}", e.getMessage()); + return; + } + + if (amendmentFieldValue == null) { + log.warn("No matching field found in amendment for field ID {}", updatedFormField.getFieldId()); + return; + } + + List amendmentDocumentIds = Arrays.asList(amendmentFieldValue.split(",")); + for (ApplicationFormEntity applicationForm : applicationForms) { Optional formFieldEntityOptional = applicationFormFieldRepository .findByApplicationFormIdAndFieldId(applicationForm.getId(), updatedFormField.getFieldId()); if (formFieldEntityOptional.isPresent()) { ApplicationFormFieldEntity formEntity = formFieldEntityOptional.get(); - formEntity.setFieldValue(String.join(",", validDocumentIds)); + + // Retrieve existing document IDs in ApplicationFormFieldTable + String existingFieldValue = formEntity.getFieldValue(); + Set existingDocumentIds = existingFieldValue != null + ? new HashSet<>(Arrays.asList(existingFieldValue.split(","))) + : new HashSet<>(); + + // Remove amendment documents from existing document IDs + existingDocumentIds.removeAll(amendmentDocumentIds); + + // Add valid new document IDs from the request + existingDocumentIds.addAll(validDocumentIds); + + // Set the combined document IDs back as the field value + formEntity.setFieldValue(String.join(",", existingDocumentIds)); applicationFormFieldRepository.save(formEntity); + log.info("Updated field value for application ID {} and field ID {} with document IDs {}", - applicationAmendment.getApplicationId(), updatedFormField.getFieldId(), String.join(",", validDocumentIds)); + applicationAmendment.getApplicationId(), updatedFormField.getFieldId(), String.join(",", existingDocumentIds)); fieldUpdated = true; break; } } if (!fieldUpdated) { - throw new CustomValidationException(Status.NOT_FOUND,"No ApplicationFormField found for application ID {} and field ID {}. Skipping update."); + throw new CustomValidationException(Status.NOT_FOUND, + String.format("No ApplicationFormField found for application ID %s and field ID %s. Skipping update.", + applicationAmendment.getApplicationId(), updatedFormField.getFieldId())); } } else { log.warn("No valid document IDs found for update. Skipping field ID {}", updatedFormField.getFieldId()); @@ -503,6 +579,54 @@ public class ApplicationAmendmentRequestDao { } + private void updateFormFieldsJson(ApplicationAmendmentRequestEntity applicationAmendment, ApplicationFormFieldRequestBean updatedFormField) { + if (updatedFormField != null) { + try { + // Step 1: Fetch the existing form fields JSON + String existingFormFieldsJson = applicationAmendment.getFormFields(); + List formFieldsList; + + if (existingFormFieldsJson == null || existingFormFieldsJson.isEmpty()) { + formFieldsList = new ArrayList<>(); // If no existing data, start with an empty list + } else { + // Step 2: Deserialize the existing JSON into a list of objects + formFieldsList = new ObjectMapper().readValue(existingFormFieldsJson, new TypeReference>() { + }); + } + + // Step 3: Check if the field ID already exists in the list and update it + boolean fieldUpdated = false; + for (ApplicationFormFieldRequestBean field : formFieldsList) { + if (field.getFieldId().equals(updatedFormField.getFieldId())) { + field.setFieldValue(updatedFormField.getFieldValue()); // Update field value + fieldUpdated = true; + break; + } + } + + // If field wasn't updated, log a warning message instead of adding a new field + if (!fieldUpdated) { + log.warn("Field ID {} does not exist in the form fields for application amendment ID {}", updatedFormField.getFieldId(), applicationAmendment.getId()); + throw new CustomValidationException(Status.NOT_FOUND, "Field ID {} does not exist in the form fields for application amendment ID {}"); + + } + + // Step 4: Serialize the updated list back to JSON if the update was successful + String updatedFormFieldsJson = new ObjectMapper().writeValueAsString(formFieldsList); + applicationAmendment.setFormFields(updatedFormFieldsJson); // Update the form fields with the modified list + + log.info("Updated form fields JSON for application amendment ID {}: {}", applicationAmendment.getId(), updatedFormFieldsJson); + + } catch (JsonProcessingException e) { + log.error("Error processing JSON for form fields for application amendment ID {}: {}", applicationAmendment.getId(), e.getMessage()); + throw new CustomValidationException(Status.BAD_REQUEST, "Error processing JSON for form fields"); + } + } else { + log.warn("No form field data to update for application amendment ID {}", applicationAmendment.getId()); + throw new CustomValidationException(Status.NOT_FOUND, "No form field data to update for application amendment ID {}"); + } + } + public List getAllAmendmentRequestByBeneficiaryId(Long beneficiaryId) { UserEntity userEntity = userService.validateUser(beneficiaryId); @@ -513,8 +637,8 @@ public class ApplicationAmendmentRequestDao { .map(this::convertEntityToResponse) .collect(Collectors.toList()); } - - public ApplicationAmendmentRequestResponse closeAmendmentRequest(Long id, CloseAmendmentRequest closeAmendmentRequest){ + + public ApplicationAmendmentRequestResponse closeAmendmentRequest(Long id, CloseAmendmentRequest closeAmendmentRequest) { log.info("Closing application amendement with ID: {}", id); ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); @@ -540,37 +664,40 @@ public class ApplicationAmendmentRequestDao { return convertEntityToResponse(request); } - public List getAmendmentByApplicationId(HttpServletRequest request, Long applicationId,List statuses) { + public List getAmendmentByApplicationId(HttpServletRequest request, Long applicationId, List statuses) { log.info("Fetching the Amendment data from application id {}", applicationId); ApplicationEntity application = applicationService.validateApplication(applicationId); - List applicationAmendmentRequestEntity=applicationAmendmentRequestRepository.findByApplicationIdAndIsDeletedFalse(applicationId); - if(statuses!=null && !statuses.isEmpty()) { + List applicationAmendmentRequestEntity = applicationAmendmentRequestRepository.findByApplicationIdAndIsDeletedFalse(applicationId); + if (statuses != null && !statuses.isEmpty()) { List statusStrings = statuses.stream().map(Enum::name).collect(Collectors.toList()); - applicationAmendmentRequestEntity = applicationAmendmentRequestRepository.findByApplicationIdAndStatusInAndIsDeletedFalse(application.getId(), statusStrings); - } if(!applicationAmendmentRequestEntity.isEmpty()) { - ApplicationAmendmentRequestEntity applicationAmendmentRequest=applicationAmendmentRequestEntity.get(0); - Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(applicationAmendmentRequest.getApplicationEvaluationEntity().getId()); - if (entityOptional.isPresent()) { - if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { - validator.validatePreInstructor(request, entityOptional.get().getUserId()); - } else { - validator.validateUserId(request, entityOptional.get().getAssignedApplicationsEntity().getApplication().getUserId()); - } - }} - List response=new ArrayList<>(); - if(applicationAmendmentRequestEntity!=null) { - response= applicationAmendmentRequestEntity.stream() + applicationAmendmentRequestEntity = applicationAmendmentRequestRepository.findByApplicationIdAndStatusInAndIsDeletedFalse(application.getId(), statusStrings); + } + if (!applicationAmendmentRequestEntity.isEmpty()) { + ApplicationAmendmentRequestEntity applicationAmendmentRequest = applicationAmendmentRequestEntity.get(0); + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(applicationAmendmentRequest.getApplicationEvaluationEntity().getId()); + if (entityOptional.isPresent()) { + if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { + validator.validatePreInstructor(request, entityOptional.get().getUserId()); + } else { + validator.validateUserId(request, entityOptional.get().getAssignedApplicationsEntity().getApplication().getUserId()); + } + } + } + List response = new ArrayList<>(); + if (applicationAmendmentRequestEntity != null) { + response = applicationAmendmentRequestEntity.stream() .map(this::convertEntityToResponse) .collect(Collectors.toList()); } return response; } + public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus( - Long id,ApplicationAmendmentRequestEnum statusTypeEnum) { + Long id, ApplicationAmendmentRequestEnum statusTypeEnum) { log.info("Updating application amendement with status: {}", id); ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); - if(Boolean.TRUE.equals(existingApplicationAmendment.getStatus().equals(ApplicationAmendmentRequestEnum.AWAITING.getValue())) && Boolean.TRUE.equals(statusTypeEnum.equals(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED))){ + if (Boolean.TRUE.equals(existingApplicationAmendment.getStatus().equals(ApplicationAmendmentRequestEnum.AWAITING.getValue())) && Boolean.TRUE.equals(statusTypeEnum.equals(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED))) { existingApplicationAmendment.setStatus(ApplicationAmendmentRequestEnum.RESPONSE_RECEIVED.getValue()); existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); applicationAmendmentRequestRepository.save(existingApplicationAmendment); @@ -579,6 +706,7 @@ public class ApplicationAmendmentRequestDao { log.info("Amendment status updated successfully: {}", response); return response; } + public void sendReminderEmail(Long amendmentId) { ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(amendmentId) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, @@ -594,7 +722,7 @@ public class ApplicationAmendmentRequestDao { String subject = prepareSubject(emailTemplate, amendment, beneficiaryUser); String body = prepareBody(emailTemplate, amendment, beneficiaryUser); String email = beneficiaryUser.getEmail(); - if (Boolean.TRUE.equals(amendment.getIsEmail())&&email != null && !email.isEmpty()) { + if (Boolean.TRUE.equals(amendment.getIsEmail()) && email != null && !email.isEmpty()) { emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email)); } else { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.BENEFICIARY_EMAIL_NOT_FOUND_MSG)); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index cb1e14c3..716c1d11 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -25,14 +25,12 @@ import net.gepafin.tendermanagement.service.SystemEmailTemplatesService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.FieldValidator; -import net.gepafin.tendermanagement.util.MailUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -96,9 +94,6 @@ public class ApplicationDao { @Autowired private SystemEmailTemplatesService systemEmailTemplatesService; - @Autowired - private MailUtil mailUtil; - @Value("${default_System_Receiver_Email}") private String defaultSystemReceiverEmail; @@ -123,6 +118,9 @@ public class ApplicationDao { // @Value("${aws.s3.url.folder.signed.document}") // private String signedDocumentS3Folder; + @Value("${default.hub.uuid}") + private String defaultHubUuid; + @Autowired private UserService userService; @@ -141,6 +139,7 @@ public class ApplicationDao { @Autowired private FormDao formDao; + public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { FormEntity formEntity = formService.validateForm(formId); // callService.validatePublishedCall(formEntity.getCall().getId()); @@ -521,10 +520,63 @@ public class ApplicationDao { } else { List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationEntity.getId()); - for (ApplicationFormEntity applicationFormEntity : applicationFormEntities) { - FormEntity form = formService.validateForm(applicationFormEntity.getForm().getId()); - formEntities.add(form); - addFormApplication(form, applicationEntity, formApplicationResponses); + List sequencedApplicationFormEntity = new ArrayList<>(); + Long formIdMiddle = null; + List flowEdgesList = flowEdgesRepository.findBySourceIdAndCallId( + applicationEntity.getCall().getInitialForm(), applicationEntity.getCall().getId()); + + if (!flowEdgesList.isEmpty()) { + if (flowEdgesList.size() == 1) { + formIdMiddle = flowEdgesList.get(0).getTargetId(); + } else { + List nextFormIds = flowEdgesList.stream() + .map(FlowEdgesEntity::getTargetId) + .toList(); + + FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndCallId( + applicationEntity.getCall().getInitialForm(), applicationEntity.getCall().getId()); + + ApplicationFormFieldEntity applicationFormFieldEntity = applicationFormFieldRepository + .findByFieldIdAndApplicationFormFormIdAndApplicationFormApplicationId( + flowDataEntity.getChoosenField(), applicationEntity.getCall().getInitialForm(), applicationEntity.getId()) + .orElse(null); + + if (applicationFormFieldEntity != null) { + formIdMiddle = flowDataRepository.findByChoosenValueAndFormIdIn( + applicationFormFieldEntity.getFieldValue(), nextFormIds) + .map(FlowDataEntity::getFormId) + .orElse(null); + } + } + } + List applicationFormIds = new ArrayList<>(); + applicationFormIds.add(applicationEntity.getCall().getInitialForm()); + if (formIdMiddle != null && formIdMiddle > 0) { + applicationFormIds.add(formIdMiddle); + } + applicationFormIds.add(applicationEntity.getCall().getFinalForm()); + if (applicationFormEntities.size() == 3) { + for (Long applicationFormId : applicationFormIds) { + for (ApplicationFormEntity applicationFormEntity : applicationFormEntities) { + if (applicationFormEntity.getForm().getId().equals(applicationFormId)) { + sequencedApplicationFormEntity.add(applicationFormEntity); + FormEntity form = formService.validateForm(applicationFormId); + formEntities.add(form); + addFormApplication(form, applicationEntity, formApplicationResponses); + } + } + } + }else { + ApplicationFormEntity applicationFormEntity1=applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(),applicationEntity.getCall().getInitialForm()); + sequencedApplicationFormEntity.add(applicationFormEntity1); + FormEntity form1 = formService.validateForm(applicationFormEntity1.getForm().getId()); + formEntities.add(form1); + addFormApplication(form1, applicationEntity, formApplicationResponses); + ApplicationFormEntity applicationFormEntity2=applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(),applicationEntity.getCall().getFinalForm()); + sequencedApplicationFormEntity.add(applicationFormEntity2); + FormEntity form2= formService.validateForm(applicationFormEntity2.getForm().getId()); + formEntities.add(form2); + addFormApplication(form2, applicationEntity, formApplicationResponses); } } @@ -747,18 +799,18 @@ public class ApplicationDao { } emailNotificationDao.sendMail(hub.getId(), subject, body, List.of(email)); List recipientEmails = new ArrayList<>(); - recipientEmails.add(email); - String companyEmail = company.getEmail(); - String contactEmail = company.getContactEmail(); - - if (companyEmail != null && !companyEmail.isEmpty()) { - recipientEmails.add(companyEmail); - } - - if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { - recipientEmails.add(contactEmail); - } - emailNotificationDao.sendMail(hub.getId(), subject, body, recipientEmails); +// recipientEmails.add(email); + String companyEmail = company.getEmail(); + String contactEmail = company.getContactEmail(); + + if (companyEmail != null && !companyEmail.isEmpty()) { + recipientEmails.add(companyEmail); + } + + if (contactEmail != null && !contactEmail.isEmpty() && !contactEmail.equals(companyEmail)) { + recipientEmails.add(contactEmail); + } + emailNotificationDao.sendMail(hub.getId(), subject, body, recipientEmails); } private void sendMailTodefaultSystemAndGepafin(UserEntity userEntity, ApplicationEntity applicationEntity) { CallEntity call = applicationEntity.getCall(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 2f59aa0c..1cac5feb 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -11,7 +11,6 @@ import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.EmailConfig; import net.gepafin.tendermanagement.model.response.SystemEmailTemplateResponse; -import net.gepafin.tendermanagement.repositories.CallRepository; import net.gepafin.tendermanagement.repositories.HubRepository; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.HubService; @@ -20,7 +19,6 @@ import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.service.impl.EmailService; import net.gepafin.tendermanagement.service.impl.EmailServiceFactory; import net.gepafin.tendermanagement.util.DateTimeUtil; -import net.gepafin.tendermanagement.util.MailUtil; import net.gepafin.tendermanagement.util.Utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,9 +35,6 @@ public class EmailNotificationDao { private static final Logger log = LoggerFactory.getLogger(EmailNotificationDao.class); - @Autowired - private MailUtil mailUtil; - @Autowired private SystemEmailTemplatesService systemEmailTemplatesService; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentFormFieldResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentFormFieldResponse.java index d3fdda8f..5ace99f0 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentFormFieldResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentFormFieldResponse.java @@ -1,8 +1,10 @@ package net.gepafin.tendermanagement.model.response; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Data; @Data +@JsonIgnoreProperties(ignoreUnknown = true) public class AmendmentFormFieldResponse { private String fieldId; private String label; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java index be03d36b..76e445de 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java @@ -14,8 +14,8 @@ public class ApplicationAmendmentRequestResponse { private String note; private Long responseDays; private LocalDateTime startDate; - private boolean isSendNotification; - private boolean isSendEmail; + private Boolean isSendNotification; + private Boolean isSendEmail; private Long protocolNumber; private String callName; private String beneficiaryName; diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java index 9dd965e7..dad2d2ca 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/MailgunEmailService.java @@ -2,7 +2,10 @@ package net.gepafin.tendermanagement.service.impl; import net.gepafin.tendermanagement.model.request.EmailConfig; import net.gepafin.tendermanagement.service.feignClient.MailgunFeignClient; +import net.gepafin.tendermanagement.util.Validator; + import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; @@ -14,18 +17,31 @@ public class MailgunEmailService implements EmailService { @Autowired private MailgunFeignClient mailgunFeignClient; + + @Value("${isMailSendingEnabled}") + private String isEmailSendingEnabled; + + @Autowired + private Validator validator; @Override public void sendEmail(String subject, String body, List recipientEmails, EmailConfig emailConfig) { + + if (Boolean.FALSE.equals(Boolean.parseBoolean(isEmailSendingEnabled))) { + return; + } + String domain = emailConfig.getDomain(); String from = emailConfig.getSender(); String apiKey = emailConfig.getApiKey(); String authHeader = "Basic " + Base64.getEncoder().encodeToString(("api:" + apiKey).getBytes()); // Send email via Mailgun API - ResponseEntity response = mailgunFeignClient.sendEmail(domain, from, recipientEmails, subject, body, authHeader); - if (!response.getStatusCode().is2xxSuccessful()) { - throw new RuntimeException("Failed to send email via Mailgun: " + response.getStatusCode()); + if (Boolean.FALSE.equals(validator.isTestProfileActivated())) { + ResponseEntity response = mailgunFeignClient.sendEmail(domain, from, recipientEmails, subject, body, authHeader); + if (!response.getStatusCode().is2xxSuccessful()) { + throw new RuntimeException("Failed to send email via Mailgun: " + response.getStatusCode()); + } } } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java index f2cdc613..e7e1f0ea 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/PecEmailService.java @@ -4,7 +4,10 @@ import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.model.request.EmailConfig; import net.gepafin.tendermanagement.model.request.PecEmailRequest; import net.gepafin.tendermanagement.service.feignClient.PecFeignClient; +import net.gepafin.tendermanagement.util.Validator; + import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; @@ -19,9 +22,20 @@ public class PecEmailService implements EmailService { this.pecFeignClient = pecFeignClient; } + + @Value("${isMailSendingEnabled}") + private String isEmailSendingEnabled; + + @Autowired + private Validator validator; @Override public void sendEmail(String subject, String body, List recipientEmails, EmailConfig emailConfig) { + + if (Boolean.FALSE.equals(Boolean.parseBoolean(isEmailSendingEnabled))) { + return; + } + PecEmailRequest emailRequest = new PecEmailRequest(); emailRequest.setSender(emailConfig.getSender()); emailRequest.setRecipient(recipientEmails); @@ -31,10 +45,12 @@ public class PecEmailService implements EmailService { emailRequest.setPassword(emailConfig.getPassword()); String authToken = emailConfig.getAuthToken(); - ResponseEntity response = pecFeignClient.sendEmail("Bearer " + authToken, emailRequest); - log.info("Mail response status: {}, headers: {}, body: {}", response.getStatusCode(), response.getHeaders(), response.getBody()); - if (!response.getStatusCode().is2xxSuccessful()) { - throw new RuntimeException("Failed to send email via PEC: " + response.getStatusCode()); + if (Boolean.FALSE.equals(validator.isTestProfileActivated())) { + ResponseEntity response = pecFeignClient.sendEmail("Bearer " + authToken, emailRequest); + log.info("Mail response status: {}, headers: {}, body: {}", response.getStatusCode(), response.getHeaders(), response.getBody()); + if (!response.getStatusCode().is2xxSuccessful()) { + throw new RuntimeException("Failed to send email via PEC: " + response.getStatusCode()); + } } } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index f8375649..e0814305 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -151,6 +151,11 @@ public class Validator { String[] activeProfiles = environment.getActiveProfiles(); return Arrays.stream(activeProfiles).anyMatch("production"::equals); } + + public Boolean isTestProfileActivated() { + String[] activeProfiles = environment.getActiveProfiles(); + return Arrays.stream(activeProfiles).anyMatch("test"::equals); + } public UserEntity validatePreInstructor(HttpServletRequest request, Long preInstructorUserId) { UserEntity preInstructorUser = userService.validateUser(preInstructorUserId); diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index be007786..8c19671b 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -21,3 +21,4 @@ gepafin_email=bandi@pec.gepafin.it rinaldo_email=rinaldo.bonazzo@bflows.net carlo_email=carlo.mancosu@bflows.net default.hub.uuid=p4lk3bcx1RStqTaIVVbXs +# TEST DEPLOY Configuration 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 03134d0b..15dad70f 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 @@ -1720,11 +1720,16 @@ - - - - - - + + + + + + + + + + +