diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 3ac34c8e..f44a0257 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -108,6 +108,9 @@ public class ApplicationAmendmentRequestDao { @Autowired private ApplicationEvaluationDao applicationEvaluationDao; + @Autowired + private DocumentRepository documentRepository; + public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(Long applicationEvaluationId) { log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); @@ -330,15 +333,24 @@ public class ApplicationAmendmentRequestDao { return applicationAmendment; } + private void setAmendmentDocuments(String amendmentNotes, String amendmentFieldRequest, + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity) { + AmendmentDetailsResponseBean amendmentDetails = new AmendmentDetailsResponseBean(); + if (amendmentFieldRequest != null && !amendmentFieldRequest.trim().isEmpty()) { + String[] documentIds = amendmentFieldRequest.split(","); + String validDocumentIds = Arrays.stream(documentIds) + .map(String::trim) + .filter(id -> !id.isEmpty()) + .collect(Collectors.joining(",")); - private void setAmendmentDocuments(List amendmentFieldRequest, ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity) { - amendmentFieldRequest.stream().forEach(amendmentData->{ - String fieldValue=amendmentData.getFileValue(); - if(fieldValue!=null){ - documentService.validateDocument(Long.valueOf(fieldValue)); - } - }); - applicationAmendmentRequestEntity.setAmendmentDocument(Utils.convertListToJsonString(amendmentFieldRequest)); + amendmentDetails.setAmendmentDocuments(validDocumentIds); + } + if (amendmentNotes != null && !amendmentNotes.trim().isEmpty()) { + amendmentDetails.setAmendmentNotes(amendmentNotes.trim()); + } + amendmentDetails.setValid(null); + String amendmentDetailsJson = Utils.convertListToJsonString(Collections.singletonList(amendmentDetails)); + applicationAmendmentRequestEntity.setAmendmentDocument(amendmentDetailsJson); } public ApplicationAmendmentRequestEntity saveApplicationAmendmentRequestEntity(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity,ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity,VersionActionTypeEnum actionTypeEnum) { @@ -355,39 +367,70 @@ public class ApplicationAmendmentRequestDao { List forms = applicationFormRepository.findByApplicationId(applicationAmendmentRequestEntity.getApplicationId()); Map fieldIdToLabelMap = extractFieldIdToLabelMap(forms); - List amendmentFieldRequests= new ArrayList<>(); +// List amendmentFieldRequests= new ArrayList<>(); List amendmentFormFields = Utils.convertJsonStringToList( applicationAmendmentRequestEntity.getFormFields(), AmendmentFormField.class); Map formFieldEntityMap = getApplicationFormFieldEntityMap(applicationAmendmentRequestEntity, amendmentFormFields); - if(applicationAmendmentRequestEntity.getAmendmentDocument() !=null ){ - amendmentFieldRequests = Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(),AmendmentFieldRequest.class); - } - if (amendmentFieldRequests != null) { - List amendmentDocumentResponses = amendmentFieldRequests.stream() - .map(this::createAmendmentDocumentResponse) - .toList(); - response.setAmendmentDocuments(amendmentDocumentResponses); + if (applicationAmendmentRequestEntity.getAmendmentDocument() != null) { + + List amendmentDetailsList = + Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(), + AmendmentDetailsResponseBean.class); + List documentResponseBeans = new ArrayList<>(); + for (AmendmentDetailsResponseBean amendmentDetails:amendmentDetailsList) { + if (amendmentDetails.getAmendmentDocuments()!=null) { + // Extract the comma-separated document IDs as a string + String documentIdsString = amendmentDetails.getAmendmentDocuments(); + + if (documentIdsString != null && !documentIdsString.trim().isEmpty()) { + // Split the comma-separated values and process them + List documentIds = Arrays.stream(documentIdsString.split(",")) + .map(String::trim) + .filter(id -> !id.isEmpty()) + .collect(Collectors.toList()); + + documentResponseBeans.addAll( + documentIds.stream() + .map(id -> { + try { + return createDocumentResponseBean(id); // Convert to Long + } catch (NumberFormatException e) { + // Handle invalid document IDs gracefully + return null; + } + }) + .filter(Objects::nonNull) // Skip null responses + .collect(Collectors.toList()) + ); + response.setAmendmentNotes(amendmentDetails.getAmendmentNotes()); + response.setValid(amendmentDetails.getValid()!=null?amendmentDetails.getValid():null); + } + } + + } + + response.setAmendmentDocuments(documentResponseBeans); + + } + + processFormFields(amendmentFormFields, fieldIdToLabelMap, formFieldEntityMap, response); return response; } - public AmendmentDocumentResponse createAmendmentDocumentResponse(AmendmentFieldRequest amendmentFieldRequest) { - AmendmentDocumentResponse amendmentDocumentResponse = new AmendmentDocumentResponse(); - amendmentDocumentResponse.setFieldId(amendmentFieldRequest.getFieldId()); - amendmentDocumentResponse.setNameValue(amendmentFieldRequest.getNameValue()); - amendmentDocumentResponse.setValid(amendmentFieldRequest.getValid()); - amendmentDocumentResponse.setFileValue(null); - if(amendmentFieldRequest.getFileValue()!=null) { - DocumentEntity documentEntity = documentService.validateDocument(Long.valueOf(amendmentFieldRequest.getFileValue())); - DocumentResponseBean responseBean = applicationEvaluationDao.createDocumentResponseBean(documentEntity); - amendmentDocumentResponse.setFileValue(List.of(responseBean)); - } + public DocumentResponseBean createDocumentResponseBean(String documentId) { - return amendmentDocumentResponse; + if (!StringUtils.isEmpty(documentId)) { + Optional documentEntity = documentRepository.findByIdAndNotDeleted(Long.valueOf(documentId)); + if(documentEntity.isPresent()){ + return applicationEvaluationDao.createDocumentResponseBean(documentEntity.get()); + }} + return null; } + private ApplicationAmendmentRequestResponse initializeBasicResponse(ApplicationAmendmentRequestEntity entity) { ApplicationAmendmentRequestResponse response = new ApplicationAmendmentRequestResponse(); response.setId(entity.getId()); @@ -581,7 +624,7 @@ public class ApplicationAmendmentRequestDao { } existingApplicationAmendment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); if(updateRequest.getAmendmentDocuments()!=null && Boolean.FALSE.equals(updateRequest.getAmendmentDocuments().isEmpty())) { - setAmendmentDocuments(updateRequest.getAmendmentDocuments(), existingApplicationAmendment); + setAmendmentDocuments(updateRequest.getAmendmentNotes(),updateRequest.getAmendmentDocuments(), existingApplicationAmendment); } ApplicationAmendmentRequestEntity updatedApplicationAmendment = saveApplicationAmendmentRequestEntity(existingApplicationAmendment,oldApplicationAmendmentEntity,VersionActionTypeEnum.UPDATE); ApplicationAmendmentRequestResponse response = convertEntityToResponse(updatedApplicationAmendment); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 9d7a6daa..244c30fa 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -157,12 +157,21 @@ public class ApplicationEvaluationDao { amendmentDocumentResponseBean.setAmendmentId(applicationAmendmentRequestEntity.getId()); String amendmentDocument=applicationAmendmentRequestEntity.getAmendmentDocument(); String formField=applicationAmendmentRequestEntity.getFormFields(); - if (Boolean.FALSE.equals(StringUtils.isEmpty(amendmentDocument))) { - List amendmentFieldRequests=Utils.convertJsonStringToList(amendmentDocument,AmendmentFieldRequest.class); - List amendmentDocumentResponses = amendmentFieldRequests.stream() - .map(applicationAmendmentRequestDao::createAmendmentDocumentResponse) - .toList(); - amendmentDocumentResponseBean.setAmendmentDocuments(amendmentDocumentResponses); + List amendmentDetailsList = Utils.convertJsonStringToList(amendmentDocument, AmendmentDetailsResponseBean.class); + if (amendmentDetailsList != null && !amendmentDetailsList.isEmpty()) { + AmendmentDetailsResponseBean amendmentDetails = amendmentDetailsList.get(0); + if (amendmentDetails.getAmendmentDocuments() != null) { + List documentResponseBeans = Arrays.stream(amendmentDetails.getAmendmentDocuments().split(",")) + .map(String::trim) + .filter(id -> !id.isEmpty()) + .map(documentId -> applicationAmendmentRequestDao.createDocumentResponseBean(documentId)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + amendmentDocumentResponseBean.setAmendmentDocuments(documentResponseBeans); + } + amendmentDocumentResponseBean.setAmendmentNotes(amendmentDetails.getAmendmentNotes()); + amendmentDocumentResponseBean.setValid(amendmentDetails.getValid()); } List amendmentFormFields=Utils.convertJsonStringToList(formField,AmendmentFormField.class); amendmentDocumentResponseBean.setFormFieldDocuments(setFormFieldDocuments(amendmentFormFields)); @@ -657,39 +666,69 @@ public class ApplicationEvaluationDao { // Process amendment documents if present if (applicationAmendmentRequestEntity.getAmendmentDocument() != null) { - // Parse existing amendment fields from JSON - List existingAmendmentFields = - Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(), AmendmentFieldRequest.class); + String existingDocumentIds = applicationAmendmentRequestEntity.getAmendmentDocument(); - // Prepare a new list to hold updated amendment fields - List updatedAmendmentFields = new ArrayList<>(); + // Split comma-separated document IDs into a list + List existingDocumentIdList = Arrays.stream(existingDocumentIds.split(",")) + .map(String::trim) + .filter(id -> !id.isEmpty()) + .collect(Collectors.toList()); - // Map amendment details for quick lookup by amendment ID - Map> amendmentDetailsMap = amendmentFormFields.stream() + List updatedDocumentIdList = new ArrayList<>(); + Map amendmentDetailsMap = amendmentFormFields.stream() .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) - .collect(Collectors.toMap(AmendmentDetailsRequest::getAmendmentId, AmendmentDetailsRequest::getAmendmentDocuments)); + .collect(Collectors.toMap( + AmendmentDetailsRequest::getAmendmentId, + AmendmentDetailsRequest::getAmendmentDocuments + )); - // Get corresponding amendment documents for the current entity - List amendmentDocuments = amendmentDetailsMap.get(applicationAmendmentRequestEntity.getId()); - if (amendmentDocuments != null) { - // Update existing amendment fields with new values - for (AmendmentFieldRequest existingField : existingAmendmentFields) { - for (AmendmentFieldRequest newField : amendmentDocuments) { - if (existingField.getFieldId().equals(newField.getFieldId())) { - // Update fields if there are changes - Utils.setIfUpdated(existingField::getValid, existingField::setValid, newField.getValid()); - Utils.setIfUpdated(existingField::getFileValue, existingField::setFileValue, newField.getFileValue()); - Utils.setIfUpdated(existingField::getNameValue, existingField::setNameValue, newField.getNameValue()); + String amendmentDocumentIds = amendmentDetailsMap.get(applicationAmendmentRequestEntity.getId()); + if (amendmentDocumentIds != null) { + // Split and validate new document IDs + List newDocumentIdList = Arrays.stream(amendmentDocumentIds.split(",")) + .map(String::trim) + .filter(id -> !id.isEmpty()) + .collect(Collectors.toList()); - updatedAmendmentFields.add(existingField); - break; // Move to the next existing field + for (String existingId : existingDocumentIdList) { + for (String newId : newDocumentIdList) { + if (existingId.equals(newId)) { + Optional documentEntity = documentRepository.findByIdAndNotDeleted(Long.valueOf(newId)); + if(documentEntity.isPresent()) { + updatedDocumentIdList.add(newId); + break; + } } } } - // Convert updated fields back to JSON and save to the database - applicationAmendmentRequestEntity.setAmendmentDocument(Utils.convertListToJsonString(updatedAmendmentFields)); - applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); + // Add any new IDs not in the existing list + for (String newId : newDocumentIdList) { + if (!existingDocumentIdList.contains(newId)) { + Optional documentEntity = documentRepository.findByIdAndNotDeleted(Long.valueOf(newId)); + if(documentEntity.isPresent()) { + updatedDocumentIdList.add(newId); + } + } + } + String updatedDocumentIds = String.join(",", updatedDocumentIdList); + + // Create the AmendmentDetailsResponseBean for structured data + AmendmentDetailsResponseBean amendmentDetails = new AmendmentDetailsResponseBean(); + amendmentDetails.setAmendmentDocuments(updatedDocumentIds); + AmendmentDetailsRequest amendmentDetailsRequest = amendmentFormFields.stream() + .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) + .findFirst() + .orElse(null); + + if (amendmentDetailsRequest != null) { + amendmentDetails.setValid(amendmentDetailsRequest.getValid()); + } else { + amendmentDetails.setValid(false); + } + String amendmentDetailsJson = Utils.convertListToJsonString(Collections.singletonList(amendmentDetails)); + applicationAmendmentRequestEntity.setAmendmentDocument(amendmentDetailsJson); + applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); } } } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java index 691a5a20..dd44d257 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java @@ -1,8 +1,6 @@ package net.gepafin.tendermanagement.model.request; import lombok.Data; -import net.gepafin.tendermanagement.model.response.AmendmentDocumentResponse; -import net.gepafin.tendermanagement.model.response.FieldResponse; import java.util.List; @@ -11,7 +9,9 @@ public class AmendmentDetailsRequest { Long amendmentId; - List amendmentDocuments; + String amendmentDocuments; + + Boolean valid; List formFieldDocuments; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java index 96f96f42..7ab254d8 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java @@ -8,5 +8,6 @@ import lombok.Data; public class ApplicationAmendmentRequestBean { private String note; private List applicationFormFields; - private List amendmentDocuments; + private String amendmentDocuments; + private String amendmentNotes; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDetailsResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDetailsResponseBean.java new file mode 100644 index 00000000..eb9ee866 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDetailsResponseBean.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.util.List; +@Data +public class AmendmentDetailsResponseBean { + private String amendmentDocuments; + private String amendmentNotes; + private Boolean valid; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java deleted file mode 100644 index 45680a64..00000000 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.gepafin.tendermanagement.model.response; - -import lombok.Data; - -import java.util.List; - -@Data -public class AmendmentDocumentResponse { - - private String fieldId; - private String nameValue; - private List fileValue; - private Boolean valid = false; -} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java index 4a2f2597..96a88086 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java @@ -9,7 +9,11 @@ public class AmendmentDocumentResponseBean { Long amendmentId; - List amendmentDocuments; + List amendmentDocuments; + + Boolean valid; + + String amendmentNotes; List formFieldDocuments; } 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 0f77f602..01390777 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java @@ -21,7 +21,9 @@ public class ApplicationAmendmentRequestResponse { private String beneficiaryName; private List formFields; private List applicationFormFields; - private List amendmentDocuments; + private List amendmentDocuments; + private String amendmentNotes; + private Boolean valid; private Long applicationId; private Long applicationEvaluationId; private LocalDateTime evaluationEndDate;