From 65943590553a6abbd82ac871294c06ba09c80fe0 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 12 Nov 2024 18:18:02 +0530 Subject: [PATCH] Done the changes related to get Amendment API for the ticket GEPAFINBE-85 --- .../dao/ApplicationAmendmentRequestDao.java | 192 +++++++++++++----- .../response/AmendmentFormFieldResponse.java | 2 + .../ApplicationAmendmentRequestResponse.java | 4 +- 3 files changed, 148 insertions(+), 50 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index b522354d..f2d1762c 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; @@ -194,7 +195,7 @@ public class ApplicationAmendmentRequestDao { 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; @@ -216,11 +217,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()); @@ -269,8 +276,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 +294,36 @@ 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"); + String formFieldsJson = applicationAmendmentRequestEntity.getFormFields(); + List formFields = Utils.convertJsonToList( + formFieldsJson, new TypeReference>() {}); - List matchingFields = getIdAndLabelFromResult(result).stream() - .filter(field -> storedFieldIds.contains(field.getFieldId())) - .collect(Collectors.toList()); - formFields.addAll(matchingFields); - } + + // 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()); + responseBean.setApplicationFormId(field.getApplicationFormId()); + responseBean.setId(field.getId()); + responseBean.setCreatedDate(field.getCreatedDate()); + responseBean.setUpdatedDate(field.getUpdatedDate()); - String[] documentIds = formFieldEntity.getFieldValue().split(","); - List documentResponseBeans = new ArrayList<>(); + // 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<>(); - for (String docId : documentIds) { + // 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 +337,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); @@ -416,6 +416,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 +480,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 +552,53 @@ 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); 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;