diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 3a160d09..b1704c6a 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -290,5 +290,7 @@ public class GepafinConstant { public static final String REMINDER_EMAIL_SENT_SUCCESS_MSG = "reminder.email.sent.success.msg"; public static final String ENCRYPT_INIT_VECTOR = "IG8*(*@&)*#biVVD"; public static final String ENCRYPT_KEY = "U2VjdXJlRW5jcnlwdEtleQ=="; + public static final String APPLICATION_DOCUMENTS_NOT_FOUND_MSG = "application.documents.not.found"; + public static final String DUPLICATE_BENEFICIARY_CALL = "beneficiary.call.duplicate"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index b522354d..d685796f 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); @@ -523,6 +647,16 @@ public class ApplicationAmendmentRequestDao { ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment); ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment); + + List amendmentRequests = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(existingApplicationAmendment.getApplicationEvaluationEntity().getId()); + boolean allClosed = amendmentRequests.stream() + .allMatch(amendment -> amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue())); + + if (allClosed) { + existingApplicationAmendment.getApplicationEvaluationEntity().setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue()); + applicationEvaluationRepository.save(existingApplicationAmendment.getApplicationEvaluationEntity()); + log.info("All amendments are closed. Application Evaluation status set to OPEN."); + } log.info("Application Amendment closed successfully: {}", response); return response; } @@ -540,37 +674,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 +716,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 +732,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 b0aabe3a..cf2e08c2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -4,12 +4,7 @@ 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.ApplicationSignedDocumentStatusEnum; -import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; -import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; -import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; -import net.gepafin.tendermanagement.enums.RoleStatusEnum; -import net.gepafin.tendermanagement.enums.UserCompanyDelegationStatusEnum; +import net.gepafin.tendermanagement.enums.*; import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; @@ -31,6 +26,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.h2.util.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -42,10 +38,15 @@ import org.springframework.web.multipart.MultipartFile; import jakarta.persistence.criteria.Predicate; import jakarta.servlet.http.HttpServletRequest; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.text.MessageFormat; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; @Component public class ApplicationDao { @@ -57,7 +58,8 @@ public class ApplicationDao { @Autowired private ApplicationRepository applicationRepository; - + @Autowired + private DocumentRepository documentRepository; @Autowired private ApplicationFormRepository applicationFormRepository; @@ -90,9 +92,13 @@ public class ApplicationDao { @Autowired private CompanyService companyService; + @Autowired + private S3PathConfig s3PathConfig; @Autowired private SystemEmailTemplatesService systemEmailTemplatesService; + @Autowired + private AssignedApplicationsRepository assignedApplicationsRepository; @Value("${default_System_Receiver_Email}") private String defaultSystemReceiverEmail; @@ -969,5 +975,91 @@ public class ApplicationDao { applicationEntity = saveApplicationEntity(applicationEntity); return getApplicationResponse(applicationEntity); } + public byte[] downloadApplicationDocumentsAsZip(HttpServletRequest request, Long applicationId) { + ApplicationEntity applicationEntity = validateApplication(applicationId); + validateAssignedUser(request, applicationId); + + Set documentIds = extractDocumentIdsFromApplicationForms(applicationId); + List documents = documentRepository.findAllByIdInAndIsDeletedFalse(documentIds); + + ApplicationSignedDocumentEntity signedDocument = applicationSignedDocumentRepository + .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); + if (documents.isEmpty() && signedDocument == null) { + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); + } + return createZipWithDocuments(applicationEntity, documents, signedDocument, applicationId); + } + private void validateAssignedUser(HttpServletRequest request, Long applicationId) { + AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository + .findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); + if (assignedApplications != null) { + validator.validatePreInstructor(request, assignedApplications.getUserId()); + } + } + + private Set extractDocumentIdsFromApplicationForms(Long applicationId) { + Set documentIds = new HashSet<>(); + List applicationForms = applicationFormRepository.findByApplicationId(applicationId); + + applicationForms.forEach(applicationForm -> { + FormEntity formEntity = applicationForm.getForm(); + if (formEntity != null) { + List contentResponseBeans = formDao.convertFormEntityToFormResponseBean(formEntity).getContent(); + contentResponseBeans.stream() + .filter(content -> "fileupload".equals(content.getName())) + .forEach(content -> { + Optional formField = applicationFormFieldRepository + .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + content.getId(), applicationForm.getId(), applicationId); + formField.ifPresent(field -> { + if (field.getFieldValue() != null) { + Arrays.stream(field.getFieldValue().split(",")) + .map(String::trim) + .map(Long::valueOf) + .forEach(documentIds::add); + } + }); + }); + } + }); + return documentIds; + } + + private void addDocumentToZip(ZipOutputStream zos, String s3Folder, String filePath, String fileName) { + try (InputStream fileInputStream = amazonS3Service.getFile(s3Folder, filePath)) { + zos.putNextEntry(new ZipEntry(fileName)); + IOUtils.copy(fileInputStream, zos); + zos.closeEntry(); + } catch (IOException e) { + throw new RuntimeException("Error downloading or adding document to ZIP: " + fileName, e); + } + } + + private byte[] createZipWithDocuments(ApplicationEntity applicationEntity, List documents, + ApplicationSignedDocumentEntity signedDocument, Long applicationId) { + try (ByteArrayOutputStream zipOutputStream = new ByteArrayOutputStream(); + ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) { + + String s3Folder = s3PathConfig.generateDocumentPath(DocumentSourceTypeEnum.APPLICATION, applicationEntity.getCall().getId(), applicationId); + + for (DocumentEntity document : documents) { + String fileName = Utils.extractFileName(document.getFilePath()); + addDocumentToZip(zos, s3Folder, document.getFilePath(), fileName); + } + + if (signedDocument != null) { + String signedDocS3Folder = s3PathConfig.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, applicationEntity.getCall().getId(), applicationId); + String signedDocFileName = signedDocument.getFileName(); + addDocumentToZip(zos, signedDocS3Folder, signedDocument.getFilePath(), signedDocFileName); + } + + zos.finish(); + return zipOutputStream.toByteArray(); + + } catch (IOException e) { + throw new RuntimeException("Error while creating ZIP file", e); + } + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 29d198fd..2bcbade9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1307,14 +1307,17 @@ public class ApplicationEvaluationDao { entity = applicationEvaluationRepository.save(existingEntity); assignedApplicationsRepository.save(assignedApplicationsEntity); - ApplicationAmendmentRequestEntity amendmentRequest = applicationAmendmentRequestRepository.findByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); - if(amendmentRequest!=null){ + List amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); + for (ApplicationAmendmentRequestEntity request : amendmentRequest) { + request.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue()); + } + applicationAmendmentRequestRepository.saveAll(amendmentRequest); if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.APPROVED.getValue())))) { - emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(amendmentRequest); + emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application); } if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.REJECTED.getValue())))) { - emailNotificationDao.sendInadmissibilityEmailForRejectedApplication(amendmentRequest); - }} + emailNotificationDao.sendInadmissibilityEmailForRejectedApplication(application,existingEntity); + } return convertToResponse(entity); } return null; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java index 285702f1..60f8ea20 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java @@ -10,6 +10,7 @@ import net.gepafin.tendermanagement.model.request.BeneficiaryPreferredCallReq; import net.gepafin.tendermanagement.model.response.BeneficiaryPreferredCallResponseBean; import net.gepafin.tendermanagement.repositories.BeneficiaryPreferredCallRepository; 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.slf4j.Logger; @@ -20,6 +21,7 @@ import org.springframework.stereotype.Component; import jakarta.servlet.http.HttpServletRequest; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; @@ -35,10 +37,19 @@ public class BeneficiaryPreferredCallDao { private Validator validator; - public BeneficiaryPreferredCallResponseBean createBeneficiaryPreferredCall(HttpServletRequest httpServletRequest, BeneficiaryPreferredCallReq request,UserEntity user) { + public BeneficiaryPreferredCallResponseBean createBeneficiaryPreferredCall(HttpServletRequest httpServletRequest, BeneficiaryPreferredCallReq request, UserEntity user) { log.info("Creating new beneficiary preferred call with details: {}", request); validator.validateUserWithCompany(httpServletRequest, request.getCompanyId()); - BeneficiaryPreferredCallEntity entity = convertRequestToEntity(request,user); + + Optional existingCall = beneficiaryPreferredCallRepository + .findByUserIdAndCallIdAndCompanyIdAndIsDeletedFalse(user.getId(), request.getCallId(), request.getCompanyId()); + + if (existingCall.isPresent()) { + log.warn("Duplicate beneficiary preferred call detected: {}", existingCall.get()); + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DUPLICATE_BENEFICIARY_CALL)); + } + + BeneficiaryPreferredCallEntity entity = convertRequestToEntity(request, user); entity = beneficiaryPreferredCallRepository.save(entity); log.info("Beneficiary preferred call created with ID: {}", entity.getId()); return convertEntityToResponse(entity); @@ -53,6 +64,7 @@ public class BeneficiaryPreferredCallDao { entity.setCallId(request.getCallId()); entity.setUserId(userEntity.getId()); entity.setCompanyId(request.getCompanyId()); + entity.setIsDeleted( false); return entity; } @@ -77,17 +89,18 @@ public class BeneficiaryPreferredCallDao { // } public void deleteBeneficiaryPreferredCallById(HttpServletRequest request, Long id) { - log.info("Deleting beneficiary preferred call with ID: {}", id); + log.info("Soft deleting beneficiary preferred call with ID: {}", id); BeneficiaryPreferredCallEntity entity = validateBeneficiaryPreferredCall(id); validator.validateUserId(request, entity.getUserId()); - beneficiaryPreferredCallRepository.deleteById(id); - log.info("Beneficiary preferred call deleted with ID: {}", id); + entity.setIsDeleted(true); + beneficiaryPreferredCallRepository.save(entity); + log.info("Beneficiary preferred call soft deleted with ID: {}", id); } public List getAllBeneficiaryPreferredCalls(HttpServletRequest request) { UserEntity userEntity = validator.validateUser(request); log.info("Fetching all beneficiary preferred calls"); - List calls = beneficiaryPreferredCallRepository.findByUserId(userEntity.getId()) + List calls = beneficiaryPreferredCallRepository.findByUserIdAndIsDeletedFalse(userEntity.getId()) .stream() .map(this::convertEntityToResponse) .collect(Collectors.toList()); @@ -97,7 +110,7 @@ public class BeneficiaryPreferredCallDao { private BeneficiaryPreferredCallEntity validateBeneficiaryPreferredCall(Long id) { log.info("Validating beneficiary preferred call with ID: {}", id); - return beneficiaryPreferredCallRepository.findById(id) + return beneficiaryPreferredCallRepository.findByIdAndIsDeletedFalse(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.BENEFICIARY_CALL_NOT_FOUND))); } @@ -123,7 +136,7 @@ public class BeneficiaryPreferredCallDao { } public List getBeneficiaryPreferredCallByUserId(UserEntity userEntity, Long companyId) { - List calls = beneficiaryPreferredCallRepository.findByUserIdAndCompanyId(userEntity.getId(), companyId); + List calls = beneficiaryPreferredCallRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userEntity.getId(), companyId); return calls.stream() .map(this::convertEntityToResponse) .collect(Collectors.toList()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 39736a57..fe692b69 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -7,18 +7,20 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; 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.Utils; +import net.gepafin.tendermanagement.util.Validator; import org.h2.util.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -26,16 +28,7 @@ import org.springframework.util.StringUtils; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.entities.CallEntity; -import net.gepafin.tendermanagement.entities.CallTargetAudienceChecklistEntity; -import net.gepafin.tendermanagement.entities.CriteriaFormFieldEntity; -import net.gepafin.tendermanagement.entities.DocumentEntity; -import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; -import net.gepafin.tendermanagement.entities.FaqEntity; -import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; -import net.gepafin.tendermanagement.entities.RegionEntity; -import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.CallStatusEnum; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; @@ -45,13 +38,6 @@ import net.gepafin.tendermanagement.model.request.EvaluationCriteriaReq; import net.gepafin.tendermanagement.model.request.FaqReq; import net.gepafin.tendermanagement.model.request.LookUpDataReq; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; -import net.gepafin.tendermanagement.repositories.CallRepository; -import net.gepafin.tendermanagement.repositories.CallTargetAudienceChecklistRepository; -import net.gepafin.tendermanagement.repositories.CriteriaFormFieldRepository; -import net.gepafin.tendermanagement.repositories.DocumentRepository; -import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; -import net.gepafin.tendermanagement.repositories.FaqRepository; -import net.gepafin.tendermanagement.repositories.RegionRepository; import net.gepafin.tendermanagement.service.impl.CallValidatorServiceImpl; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -104,6 +90,11 @@ public class CallDao { @Autowired private S3PathConfig s3PathConfig; + @Autowired + private BeneficiaryPreferredCallRepository beneficiaryPreferredCallRepository; + @Autowired + private Validator validator; + public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, UserEntity userEntity) { createCallRequest.setRegionId(userEntity.getRoleEntity().getRegion().getId()); @@ -435,12 +426,33 @@ public class CallDao { Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); } - public CallResponse getCallById(CallEntity callEntity) { - return getCallResponseBean(callEntity); + public CallResponse getCallById(HttpServletRequest request,UserEntity user, CallEntity callEntity, Long companyId) { + Long userId = user.getId(); + Long callId = callEntity.getId(); + + BeneficiaryPreferredCallEntity preferredCall; + if (companyId != null) { + validator.validateUserWithCompany(request, companyId); + preferredCall = beneficiaryPreferredCallRepository + .findByUserIdAndCallIdAndCompanyIdAndIsDeletedFalse(userId, callId, companyId) + .orElse(null); + } else { + preferredCall = beneficiaryPreferredCallRepository + .findByUserIdAndCallIdInAndIsDeletedFalse(userId, List.of(callId)) + .stream() + .findFirst() + .orElse(null); + } + + CallResponse callResponse = getCallResponseBean(callEntity); + callResponse.setPreferredCallId(preferredCall != null ? preferredCall.getId() : null); + + return callResponse; } + public CallResponse createCallStep2(CallEntity callEntity, CreateCallRequestStep2 createCallRequest, UserEntity user) { - validateUpdate(callEntity); +// validateUpdate(callEntity); setIfUpdated(callEntity::getThreshold, callEntity::setThreshold, createCallRequest.getThreshold()); callRepository.save(callEntity); convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity, LookUpDataTypeEnum.EVALUATION_CRITERIA); @@ -500,13 +512,6 @@ public class CallDao { } public CallResponse updateCallStep1(CallEntity callEntity, UpdateCallRequestStep1 updateCallRequest, UserEntity userEntity) { - if(Boolean.TRUE.equals(callEntity.getStatus().equals(CallStatusEnum.PUBLISH.getValue()))) { - try { - Utils.retainOnlySpecificFields(updateCallRequest, Collections.singletonList("faq")); - } catch (IllegalAccessException e) { - throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.FAILED_RETAIN_FIELD)); - } - } isValidDateRange(updateCallRequest, callEntity); setIfUpdated(callEntity::getName, callEntity::setName, updateCallRequest.getName()); setIfUpdated(callEntity::getDescriptionShort, callEntity::setDescriptionShort, @@ -651,18 +656,60 @@ public class CallDao { return createCallResponseBean; } - public List getAllCalls(UserEntity user) { - String type=user.getRoleEntity().getRoleType(); - List callStatusList =CallStatusEnum.getStatusValues(); + public List getAllCalls(HttpServletRequest request,UserEntity user, Long companyId) { + String type = user.getRoleEntity().getRoleType(); + List callStatusList = CallStatusEnum.getStatusValues(); if (Boolean.FALSE.equals(ROLE_SUPER_ADMIN.getValue().equals(type))) { callStatusList = List.of(CallStatusEnum.PUBLISH.getValue()); } List calls = callRepository.findByStatusInAndHubId(callStatusList, user.getHub().getId()); + List callIds = calls.stream().map(CallEntity::getId).collect(Collectors.toList()); + Map preferredCallsMap = + getBeneficiaryPreferredCallsForUser(request,user, callIds, companyId); + return calls.stream() - .map(this::convertToCallDetailsResponseBean) + .map(call -> { + CallDetailsResponseBean responseBean = convertToCallDetailsResponseBean(call); + String key = user.getId() + "_" + call.getId(); + BeneficiaryPreferredCallEntity preferredCall = preferredCallsMap.get(key); + Long preferredId = (preferredCall != null && !preferredCall.getIsDeleted()) ? preferredCall.getId() : null; + responseBean.setPreferredCallId(preferredId); + + return responseBean; + }) .collect(Collectors.toList()); } + public Map getBeneficiaryPreferredCallsForUser(HttpServletRequest request, UserEntity user, List callIds, Long companyId) { + List beneficiaryPreferredCalls; + + if (companyId != null) { + validator.validateUserWithCompany(request, companyId); + beneficiaryPreferredCalls = beneficiaryPreferredCallRepository + .findByUserIdAndCallIdInAndCompanyIdAndIsDeletedFalse(user.getId(), callIds, companyId); + } else { + beneficiaryPreferredCalls = beneficiaryPreferredCallRepository + .findByUserIdAndCallIdInAndIsDeletedFalse(user.getId(), callIds); + beneficiaryPreferredCalls = beneficiaryPreferredCalls.stream() + .collect(Collectors.collectingAndThen( + Collectors.toMap( + BeneficiaryPreferredCallEntity::getCallId, + call -> call, + (existing, replacement) -> existing + ), + map -> new ArrayList<>(map.values()) + )); + + } + + return beneficiaryPreferredCalls.stream() + .collect(Collectors.toMap( + call -> user.getId() + "_" + call.getCallId(), + call -> call + )); + } + + public CallResponse validateCallData(CallEntity callEntity) { validateUpdate(callEntity); CallResponse callResponseBean = getCallResponseBean(callEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index 2d84b831..6f8e3243 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -97,7 +97,7 @@ public class DocumentDao { private Long resolveSourceId(Long sourceId, DocumentSourceTypeEnum sourceType) { if (sourceType == DocumentSourceTypeEnum.CALL) { CallEntity callEntity = callService.validateCall(sourceId); - callDao.validateUpdate(callEntity); +// callDao.validateUpdate(callEntity); return callEntity.getId(); } // else if (sourceType == SourceTypeEnum.APPLICATION) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index 1cac5feb..ae19c380 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -4,11 +4,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; -import net.gepafin.tendermanagement.entities.ApplicationEntity; -import net.gepafin.tendermanagement.entities.HubEntity; -import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity; -import net.gepafin.tendermanagement.entities.UserEntity; + import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.model.request.EmailConfig; import net.gepafin.tendermanagement.model.response.SystemEmailTemplateResponse; import net.gepafin.tendermanagement.repositories.HubRepository; @@ -53,11 +49,9 @@ public class EmailNotificationDao { @Autowired HubRepository hubRepository; - - private void sendEmail(ApplicationAmendmentRequestEntity amendmentRequest, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum templateType, + private void sendEmail(ApplicationEntity applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum templateType, Map bodyPlaceholders, List additionalRecipients) { - ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); HubEntity hubEntity = hubService.valdateHub(applicationEntity.getHubId()); String service = determineService(applicationEntity.getHubId()); String legalMail = service.equals("Gepafin S.p.a.") ? "bandi.gepafin@legalmail.it" : "bandi.sviluppumbria@legalmail.it"; @@ -131,7 +125,7 @@ public class EmailNotificationDao { log.error("Failed to parse form fields JSON: ", e); } bodyPlaceholders.put("{{note}}", applicationAmendmentRequest.getNote()); - sendEmail(applicationAmendmentRequest, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, bodyPlaceholders, null); + sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, bodyPlaceholders, null); } public void sendApplicationFailureNotificationEmail(ApplicationAmendmentRequestEntity amendmentRequest) { @@ -141,32 +135,28 @@ public class EmailNotificationDao { bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); bodyPlaceholders.put("{{date_time_emailSend}}", DateTimeUtil.formatLocalDateTime(amendmentRequest.getCreatedDate(), GepafinConstant.DD_MM_YYYY_HH_MM)); - sendEmail(amendmentRequest, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, bodyPlaceholders, null); + sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, bodyPlaceholders, null); } - public void sendAdmissibilityNotificationEmailForApprovedApplication(ApplicationAmendmentRequestEntity amendmentRequest) { - - ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); + public void sendAdmissibilityNotificationEmailForApprovedApplication(ApplicationEntity applicationEntity) { Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - bodyPlaceholders.put("{{protocol_number}}", amendmentRequest.getProtocol().getProtocolNumber().toString()); - bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(amendmentRequest.getProtocol().getCreatedDate())); - bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(amendmentRequest.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); + bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); + bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); + bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); - sendEmail(amendmentRequest, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, bodyPlaceholders, null); + sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, bodyPlaceholders, null); } - public void sendInadmissibilityEmailForRejectedApplication(ApplicationAmendmentRequestEntity amendmentRequest) { - - ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); + public void sendInadmissibilityEmailForRejectedApplication(ApplicationEntity applicationEntity,ApplicationEvaluationEntity applicationEvaluationEntity) { Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - bodyPlaceholders.put("{{protocol_number}}", amendmentRequest.getProtocol().getProtocolNumber().toString()); - bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(amendmentRequest.getProtocol().getCreatedDate())); - bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(amendmentRequest.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); - bodyPlaceholders.put("{{form_text}}", amendmentRequest.getNote()); + bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); + bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(applicationEntity.getProtocol().getCreatedDate())); + bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); + bodyPlaceholders.put("{{form_text}}", applicationEvaluationEntity.getNote()); - sendEmail(amendmentRequest, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, bodyPlaceholders, null); + sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, bodyPlaceholders, null); } public void sendMail(Long hubId, String subject, String body, List recipientEmails) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java index 2fbf0943..b4db5ff5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java @@ -72,7 +72,7 @@ public class FlowDao { } public void checkIfFlowExits(CallEntity call) { - callDao.validateUpdate(call); +// callDao.validateUpdate(call); List flowDataEntities = flowDataRepository.findByCallId(call.getId()); List flowEdgesEntities = flowEdgesRepository.findByCallId(call.getId()); if (Boolean.FALSE.equals(flowDataEntities.isEmpty()) || Boolean.FALSE.equals(flowEdgesEntities.isEmpty())) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 9639e2a9..c315cfe6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -173,7 +173,7 @@ public class FormDao { String choosenField=null; FormEntity formEntity = validateForm(formId); validator.validateUserWithCall(user, formEntity.getCall().getId()); - callDao.validateUpdate(formEntity.getCall()); +// callDao.validateUpdate(formEntity.getCall()); List contentRequestBean = Utils.convertJsonStringToList(formEntity.getContent(), ContentRequestBean.class); for (ContentRequestBean contentRequestBean1 : contentRequestBean) { FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndChoosenField(formEntity.getId(), contentRequestBean1.getId()); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryPreferredCallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryPreferredCallEntity.java index 83fbcc95..7a30c267 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryPreferredCallEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryPreferredCallEntity.java @@ -34,4 +34,6 @@ public class BeneficiaryPreferredCallEntity extends BaseEntity{ @Column(name = "STATUS", length = 255) private String status; + @Column(name="IS_DELETED") + private Boolean isDeleted; } 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/model/response/CallDetailsResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java index 6338949e..4028b789 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java @@ -54,4 +54,5 @@ public class CallDetailsResponseBean { private LocalDateTime updatedDate; + private Long preferredCallId; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java index b26460ab..43655e9c 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java @@ -73,6 +73,7 @@ public class CallResponse { private String currentStep; + private Long preferredCallId; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 88561517..57331e43 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -23,6 +23,11 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository findAllByApplicationEvaluationIdAndIsDeletedFalse(Long id); + // ApplicationAmendmentRequestEntity findByApplicationIdAndIsDeletedFalse(Long applicationId); List findByApplicationIdAndIsDeletedFalse(Long applicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryPreferredCallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryPreferredCallRepository.java index dd8d341e..1101d1a6 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryPreferredCallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryPreferredCallRepository.java @@ -6,13 +6,19 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; +import java.util.Optional; @Repository public interface BeneficiaryPreferredCallRepository extends JpaRepository { - List findByBeneficiaryId(Long beneficiaryId); - List findByUserId(Long userId); + List findByBeneficiaryIdAndIsDeletedFalse(Long beneficiaryId); + List findByUserIdAndIsDeletedFalse(Long userId); @Query("SELECT preferredCall FROM BeneficiaryPreferredCallEntity preferredCall where preferredCall.userId=:userId AND (:companyId is null OR preferredCall.companyId=:companyId)") - List findByUserIdAndCompanyId(@Param("userId") Long userId, @Param("companyId") Long companyId); + List findByUserIdAndCompanyIdAndIsDeletedFalse(@Param("userId") Long userId, @Param("companyId") Long companyId); List findByBeneficiaryIdAndCompanyId(Long beneficiaryId,Long companyId); + List findByUserIdAndCallIdInAndIsDeletedFalse(Long userId, List callIds); + + Optional findByIdAndIsDeletedFalse(Long id); + Optional findByUserIdAndCallIdAndCompanyIdAndIsDeletedFalse(Long userId, Long callId, Long companyId); + List findByUserIdAndCallIdInAndCompanyIdAndIsDeletedFalse(Long userId, List callIds,Long companyId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index d3eb3058..684e2a3b 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -3,6 +3,7 @@ import net.gepafin.tendermanagement.entities.DocumentEntity; import java.util.List; import java.util.Optional; +import java.util.Set; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -27,5 +28,6 @@ public interface DocumentRepository extends JpaRepository @Query("SELECT d FROM DocumentEntity d WHERE d.isDeleted = false") List findAllByIsDeleteFalse(); + List findAllByIdInAndIsDeletedFalse(Set documentIds); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index 9ef06c48..3ab94ae2 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -41,5 +41,5 @@ public interface ApplicationService { public void deleteSignedDocument(HttpServletRequest request, Long applicationId); public ApplicationResponse validateApplication(HttpServletRequest request, Long applicationId); - + byte[] downloadApplicationDocumentsAsZip(HttpServletRequest request, Long applicationId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 92a62f02..c40457de 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -19,9 +19,9 @@ public interface CallService { CallResponse updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest); - CallResponse getCallById (HttpServletRequest request, Long callId); + CallResponse getCallById (HttpServletRequest request, Long callId,Long companyId); - List getAllCalls(HttpServletRequest request); + List getAllCalls(HttpServletRequest request,Long companyId); CallResponse validateCallData(HttpServletRequest request, Long callId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index 886b91c1..0fec17a7 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -116,6 +116,10 @@ public class ApplicationServiceImpl implements ApplicationService { public ApplicationResponse validateApplication(HttpServletRequest request, Long applicationId) { return applicationDao.validateApplication(request, applicationId); } - + @Override + @Transactional(readOnly = true) + public byte[] downloadApplicationDocumentsAsZip(HttpServletRequest request, Long applicationId) { + return applicationDao.downloadApplicationDocumentsAsZip(request,applicationId); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index 8004008b..c5839bbc 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -54,17 +54,17 @@ public class CallServiceImpl implements CallService { } @Override @Transactional(readOnly = true) - public CallResponse getCallById(HttpServletRequest request, Long callId) { + public CallResponse getCallById(HttpServletRequest request, Long callId,Long companyId) { UserEntity user = validator.validateUser(request); CallEntity call = validator.validateUserWithCall(user, callId); - return callDao.getCallById(call); + return callDao.getCallById(request,user,call,companyId); } @Override @Transactional(readOnly = true) - public List getAllCalls(HttpServletRequest request) { + public List getAllCalls(HttpServletRequest request,Long companyId) { UserEntity user = validator.validateUser(request); - return callDao.getAllCalls(user); + return callDao.getAllCalls(request,user,companyId); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index 700bf353..d37c004e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -200,6 +200,18 @@ public interface ApplicationApi { ResponseEntity> validateApplication(HttpServletRequest request, @Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId); - + @Operation(summary = "Api to download all the File inserted by beneficiary in a ZIP file", + 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 = "/{applicationId}/documents/zip") + ResponseEntity downloadApplicationDocumentsAsZip(HttpServletRequest httpServletRequest, + @Parameter(required = true) @PathVariable("applicationId") Long applicationId); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index c4539e31..00a3e190 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -74,7 +74,7 @@ public interface CallApi { public ResponseEntity> updateCallStep1(HttpServletRequest request, @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId, @Parameter(description = "Call request object", required = true) @Valid @RequestBody UpdateCallRequestStep1 updateCallRequest); - @Operation(summary = "Api to get call by id updated today to check the bug", + @Operation(summary = "Api to get call by id", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -86,7 +86,7 @@ public interface CallApi { @GetMapping(value = "/{callId}", produces = { "application/json" }) ResponseEntity> getCallById(HttpServletRequest request, - @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); + @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId,@RequestParam(value = "companyId", required = false) Long companyId); @Operation(summary = "Api to get all calls", @@ -100,7 +100,7 @@ public interface CallApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "", produces = { "application/json" }) - ResponseEntity>> getAllCalls(HttpServletRequest request); + ResponseEntity>> getAllCalls(HttpServletRequest request,@RequestParam(value = "companyId", required = false) Long companyId); @Operation(summary = "Api to validate call", diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java index 27ea0bb7..958d8096 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java @@ -148,5 +148,21 @@ public class ApplicationApiController implements ApplicationApi { return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_STATUS_UPDATED_SUCCESSFULLY))); } + @Override + public ResponseEntity downloadApplicationDocumentsAsZip(HttpServletRequest request, Long applicationId) { + byte[] zipFile = applicationService.downloadApplicationDocumentsAsZip(request, applicationId); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + headers.setContentDispositionFormData("attachment", "documents.zip"); + + if (zipFile == null || zipFile.length == 0) { + String notFoundMessage = Translator.toLocale(GepafinConstant.APPLICATION_DOCUMENTS_NOT_FOUND_MSG); + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(notFoundMessage.getBytes()); + } + + return new ResponseEntity<>(zipFile, headers, HttpStatus.OK); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 69154098..32c89055 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -59,16 +59,16 @@ public class CallApiController implements CallApi { } @Override @Transactional(readOnly = true) - public ResponseEntity> getCallById(HttpServletRequest request, Long callId) { - CallResponse createCallResponseBean = callService.getCallById(request, callId); + public ResponseEntity> getCallById(HttpServletRequest request, Long callId,Long companyId) { + CallResponse createCallResponseBean = callService.getCallById(request, callId,companyId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); } @Override @Transactional(readOnly = true) - public ResponseEntity>> getAllCalls(HttpServletRequest request) { - List calls = callService.getAllCalls(request); + public ResponseEntity>> getAllCalls(HttpServletRequest request,Long companyId) { + List calls = callService.getAllCalls(request,companyId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(calls, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 9aa2ec42..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,4 +1720,16 @@ + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 220d4654..69c7410a 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -306,3 +306,5 @@ comment.not.associate.with.amendment = Comment Not Associated with Amendment Req amendment.found.success = Amendment Request Found Successfully. invalid.amendment.for.comment = Invalid Amendment Request for the Given Comment. DD_MM_YYYY_HH_MM = dd_MM_yyyy HH:mm +application.documents.not.found=No documents found for the application. +beneficiary.call.duplicate = A preferred call with this call ID and company ID already exists for this user. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index ea702497..e1cb500d 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -299,5 +299,7 @@ amendment.found.success = Richiesta di emendamento trovata con successo. invalid.amendment.for.comment = Richiesta di emendamento non valida per il commento fornito. DD_MM_YYYY_HH_MM = dd_MM_yyyy HH:mm create.application.data.amendment.msg =Emendamento alla domanda inviato con successo -beneficiary.email.not.found.msg=L'indirizzo email per il beneficiario non è stato trovato. Si prega di assicurarsi che il beneficiario abbia un indirizzo email valido. +beneficiary.email.not.found.msg=L'indirizzo email per il beneficiario non � stato trovato. Si prega di assicurarsi che il beneficiario abbia un indirizzo email valido. reminder.email.sent.success.msg=Email di promemoria inviata con successo! +application.documents.not.found=Nessun documento trovato per la domanda. +beneficiary.call.duplicate = Una chiamata preferita con questo ID di chiamata e ID azienda esiste gi� per questo utente.