diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 72f540f7..d762ae3e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -265,6 +265,7 @@ public class ApplicationAmendmentRequestDao { AmendmentFormField formField = new AmendmentFormField(); formField.setFieldId(amendmentFormFieldRequest.getFieldId()); formField.setFieldValue(null); + formField.setLabel(amendmentFormFieldRequest.getLabel()); return formField; }) .collect(Collectors.toList()); @@ -373,7 +374,7 @@ public class ApplicationAmendmentRequestDao { return response; } - private AmendmentDocumentResponse createAmendmentDocumentResponse(AmendmentFieldRequest amendmentFieldRequest) { + public AmendmentDocumentResponse createAmendmentDocumentResponse(AmendmentFieldRequest amendmentFieldRequest) { AmendmentDocumentResponse amendmentDocumentResponse = new AmendmentDocumentResponse(); amendmentDocumentResponse.setFieldId(amendmentFieldRequest.getFieldId()); amendmentDocumentResponse.setNameValue(amendmentFieldRequest.getNameValue()); @@ -571,8 +572,8 @@ public class ApplicationAmendmentRequestDao { if(updateRequest.getApplicationFormFields() != null) { updateRequest.getApplicationFormFields().stream().forEach(applicationFormFieldRequest->{ AmendmentFormField amendmentFormField = getAmendmentFormField(amendmentFormFieldMap,applicationFormFieldRequest.getFieldId()); - ApplicationFormFieldEntity applicationFormFieldEntity = getApplicationFormField(applicationFormFieldMap, applicationFormFieldRequest.getFieldId()); - updateApplicationFormField(applicationFormFieldEntity,applicationFormFieldRequest, amendmentFormField); +// ApplicationFormFieldEntity applicationFormFieldEntity = getApplicationFormField(applicationFormFieldMap, applicationFormFieldRequest.getFieldId()); +// updateApplicationFormField(applicationFormFieldEntity,applicationFormFieldRequest, amendmentFormField); updateFormField(applicationFormFieldRequest, amendmentFormField); }); existingApplicationAmendment.setFormFields(Utils.convertListToJsonString(amendmentFormFieldMap.values().stream().toList())); @@ -652,7 +653,7 @@ public class ApplicationAmendmentRequestDao { } - private void updateFormField(ApplicationFormFieldRequestBean applicationFormFieldRequest, + private void updateFormField(AmendmentFormFieldRequest applicationFormFieldRequest, AmendmentFormField amendmentFormField) { List requestedDocumentIds = extractIds(applicationFormFieldRequest.getFieldValue()); List existingDocumentIds = extractIds(amendmentFormField.getFieldValue()); @@ -661,7 +662,8 @@ public class ApplicationAmendmentRequestDao { if (!existingDocumentIds.isEmpty()) { existingDocumentIds.forEach(this::softDeleteDocument); amendmentFormField.setFieldValue(null); - setIsUploadedBy(amendmentFormField); + amendmentFormField.setIsValid(applicationFormFieldRequest.getIsValid()); +// setIsUploadedBy(amendmentFormField); } return; } @@ -675,11 +677,12 @@ public class ApplicationAmendmentRequestDao { if (!newFieldValue.equals(amendmentFormField.getFieldValue())) { amendmentFormField.setFieldValue(newFieldValue); - setIsUploadedBy(amendmentFormField); + amendmentFormField.setIsValid(applicationFormFieldRequest.getIsValid()); +// setIsUploadedBy(amendmentFormField); } } - private List extractIds(Object fieldValue) { + public List extractIds(Object fieldValue) { if (fieldValue instanceof String && !StringUtils.isEmpty((String) fieldValue)) { return Arrays.stream(((String) fieldValue).split(",")) .map(Long::valueOf) @@ -690,14 +693,14 @@ public class ApplicationAmendmentRequestDao { - private void setIsUploadedBy(AmendmentFormField amendmentFormField) { - if(validator.checkIsBeneficiary()) { - amendmentFormField.setIsUploadedBy(AmendmentFormField.AmendmentIsUploadedByEnum.BENEFICIARY.getValue()); - }else { - amendmentFormField.setIsUploadedBy(AmendmentFormField.AmendmentIsUploadedByEnum.PRE_INSTRUCTOR.getValue()); - } - - } +// private void setIsUploadedBy(AmendmentFormField amendmentFormField) { +// if(validator.checkIsBeneficiary()) { +// amendmentFormField.setIsUploadedBy(AmendmentFormField.AmendmentIsUploadedByEnum.BENEFICIARY.getValue()); +// }else { +// amendmentFormField.setIsUploadedBy(AmendmentFormField.AmendmentIsUploadedByEnum.PRE_INSTRUCTOR.getValue()); +// } +// +// } // private void updateApplicationFormFields(ApplicationAmendmentRequestEntity applicationAmendment, ApplicationFormFieldRequestBean updatedFormField) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 9d9c0627..7845a565 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -1,6 +1,5 @@ package net.gepafin.tendermanagement.dao; -import com.amazonaws.services.dynamodbv2.xspec.L; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -99,6 +98,9 @@ public class ApplicationEvaluationDao { @Autowired private DocumentService documentService; + @Autowired + private ApplicationAmendmentRequestDao applicationAmendmentRequestDao; + private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); @@ -134,6 +136,7 @@ public class ApplicationEvaluationDao { List checklistEntities = callTargetAudienceChecklistRepository .findByCallIdAndLookupDataTypeAndIsDeletedFalse(call.getId(), LookUpDataEntity.LookUpDataTypeEnum.CHECKLIST.getValue()); List applicationFormEntities = applicationFormRepository.findByApplicationId(entity.getApplicationId()); + setAmendmentDetails(entity,response); setCriteriaResponses(entity, response, evaluationCriterias); setChecklistResponses(entity, response, checklistEntities); @@ -144,6 +147,46 @@ public class ApplicationEvaluationDao { return response; } + + private void setAmendmentDetails(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response) { + List amendmentRequests=applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); + List amendmentDocumentResponseBeans=new ArrayList<>(); + for(ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity:amendmentRequests){ + AmendmentDocumentResponseBean amendmentDocumentResponseBean=new AmendmentDocumentResponseBean(); + amendmentDocumentResponseBean.setAmendmentId(applicationAmendmentRequestEntity.getId()); + String amendmentDocument=applicationAmendmentRequestEntity.getAmendmentDocument(); + String formField=applicationAmendmentRequestEntity.getFormFields(); + if (amendmentDocument != null) { + List amendmentFieldRequests=Utils.convertJsonStringToList(amendmentDocument,AmendmentFieldRequest.class); + List amendmentDocumentResponses = amendmentFieldRequests.stream() + .map(applicationAmendmentRequestDao::createAmendmentDocumentResponse) + .toList(); + amendmentDocumentResponseBean.setAmendmentDocuments(amendmentDocumentResponses); + } + List amendmentFormFields=Utils.convertJsonStringToList(formField,AmendmentFormField.class); + amendmentDocumentResponseBean.setFormFieldDocuments(setFormFieldDocuments(amendmentFormFields)); + amendmentDocumentResponseBeans.add(amendmentDocumentResponseBean); + } + response.setAmendmentDetails(amendmentDocumentResponseBeans); + } + + private List setFormFieldDocuments(List amendmentFormFields) { + List fieldResponses=new ArrayList<>(); + for (AmendmentFormField amendmentFormField: amendmentFormFields){ + FieldResponse fieldResponse=new FieldResponse(); + fieldResponse.setId(amendmentFormField.getFieldId()); + fieldResponse.setLabel(amendmentFormField.getLabel()); + fieldResponse.setValid(amendmentFormField.getIsValid()); + List fileIds=applicationAmendmentRequestDao.extractIds(amendmentFormField.getFieldValue()); + List documentResponseBeans = fileIds.stream() + .map(fileId -> createDocumentResponseBean(documentService.validateDocument(fileId))) // Create DocumentResponseBean for each fileId + .collect(Collectors.toList()); // Collect all into a List + fieldResponse.setFileDetail(documentResponseBeans); + fieldResponses.add(fieldResponse); + } + return fieldResponses; + } + private void setEvaluationDocResponse(ApplicationEvaluationResponse response, List docRequest) { List evaluationDocResponses = new ArrayList<>(); @@ -534,6 +577,15 @@ public class ApplicationEvaluationDao { actionType = VersionActionTypeEnum.INSERT; } ApplicationStatusForEvaluation status = req.getApplicationStatus(); + // Fetch all amendment request entities associated with the evaluation ID + List applicationAmendmentRequestEntities = + applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); + +// Fetch amendment details from the request + List amendmentDetailsRequests = req.getAmendmentDetails(); + + updateAmendmentDocumentsAndFormFields(applicationAmendmentRequestEntities, amendmentDetailsRequests); + ApplicationEvaluationEntity savedEntity = applicationEvaluationRepository.save(entity); @@ -549,6 +601,132 @@ public class ApplicationEvaluationDao { } } + private void updateAmendmentDocumentsAndFormFields(List applicationAmendmentRequestEntities, List amendmentFormFields) { + // Iterate through amendment request entities + for (ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity : applicationAmendmentRequestEntities) { + // Process form fields if present + if (applicationAmendmentRequestEntity.getFormFields() != null) { + // Parse existing form fields from JSON + List existingFormFields = + Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getFormFields(), AmendmentFormFieldRequest.class); + + // Prepare a new list to hold updated form fields + List updatedFormFields = new ArrayList<>(); + + // Map amendment details for quick lookup by amendment ID + Map> amendmentDetailsMap = amendmentFormFields.stream() + .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) + .collect(Collectors.toMap(AmendmentDetailsRequest::getAmendmentId, AmendmentDetailsRequest::getFormFieldDocuments)); + + // Get corresponding amendment documents for the current entity + List amendmentDocuments = amendmentDetailsMap.get(applicationAmendmentRequestEntity.getId()); + if (amendmentDocuments != null) { + // Update existing form fields with new values + for (AmendmentFormFieldRequest existingField : existingFormFields) { + for (AmendmentFormFieldRequest newField : amendmentDocuments) { + if (existingField.getFieldId().equals(newField.getFieldId())) { + // Update fields if there are changes + Utils.setIfUpdated(existingField::getIsValid, existingField::setIsValid, newField.getIsValid()); + Utils.setIfUpdated(existingField::getFieldValue, existingField::setFieldValue, newField.getFieldValue()); + + updatedFormFields.add(existingField); + break; // Move to the next existing field + } + } + } + + // Convert updated form fields back to JSON and save to the database + applicationAmendmentRequestEntity.setFormFields(Utils.convertListToJsonString(updatedFormFields)); + applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); + } + } + + // Process amendment documents if present + if (applicationAmendmentRequestEntity.getAmendmentDocument() != null) { + // Parse existing amendment fields from JSON + List existingAmendmentFields = + Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(), AmendmentFieldRequest.class); + + // Prepare a new list to hold updated amendment fields + List updatedAmendmentFields = new ArrayList<>(); + + // Map amendment details for quick lookup by amendment ID + Map> amendmentDetailsMap = amendmentFormFields.stream() + .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) + .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::getIsValid, existingField::setIsValid, newField.getIsValid()); + Utils.setIfUpdated(existingField::getFileValue, existingField::setFileValue, newField.getFileValue()); + Utils.setIfUpdated(existingField::getNameValue, existingField::setNameValue, newField.getNameValue()); + + updatedAmendmentFields.add(existingField); + break; // Move to the next existing field + } + } + } + + // Convert updated fields back to JSON and save to the database + applicationAmendmentRequestEntity.setAmendmentDocument(Utils.convertListToJsonString(updatedAmendmentFields)); + applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); + } + } + } + } + +// private void updateAmendmentDocuments(List applicationAmendmentRequestEntities, List amendmentFormFields) { +// for (ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity : applicationAmendmentRequestEntities) { +// // Skip if there are no amendment documents +// if (applicationAmendmentRequestEntity.getAmendmentDocument() == null) { +// continue; +// } +// +// // Parse existing amendment fields from JSON +// List existingAmendmentFields = +// Utils.convertJsonStringToList(applicationAmendmentRequestEntity.getAmendmentDocument(), AmendmentFieldRequest.class); +// +// // Prepare a new list to hold updated amendment fields +// List updatedAmendmentFields = new ArrayList<>(); +// +// // Map amendment details for quick lookup by amendment ID +// Map> amendmentDetailsMap = amendmentFormFields.stream() +// .filter(details -> applicationAmendmentRequestEntity.getId().equals(details.getAmendmentId())) +// .collect(Collectors.toMap(AmendmentDetailsRequest::getAmendmentId, AmendmentDetailsRequest::getAmendmentDocuments)); +// +// // Get corresponding amendment documents for the current entity +// List amendmentDocuments = amendmentDetailsMap.get(applicationAmendmentRequestEntity.getId()); +// if (amendmentDocuments == null) { +// continue; +// } +// +// // 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::getIsValid, existingField::setIsValid, newField.getIsValid()); +// Utils.setIfUpdated(existingField::getFileValue, existingField::setFileValue, newField.getFileValue()); +// Utils.setIfUpdated(existingField::getNameValue, existingField::setNameValue, newField.getNameValue()); +// +// updatedAmendmentFields.add(existingField); +// break; // Move to the next existing field +// } +// } +// } +// +// // Convert updated fields back to JSON and save to the database +// applicationAmendmentRequestEntity.setAmendmentDocument(Utils.convertListToJsonString(updatedAmendmentFields)); +// applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); +// } +// } + private List processCriteria(ApplicationEvaluationEntity entity, ApplicationEvaluationRequest req) { List incomingCriteriaList = Optional.ofNullable(req.getCriteria()).orElse(new ArrayList<>()); @@ -1483,6 +1661,10 @@ public class ApplicationEvaluationDao { ApplicationEvaluationEntity oldApplicationEvaluation = Utils.getClonedEntityForData(existingEntity); AssignedApplicationsEntity oldAssignedApplication = Utils.getClonedEntityForData(assignedApplicationsEntity); + List amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(existingEntity.getId(),ApplicationAmendmentRequestEnum.AWAITING.getValue()); + if(amendmentRequest !=null && Boolean.FALSE.equals(amendmentRequest.isEmpty())){ + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_CANNOT_APPROVED_OR_REJECTED)); + } String statusType = application.getStatus(); if (application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue())) { existingEntity.setStatus(ApplicationEvaluationStatusTypeEnum.CLOSE.getValue()); @@ -1501,11 +1683,6 @@ public class ApplicationEvaluationDao { } - List amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(existingEntity.getId(),ApplicationAmendmentRequestEnum.AWAITING.getValue()); - if(amendmentRequest !=null && Boolean.FALSE.equals(amendmentRequest.isEmpty())){ - throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_CANNOT_APPROVED_OR_REJECTED)); - } - if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.APPROVED.getValue())))) { emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application); } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java new file mode 100644 index 00000000..691a5a20 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentDetailsRequest.java @@ -0,0 +1,17 @@ +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; + +@Data +public class AmendmentDetailsRequest { + + Long amendmentId; + + List amendmentDocuments; + + List formFieldDocuments; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java index 95f158c3..0eaee1f3 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormField.java @@ -9,9 +9,13 @@ public class AmendmentFormField { private String fieldId; + private String label; + private String fieldValue; - private String isUploadedBy; + private Boolean isValid; + + public enum AmendmentIsUploadedByEnum { diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java new file mode 100644 index 00000000..ed0d99db --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AmendmentFormFieldRequest.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +@Data +public class AmendmentFormFieldRequest { + + private String fieldId; + + private Object fieldValue; + + private Boolean isValid; +} 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 6973254d..96f96f42 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationAmendmentRequestBean.java @@ -7,6 +7,6 @@ import lombok.Data; @Data public class ApplicationAmendmentRequestBean { private String note; - private List applicationFormFields; + private List applicationFormFields; private List amendmentDocuments; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java index df29c1d8..21b4a5ba 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java @@ -10,6 +10,7 @@ public class ApplicationEvaluationRequest { private List criteria; private List checklist; private List files; + private List amendmentDetails; private String note; private ApplicationStatusForEvaluation applicationStatus; private String motivation; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java new file mode 100644 index 00000000..4a2f2597 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AmendmentDocumentResponseBean.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +import java.util.List; + +@Data +public class AmendmentDocumentResponseBean { + + Long amendmentId; + + List amendmentDocuments; + + List formFieldDocuments; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java index a3d32624..b890b327 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -22,6 +22,7 @@ public class ApplicationEvaluationResponse { private List checklist; private List files; private List evaluationDocument; + private List amendmentDetails; private LocalDateTime createdDate; private LocalDateTime updatedDate; private String beneficiary;