diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index f76117ec..3027c5f5 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -59,7 +59,7 @@ public class ApplicationAmendmentRequestDao { private ApplicationFormFieldRepository applicationFormFieldRepository; @Autowired - private CommunicationDao communicationDao; + private EmailNotificationDao emailNotificationDao; @Autowired private ApplicationEvaluationService applicationEvaluationService; @@ -177,7 +177,7 @@ public class ApplicationAmendmentRequestDao { ApplicationAmendmentRequestResponse applicationAmendmentRequestResponse = convertEntityToResponse(applicationAmendmentRequestEntity); log.info("Application submitted successfully for amendment", applicationAmendmentRequestResponse); if(Boolean.TRUE.equals(applicationAmendmentRequestResponse.isSendEmail())){ - communicationDao.sendMailToNotifyBeneficiaryRegardingNewAmendment(applicationAmendmentRequestEntity); + emailNotificationDao.sendMailToNotifyBeneficiaryRegardingNewAmendment(applicationAmendmentRequestEntity); } return applicationAmendmentRequestResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 0bbbce90..78360951 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -14,7 +14,6 @@ import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.Utils; -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.springframework.beans.factory.annotation.Autowired; @@ -31,33 +30,51 @@ public class ApplicationEvaluationDao { @Autowired private ApplicationEvaluationRepository applicationEvaluationRepository; + @Autowired private ApplicationService applicationService; + @Autowired private CallRepository callRepository; + @Autowired private ApplicationRepository applicationRepository; + @Autowired private UserService userService; + @Autowired private EvaluationCriteriaRepository evaluationCriteriaRepository; + @Autowired private FormRepository formRepository; + @Autowired private CallTargetAudienceChecklistRepository callTargetAudienceChecklistRepository; + @Autowired private DocumentRepository documentRepository; + @Autowired private ApplicationFormRepository applicationFormRepository; + @Autowired private ApplicationFormFieldRepository applicationFormFieldRepository; + @Autowired private AssignedApplicationsRepository assignedApplicationsRepository; + @Autowired private CriteriaFormFieldRepository criteriaFormFieldRepository; + @Autowired + private EmailNotificationDao emailNotificationDao; + + @Autowired + ApplicationAmendmentRequestRepository applicationAmendmentRequestRepository; private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { + ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplciationId).orElse(null); @@ -75,6 +92,7 @@ public class ApplicationEvaluationDao { } private ApplicationEvaluationResponse convertToResponse(ApplicationEvaluationEntity entity) { + ApplicationEvaluationResponse response = new ApplicationEvaluationResponse(); populateBasicDetails(entity, response); @@ -93,6 +111,7 @@ public class ApplicationEvaluationDao { } private void populateBasicDetails(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response) { + response.setId(entity.getId()); response.setApplicationId(entity.getApplicationId()); AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByIdAndIsDeletedFalse(entity.getAssignedApplicationsEntity().getId()).orElse(null); @@ -106,18 +125,17 @@ public class ApplicationEvaluationDao { private void setCriteriaResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List evaluationCriterias) { - List criteriaResponsesFromEntity = entity.getCriteria() != null - ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { - }) - : new ArrayList<>(); + + List criteriaResponsesFromEntity = entity.getCriteria() != null ? + Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { + }) : + new ArrayList<>(); List criteriaResponsesFromDB = getCriteriaResponse(entity.getApplicationId()); addMissingCriteriaResponses(criteriaResponsesFromEntity, criteriaResponsesFromDB, entity.getApplicationId()); criteriaResponsesFromEntity.forEach(criteriaResponse -> { EvaluationCriteriaEntity matchingEvaluationCriteria = evaluationCriterias.stream() - .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())) - .findFirst() - .orElse(null); + .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())).findFirst().orElse(null); if (matchingEvaluationCriteria != null) { criteriaResponse.setLabel(matchingEvaluationCriteria.getLookupData().getValue()); @@ -132,9 +150,8 @@ public class ApplicationEvaluationDao { } private void addMissingCriteriaResponses(List criteriaResponsesFromEntity, List criteriaResponsesFromDB, Long applicationId) { - Set existingCriteriaIds = criteriaResponsesFromEntity.stream() - .map(CriteriaResponse::getId) - .collect(Collectors.toSet()); + + Set existingCriteriaIds = criteriaResponsesFromEntity.stream().map(CriteriaResponse::getId).collect(Collectors.toSet()); for (CriteriaResponse dbResponse : criteriaResponsesFromDB) { if (!existingCriteriaIds.contains(dbResponse.getId())) { @@ -146,8 +163,8 @@ public class ApplicationEvaluationDao { } private List getMappedFieldsForCriteria(Long evaluationCriteriaId, Long applicationId) { - List criteriaFormFields = criteriaFormFieldRepository - .findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaId); + + List criteriaFormFields = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaId); List mappedFields = new ArrayList<>(); Set uniqueFieldIds = new HashSet<>(); @@ -164,25 +181,22 @@ public class ApplicationEvaluationDao { FormEntity formEntity = formRepository.findById(formField.getFormId()).orElse(null); if (formEntity != null) { List contentBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); - contentBeans.stream() - .filter(contentBean -> contentBean.getId().equals(formFieldId)) - .findFirst() - .ifPresent(contentBean -> { - String label = contentBean.getLabel(); - if (contentBean.getSettings() != null) { - for (SettingResponseBean setting : contentBean.getSettings()) { - if ("label".equals(setting.getName())) { - label = setting.getValue() != null ? setting.getValue().toString() : label; - break; - } - } + contentBeans.stream().filter(contentBean -> contentBean.getId().equals(formFieldId)).findFirst().ifPresent(contentBean -> { + String label = contentBean.getLabel(); + if (contentBean.getSettings() != null) { + for (SettingResponseBean setting : contentBean.getSettings()) { + if ("label".equals(setting.getName())) { + label = setting.getValue() != null ? setting.getValue().toString() : label; + break; } - mappedField.setFieldLabel(label); - }); + } + } + mappedField.setFieldLabel(label); + }); } - Optional formFieldEntityOptional = applicationFormFieldRepository - .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(formFieldId, applicationForm.getId(), applicationId); + Optional formFieldEntityOptional = applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + formFieldId, applicationForm.getId(), applicationId); formFieldEntityOptional.ifPresent(field -> mappedField.setFieldValue(field.getFieldValue())); @@ -195,19 +209,18 @@ public class ApplicationEvaluationDao { } private void setChecklistResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List checklistEntities) { - List checklistResponsesFromEntity = entity.getChecklist() != null - ? Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() { - }) - : new ArrayList<>(); + + List checklistResponsesFromEntity = entity.getChecklist() != null ? + Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() { + }) : + new ArrayList<>(); List checklistResponsesFromDB = getChecklistResponse(entity.getApplicationId()); addMissingChecklistResponses(checklistResponsesFromEntity, checklistResponsesFromDB); checklistResponsesFromEntity.forEach(checklistResponse -> { - CallTargetAudienceChecklistEntity matchingChecklist = checklistEntities.stream() - .filter(checklistEntity -> checklistEntity.getId().equals(checklistResponse.getId())) - .findFirst() - .orElse(null); + CallTargetAudienceChecklistEntity matchingChecklist = checklistEntities.stream().filter(checklistEntity -> checklistEntity.getId().equals(checklistResponse.getId())) + .findFirst().orElse(null); if (matchingChecklist != null) { checklistResponse.setLabel(matchingChecklist.getLookupData().getValue()); @@ -218,9 +231,8 @@ public class ApplicationEvaluationDao { } private void addMissingChecklistResponses(List checklistResponsesFromEntity, List checklistResponsesFromDB) { - Set existingChecklistIds = checklistResponsesFromEntity.stream() - .map(ChecklistResponse::getId) - .collect(Collectors.toSet()); + + Set existingChecklistIds = checklistResponsesFromEntity.stream().map(ChecklistResponse::getId).collect(Collectors.toSet()); for (ChecklistResponse dbResponse : checklistResponsesFromDB) { if (!existingChecklistIds.contains(dbResponse.getId())) { @@ -230,10 +242,9 @@ public class ApplicationEvaluationDao { } private void setFieldResponses(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response, List applicationFormEntities) { - List fieldResponsesFromEntity = entity.getFile() != null - ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() { - }) - : new ArrayList<>(); + + List fieldResponsesFromEntity = entity.getFile() != null ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() { + }) : new ArrayList<>(); List fieldResponsesFromDB = getFieldResponses(entity.getApplicationId()); addMissingFieldResponses(fieldResponsesFromEntity, fieldResponsesFromDB); @@ -261,10 +272,9 @@ public class ApplicationEvaluationDao { } fieldResponse.setLabel(label); - Optional optionalFormField = applicationFormFieldRepository - .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( - fieldResponse.getId(), applicationForm.getId(), entity.getApplicationId() - ); + Optional optionalFormField = + applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + fieldResponse.getId(), applicationForm.getId(), entity.getApplicationId()); if (optionalFormField.isPresent()) { ApplicationFormFieldEntity formField = optionalFormField.get(); @@ -301,9 +311,8 @@ public class ApplicationEvaluationDao { } private void addMissingFieldResponses(List fieldResponsesFromEntity, List fieldResponsesFromDB) { - Set existingFieldIds = fieldResponsesFromEntity.stream() - .map(FieldResponse::getId) - .collect(Collectors.toSet()); + + Set existingFieldIds = fieldResponsesFromEntity.stream().map(FieldResponse::getId).collect(Collectors.toSet()); for (FieldResponse dbResponse : fieldResponsesFromDB) { if (!existingFieldIds.contains(dbResponse.getId())) { @@ -313,6 +322,7 @@ public class ApplicationEvaluationDao { } private void setApplicationDetails(ApplicationEvaluationResponse response, ApplicationEvaluationEntity entity) { + ApplicationEntity application = applicationService.validateApplication(entity.getApplicationId() != null ? entity.getApplicationId() : null); UserEntity user = userService.validateUser(application.getUserId()); @@ -323,8 +333,8 @@ public class ApplicationEvaluationDao { String beneficiary = String.join(" ", firstName, lastName).trim(); response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); response.setBeneficiary(beneficiary); - response.setMinScore(call.getThreshold()!=null?call.getThreshold():null); - response.setCallName(application.getCall().getName()!=null?application.getCall().getName():null); + response.setMinScore(call.getThreshold() != null ? call.getThreshold() : null); + response.setCallName(application.getCall().getName() != null ? application.getCall().getName() : null); response.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null); response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null); response.setEvaluationDate(application.getSubmissionDate() != null ? application.getSubmissionDate().plusDays(30) : null); @@ -367,151 +377,123 @@ public class ApplicationEvaluationDao { private List filterNonNullChecklist(List checklistRequests) { - return checklistRequests.stream() - .filter(request -> request.getValid() != null) - .collect(Collectors.toList()); + + return checklistRequests.stream().filter(request -> request.getValid() != null).collect(Collectors.toList()); } private List filterNonNullCriteria(List criteriaRequests) { - return criteriaRequests.stream() - .filter(request -> request.getScore() != null && request.getValid() != null) - .collect(Collectors.toList()); + + return criteriaRequests.stream().filter(request -> request.getScore() != null && request.getValid() != null).collect(Collectors.toList()); } private List filterNonNullFields(List fieldRequests) { - return fieldRequests.stream() - .filter(request -> request.getValid() != null) - .collect(Collectors.toList()); + + return fieldRequests.stream().filter(request -> request.getValid() != null).collect(Collectors.toList()); } private List processCriteria(ApplicationEvaluationEntity entity, ApplicationEvaluationRequest req) { - List existingCriteriaList = entity.getCriteria() != null - ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { - }) - : new ArrayList<>(); - Map existingCriteriaMap = existingCriteriaList.stream() - .collect(Collectors.toMap(CriteriaResponse::getId, criteria -> criteria)); + List existingCriteriaList = entity.getCriteria() != null ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { + }) : new ArrayList<>(); - List updatedCriteriaList = req.getCriteria().stream() - .map(incoming -> { - CriteriaRequest request = new CriteriaRequest(); - request.setId(incoming.getId()); - request.setScore(incoming.getScore()); - request.setValid(incoming.getValid()); + Map existingCriteriaMap = existingCriteriaList.stream().collect(Collectors.toMap(CriteriaResponse::getId, criteria -> criteria)); - CriteriaResponse existingCriteria = existingCriteriaMap.get(incoming.getId()); - if (existingCriteria != null) { - request.setScore(incoming.getScore() != null ? incoming.getScore() : null); - request.setValid(incoming.getValid() != null ? incoming.getValid() : null); - } - return request; - }) - .collect(Collectors.toList()); + List updatedCriteriaList = req.getCriteria().stream().map(incoming -> { + CriteriaRequest request = new CriteriaRequest(); + request.setId(incoming.getId()); + request.setScore(incoming.getScore()); + request.setValid(incoming.getValid()); + + CriteriaResponse existingCriteria = existingCriteriaMap.get(incoming.getId()); + if (existingCriteria != null) { + request.setScore(incoming.getScore() != null ? incoming.getScore() : null); + request.setValid(incoming.getValid() != null ? incoming.getValid() : null); + } + return request; + }).collect(Collectors.toList()); List missingCriteriaRequests = existingCriteriaList.stream() - .filter(existing -> !updatedCriteriaList.stream() - .map(CriteriaRequest::getId) - .toList() - .contains(existing.getId())) - .map(existing -> { + .filter(existing -> !updatedCriteriaList.stream().map(CriteriaRequest::getId).toList().contains(existing.getId())).map(existing -> { CriteriaRequest request = new CriteriaRequest(); request.setId(existing.getId()); request.setScore(existing.getScore()); request.setValid(existing.getValid()); return request; - }) - .toList(); + }).toList(); updatedCriteriaList.addAll(missingCriteriaRequests); return updatedCriteriaList; } private List processChecklist(ApplicationEvaluationEntity entity, ApplicationEvaluationRequest req) { - List existingChecklistList = entity.getChecklist() != null - ? Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() { - }) - : new ArrayList<>(); - Map existingChecklistMap = existingChecklistList.stream() - .collect(Collectors.toMap(ChecklistResponse::getId, checklist -> checklist)); + List existingChecklistList = entity.getChecklist() != null ? + Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() { + }) : + new ArrayList<>(); - List updatedChecklistList = req.getChecklist().stream() - .map(incoming -> { - ChecklistRequest request = new ChecklistRequest(); - request.setId(incoming.getId()); - request.setValid(incoming.getValid()); + Map existingChecklistMap = existingChecklistList.stream().collect(Collectors.toMap(ChecklistResponse::getId, checklist -> checklist)); - ChecklistResponse existingChecklist = existingChecklistMap.get(incoming.getId()); - if (existingChecklist != null && incoming.getValid() == null) { - request.setValid(null); - } - return request; - }) - .collect(Collectors.toList()); + List updatedChecklistList = req.getChecklist().stream().map(incoming -> { + ChecklistRequest request = new ChecklistRequest(); + request.setId(incoming.getId()); + request.setValid(incoming.getValid()); + + ChecklistResponse existingChecklist = existingChecklistMap.get(incoming.getId()); + if (existingChecklist != null && incoming.getValid() == null) { + request.setValid(null); + } + return request; + }).collect(Collectors.toList()); List missingChecklistRequests = existingChecklistList.stream() - .filter(existing -> !updatedChecklistList.stream() - .map(ChecklistRequest::getId) - .toList() - .contains(existing.getId())) - .map(existing -> { + .filter(existing -> !updatedChecklistList.stream().map(ChecklistRequest::getId).toList().contains(existing.getId())).map(existing -> { ChecklistRequest request = new ChecklistRequest(); request.setId(existing.getId()); request.setValid(existing.getValid() != null ? existing.getValid() : null); return request; - }) - .toList(); + }).toList(); updatedChecklistList.addAll(missingChecklistRequests); return updatedChecklistList; } private List processField(ApplicationEvaluationEntity entity, ApplicationEvaluationRequest req) { - List existingFieldList = entity.getFile() != null - ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() { - }) - : new ArrayList<>(); - Map existingFieldMap = existingFieldList.stream() - .collect(Collectors.toMap(FieldResponse::getId, field -> field)); + List existingFieldList = entity.getFile() != null ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() { + }) : new ArrayList<>(); - List updatedFieldList = req.getFiles().stream() - .map(incoming -> { - FieldRequest request = new FieldRequest(); - request.setId(incoming.getId()); - request.setValid(incoming.getValid()); + Map existingFieldMap = existingFieldList.stream().collect(Collectors.toMap(FieldResponse::getId, field -> field)); - FieldResponse existingField = existingFieldMap.get(incoming.getId()); - if (existingField != null) { - request.setValid(incoming.getValid() != null ? incoming.getValid() : null); - } - return request; - }) - .collect(Collectors.toList()); + List updatedFieldList = req.getFiles().stream().map(incoming -> { + FieldRequest request = new FieldRequest(); + request.setId(incoming.getId()); + request.setValid(incoming.getValid()); + + FieldResponse existingField = existingFieldMap.get(incoming.getId()); + if (existingField != null) { + request.setValid(incoming.getValid() != null ? incoming.getValid() : null); + } + return request; + }).collect(Collectors.toList()); List missingFieldRequests = existingFieldList.stream() - .filter(existing -> !updatedFieldList.stream() - .map(FieldRequest::getId) - .toList() - .contains(existing.getId())) - .map(existing -> { + .filter(existing -> !updatedFieldList.stream().map(FieldRequest::getId).toList().contains(existing.getId())).map(existing -> { FieldRequest request = new FieldRequest(); request.setId(existing.getId()); request.setValid(existing.getValid()); return request; - }) - .toList(); + }).toList(); updatedFieldList.addAll(missingFieldRequests); return updatedFieldList; } public ApplicationEvaluationEntity validateApplicationEvaluation(Long id) { + Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(id); if (entityOptional.isEmpty()) { - throw new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.APPLICATION_EVALUATION_NOT_FOUND, id)); + throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_EVALUATION_NOT_FOUND, id)); } return entityOptional.get(); } @@ -539,18 +521,19 @@ public class ApplicationEvaluationDao { } public ApplicationEvaluationResponse getEvaluationResponseByApplicationid(UserEntity user, Long applicationId, Long assignedApplicationId) { + ApplicationEvaluationEntity entity = new ApplicationEvaluationEntity(); ApplicationEvaluationResponse response = new ApplicationEvaluationResponse(); CallEntity call = null; - ApplicationEntity application=null; + ApplicationEntity application = null; AssignedApplicationsEntity assignedApplications = null; - if (applicationId != null && assignedApplicationId==null) { + if (applicationId != null && assignedApplicationId == null) { application = applicationService.validateApplication(applicationId); call = callRepository.findCallEntityByApplicationId(applicationId); assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); } else if (assignedApplicationId != null) { - assignedApplications = assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationId).orElseThrow(() -> - new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG))); + assignedApplications = assignedApplicationsRepository.findByIdAndIsDeletedFalse(assignedApplicationId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG))); application = applicationService.validateApplication(assignedApplications.getApplication().getId()); call = callRepository.findCallEntityByApplicationId(application.getId()); @@ -578,17 +561,15 @@ public class ApplicationEvaluationDao { return response; } - private void setCriteriaResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, List evaluationCriterias) { - List criteriaResponses = entity.getCriteria() != null - ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { - }) - : getCriteriaResponse(applicationId); + private void setCriteriaResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, + List evaluationCriterias) { + + List criteriaResponses = entity.getCriteria() != null ? Utils.convertJsonToList(entity.getCriteria(), new TypeReference>() { + }) : getCriteriaResponse(applicationId); criteriaResponses.forEach(criteriaResponse -> { EvaluationCriteriaEntity matchingEvaluationCriteria = evaluationCriterias.stream() - .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())) - .findFirst() - .orElse(null); + .filter(evaluationCriteria -> evaluationCriteria.getId().equals(criteriaResponse.getId())).findFirst().orElse(null); List applicationForms = applicationFormRepository.findByApplicationId(applicationId); Map mappedFieldMap = new HashMap<>(); @@ -597,8 +578,7 @@ public class ApplicationEvaluationDao { criteriaResponse.setLabel(matchingEvaluationCriteria.getLookupData().getValue()); criteriaResponse.setMaxScore(matchingEvaluationCriteria.getScore()); - List criteriaFormFields = criteriaFormFieldRepository - .findByEvaluationCriteriaIdAndIsDeletedFalse(matchingEvaluationCriteria.getId()); + List criteriaFormFields = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(matchingEvaluationCriteria.getId()); for (ApplicationFormEntity applicationForm : applicationForms) { for (CriteriaFormFieldEntity criteriaFormField : criteriaFormFields) { @@ -610,24 +590,22 @@ public class ApplicationEvaluationDao { if (formEntity != null) { List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); - contentResponseBeans.stream() - .filter(bean -> bean.getId().equals(formFieldId)) - .findFirst() - .ifPresent(contentResponseBean -> { - String label = contentResponseBean.getLabel(); - if (contentResponseBean.getSettings() != null) { - for (SettingResponseBean setting : contentResponseBean.getSettings()) { - if ("label".equals(setting.getName())) { - label = setting.getValue() != null ? setting.getValue().toString() : label; - break; - } - } + contentResponseBeans.stream().filter(bean -> bean.getId().equals(formFieldId)).findFirst().ifPresent(contentResponseBean -> { + String label = contentResponseBean.getLabel(); + if (contentResponseBean.getSettings() != null) { + for (SettingResponseBean setting : contentResponseBean.getSettings()) { + if ("label".equals(setting.getName())) { + label = setting.getValue() != null ? setting.getValue().toString() : label; + break; } - mappedField.setFieldLabel(label); - }); + } + } + mappedField.setFieldLabel(label); + }); } - Optional formFieldEntityOptional = applicationFormFieldRepository - .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(formFieldId, applicationForm.getId(), applicationId); + Optional formFieldEntityOptional = + applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + formFieldId, applicationForm.getId(), applicationId); formFieldEntityOptional.ifPresent(formField -> mappedField.setFieldValue(formField.getFieldValue())); mappedFieldMap.put(formFieldId, mappedField); @@ -641,17 +619,15 @@ public class ApplicationEvaluationDao { response.setCriteria(criteriaResponses); } - private void setChecklistResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, List checklistEntities) { - List checklistResponses = entity.getChecklist() != null - ? Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() { - }) - : getChecklistResponse(applicationId); + private void setChecklistResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, + List checklistEntities) { + + List checklistResponses = entity.getChecklist() != null ? Utils.convertJsonToList(entity.getChecklist(), new TypeReference>() { + }) : getChecklistResponse(applicationId); checklistResponses.forEach(checklistResponse -> { - CallTargetAudienceChecklistEntity matchingChecklist = checklistEntities.stream() - .filter(checklistEntity -> checklistEntity.getId().equals(checklistResponse.getId())) - .findFirst() - .orElse(null); + CallTargetAudienceChecklistEntity matchingChecklist = checklistEntities.stream().filter(checklistEntity -> checklistEntity.getId().equals(checklistResponse.getId())) + .findFirst().orElse(null); if (matchingChecklist != null) { checklistResponse.setLabel(matchingChecklist.getLookupData().getValue()); @@ -661,11 +637,11 @@ public class ApplicationEvaluationDao { response.setChecklist(checklistResponses); } - private void setFileResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, List applicationFormEntities) { - List fieldResponses = entity.getFile() != null - ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() { - }) - : getFieldResponses(applicationId); + private void setFileResponses(ApplicationEvaluationEntity entity, Long applicationId, ApplicationEvaluationResponse response, + List applicationFormEntities) { + + List fieldResponses = entity.getFile() != null ? Utils.convertJsonToList(entity.getFile(), new TypeReference>() { + }) : getFieldResponses(applicationId); Set processedFieldIds = new HashSet<>(); fieldResponses.forEach(fieldResponse -> { @@ -690,8 +666,9 @@ public class ApplicationEvaluationDao { } fieldResponse.setLabel(label); - Optional optionalFormField = applicationFormFieldRepository - .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(fieldResponse.getId(), applicationForm.getId(), applicationId); + Optional optionalFormField = + applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + fieldResponse.getId(), applicationForm.getId(), applicationId); if (optionalFormField.isPresent() && optionalFormField.get().getFieldValue() != null) { String[] documentIds = optionalFormField.get().getFieldValue().split(","); @@ -727,8 +704,8 @@ public class ApplicationEvaluationDao { response.setFiles(fieldResponses); } - private void setApplicationDetails(ApplicationEvaluationResponse response, Long applicationId, UserEntity user) { + ApplicationEntity application = applicationService.validateApplication(applicationId); userService.validateUser(application.getUserId()); String firstName = user.getFirstName() != null ? user.getFirstName() : ""; @@ -737,7 +714,7 @@ public class ApplicationEvaluationDao { String beneficiary = String.join(" ", firstName, lastName).trim(); response.setBeneficiary(beneficiary); - response.setCallName(application.getCall().getName()!=null?application.getCall().getName():null); + response.setCallName(application.getCall().getName() != null ? application.getCall().getName() : null); response.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null); response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null); response.setEvaluationDate(application.getSubmissionDate() != null ? application.getSubmissionDate().plusDays(30) : null); @@ -745,6 +722,7 @@ public class ApplicationEvaluationDao { } List getCriteriaResponse(Long applicationId) { + CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); List evaluationCriterias = evaluationCriteriaRepository.findByCallId(call.getId()); @@ -756,8 +734,7 @@ public class ApplicationEvaluationDao { response.setMaxScore(criteria.getScore()); response.setValid(null); - List criteriaFormFields = criteriaFormFieldRepository - .findByEvaluationCriteriaIdAndIsDeletedFalse(criteria.getId()); + List criteriaFormFields = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(criteria.getId()); List mappedFields = new ArrayList<>(); Set processedFormFieldIds = new HashSet<>(); @@ -772,32 +749,24 @@ public class ApplicationEvaluationDao { FormEntity formEntity = formRepository.findById(criteriaFormField.getFormId()).orElse(null); if (formEntity != null) { - List contentResponseBeans = Utils.convertJsonStringToList( - formEntity.getContent(), ContentResponseBean.class); - contentResponseBeans.stream() - .filter(bean -> bean.getId().equals(criteriaFormField.getFormFieldId())) - .findFirst() - .ifPresent(contentResponseBean -> { - String label = contentResponseBean.getLabel(); - if (contentResponseBean.getSettings() != null) { - for (SettingResponseBean setting : contentResponseBean.getSettings()) { - if ("label".equals(setting.getName())) { - label = setting.getValue() != null ? setting.getValue().toString() : label; - break; - } - } + List contentResponseBeans = Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class); + contentResponseBeans.stream().filter(bean -> bean.getId().equals(criteriaFormField.getFormFieldId())).findFirst().ifPresent(contentResponseBean -> { + String label = contentResponseBean.getLabel(); + if (contentResponseBean.getSettings() != null) { + for (SettingResponseBean setting : contentResponseBean.getSettings()) { + if ("label".equals(setting.getName())) { + label = setting.getValue() != null ? setting.getValue().toString() : label; + break; } - mappedField.setFieldLabel(label); - }); + } + } + mappedField.setFieldLabel(label); + }); } - applicationFormRepository.findByApplicationId(applicationId).stream() - .flatMap(applicationForm -> applicationFormFieldRepository - .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( - criteriaFormField.getFormFieldId(), applicationForm.getId(), applicationId) - .stream()) - .findFirst() - .ifPresent(formField -> mappedField.setFieldValue(formField.getFieldValue())); + applicationFormRepository.findByApplicationId(applicationId).stream().flatMap( + applicationForm -> applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(criteriaFormField.getFormFieldId(), + applicationForm.getId(), applicationId).stream()).findFirst().ifPresent(formField -> mappedField.setFieldValue(formField.getFieldValue())); mappedFields.add(mappedField); processedFormFieldIds.add(criteriaFormField.getFormFieldId()); @@ -811,6 +780,7 @@ public class ApplicationEvaluationDao { } List getChecklistResponse(Long applicationId) { + CallEntity call = callRepository.findCallEntityByApplicationId(applicationId); List checklistEntities = callTargetAudienceChecklistRepository.findByCallId(call.getId()); List checklistResponses = checklistEntities.stream().map(checklist -> { @@ -826,6 +796,7 @@ public class ApplicationEvaluationDao { } public List getFieldResponses(Long applicationId) { + List applicationFormEntities = applicationFormRepository.findByApplicationId(applicationId); List fieldResponses = new ArrayList<>(); @@ -840,8 +811,8 @@ public class ApplicationEvaluationDao { String fieldId = contentResponseBean.getId(); Long applicationFormId = applicationForm.getId(); - Optional optionalFormField = applicationFormFieldRepository - .findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId(fieldId, applicationFormId, applicationId); + Optional optionalFormField = applicationFormFieldRepository.findByFieldIdAndApplicationFormIdAndApplicationFormApplicationId( + fieldId, applicationFormId, applicationId); if (optionalFormField.isPresent()) { ApplicationFormFieldEntity formField = optionalFormField.get(); @@ -893,36 +864,46 @@ public class ApplicationEvaluationDao { } public void deleteById(Long id) { + ApplicationEvaluationEntity applicationEvaluationEntity = validateApplicationEvaluation(id); applicationEvaluationEntity.setIsDeleted(true); - applicationEvaluationEntity = saveApplicationEvaluationEntity(applicationEvaluationEntity); + saveApplicationEvaluationEntity(applicationEvaluationEntity); } public ApplicationEvaluationEntity saveApplicationEvaluationEntity(ApplicationEvaluationEntity applicationEvaluationEntityData) { + return applicationEvaluationRepository.save(applicationEvaluationEntityData); } - public ApplicationEvaluationResponse updateApplicationEvaluationStatus(ApplicationEntity application, AssignedApplicationsEntity assignedApplicationsEntity, AssignedEvaluationStatus newStatus) { - Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse(assignedApplicationsEntity.getId()); - ApplicationEvaluationEntity entity = null; + public ApplicationEvaluationResponse updateApplicationEvaluationStatus(ApplicationEntity application, AssignedApplicationsEntity assignedApplicationsEntity, + AssignedEvaluationStatus newStatus) { + Optional existingEntityOptional = applicationEvaluationRepository.findByAssignedApplicationsEntity_IdAndIsDeletedFalse( + assignedApplicationsEntity.getId()); + ApplicationEvaluationEntity entity; + + String statusType = application.getStatus(); if (existingEntityOptional.isPresent()) { ApplicationEvaluationEntity existingEntity = existingEntityOptional.get(); application.setStatus(newStatus.getValue()); application = applicationRepository.save(application); - if (application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || - application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue())) { + if (application.getStatus().equals(ApplicationStatusTypeEnum.APPROVED.getValue()) || application.getStatus().equals(ApplicationStatusTypeEnum.REJECTED.getValue())) { existingEntity.setStatus(ApplicationEvaluationStatusTypeEnum.CLOSE.getValue()); assignedApplicationsEntity.setStatus(AssignedApplicationEnum.CLOSE.getValue()); } entity = applicationEvaluationRepository.save(existingEntity); - assignedApplicationsEntity = assignedApplicationsRepository.save(assignedApplicationsEntity); + assignedApplicationsRepository.save(assignedApplicationsEntity); + ApplicationAmendmentRequestEntity amendmentRequest = applicationAmendmentRequestRepository.findByApplicationEvaluationIdAndIsDeletedFalse(existingEntity.getId()); + if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.APPROVED.getValue())))) { + emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(amendmentRequest); + } + if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.REJECTED.getValue())))) { + emailNotificationDao.sendInadmissibilityEmailForRejectedApplication(amendmentRequest); + } return convertToResponse(entity); } return null; } - - } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java index 9d546496..afe7e21e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java @@ -3,25 +3,12 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; -import net.gepafin.tendermanagement.entities.ApplicationEntity; -import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.CommunicationEntity; -import net.gepafin.tendermanagement.entities.CompanyEntity; -import net.gepafin.tendermanagement.entities.ProtocolEntity; -import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity; -import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse; import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; -import net.gepafin.tendermanagement.model.response.SystemEmailTemplateResponse; import net.gepafin.tendermanagement.repositories.CommunicationRepository; import net.gepafin.tendermanagement.service.ApplicationAmendmentRequestService; -import net.gepafin.tendermanagement.service.ApplicationService; -import net.gepafin.tendermanagement.service.SystemEmailTemplatesService; -import net.gepafin.tendermanagement.service.UserService; -import net.gepafin.tendermanagement.util.DateTimeUtil; -import net.gepafin.tendermanagement.util.MailUtil; -import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.slf4j.Logger; @@ -30,9 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.time.LocalDateTime; -import java.util.HashMap; import java.util.List; -import java.util.Map; @Component public class CommunicationDao { @@ -44,19 +29,6 @@ public class CommunicationDao { @Autowired ApplicationAmendmentRequestService applicationAmendmentRequestService; - @Autowired - private MailUtil mailUtil; - - @Autowired - private SystemEmailTemplatesService systemEmailTemplatesService; - - @Autowired - private ApplicationService applicationService; - - @Autowired - private UserService userService; - - public CommunicationResponseBean addCommentToAmendmentRequest(CommunicationRequestBean communicationReq, Long amendmentId) { log.info("Adding communication request..."); @@ -127,123 +99,4 @@ public class CommunicationDao { communicationEntity.setCommentedDate(LocalDateTime.now()); return communicationEntity; } - - public void sendMailToNotifyBeneficiaryRegardingNewAmendment(ApplicationAmendmentRequestEntity applicationAmendmentRequest) { - - ApplicationEntity applicationEntity = applicationService.validateApplication(applicationAmendmentRequest.getApplicationId()); - - SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( - SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, applicationEntity.getCall(), null); - - // Create the map for subject placeholders - Map subjectPlaceholders = new HashMap<>(); - subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); - - // Create the map for body placeholders - Map bodyPlaceholders = new HashMap<>(); - bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); - bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); - bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatLocalDateTime(applicationAmendmentRequest.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY)); - bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationAmendmentRequest.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); - bodyPlaceholders.put("{{form_dataInput}}", ""); - - // Replace placeholders in the subject and body - String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); - String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); - UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); - mailUtil.sendByMailGun(subject, body, List.of(userEntity.getBeneficiary().getEmail()), null); - } - - public void sendApplicationFailureNotificationEmail(String userEmail, ApplicationEntity applicationEntity) { - - CallEntity call = applicationEntity.getCall(); - CompanyEntity company = applicationEntity.getCompany(); - ProtocolEntity protocol = applicationEntity.getProtocol(); - SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( - SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, call, null); - - // Create the map for subject placeholders - Map subjectPlaceholders = new HashMap<>(); - subjectPlaceholders.put("{{call_name}}", call.getName()); - subjectPlaceholders.put("{{company_name}}", company.getCompanyName()); - - // Create the map for body placeholders - Map bodyPlaceholders = new HashMap<>(); - bodyPlaceholders.put("{{call_name}}", call.getName()); - bodyPlaceholders.put("{{date_time_emailSend}}", DateTimeUtil.formatLocalDateTime(protocol.getCreatedDate(), GepafinConstant.DD_MM_YYYY_HH_MM)); - - // Replace placeholders in the subject and body - String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); - String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); - - mailUtil.sendByMailGun(subject, body, List.of(userEmail), null); - mailUtil.sendByMailGun(subject, body, List.of(applicationEntity.getCompany().getEmail()), null); - } - - private void sendAdmissibilityNotificationEmail(UserEntity userEntity, ApplicationEntity applicationEntity) { - - CallEntity call = applicationEntity.getCall(); - CompanyEntity company = applicationEntity.getCompany(); - ProtocolEntity protocol = applicationEntity.getProtocol(); - SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( - SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, call, null); - - // Create the map for subject placeholders - Map subjectPlaceholders = new HashMap<>(); - subjectPlaceholders.put("{{call_name}}", call.getName()); - subjectPlaceholders.put("{{company_name}}", company.getCompanyName()); - - // Create the map for body placeholders - Map bodyPlaceholders = new HashMap<>(); - bodyPlaceholders.put("{{call_name}}", call.getName()); - bodyPlaceholders.put("{{protocol_number}}", protocol.getProtocolNumber().toString()); - bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(protocol.getCreatedDate())); - bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(protocol.getTime(), GepafinConstant.HH_MM_SS)); - - // Replace placeholders in the subject and body - String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); - String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); - - String email = userEntity.getEmail(); - if (userEntity.getBeneficiary() != null) { - email = userEntity.getBeneficiary().getEmail(); - } - mailUtil.sendByMailGun(subject, body, List.of(email), null); - mailUtil.sendByMailGun(subject, body, List.of(applicationEntity.getCompany().getEmail()), null); - } - - private void sendInadmissibilityTemplateEmail(UserEntity userEntity, ApplicationEntity applicationEntity) { - - CallEntity call = applicationEntity.getCall(); - CompanyEntity company = applicationEntity.getCompany(); - ProtocolEntity protocol = applicationEntity.getProtocol(); - SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( - SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, call, null); - - // Create the map for subject placeholders - Map subjectPlaceholders = new HashMap<>(); - subjectPlaceholders.put("{{call_name}}", call.getName()); - subjectPlaceholders.put("{{company_name}}", company.getCompanyName()); - - // Create the map for body placeholders - Map bodyPlaceholders = new HashMap<>(); - bodyPlaceholders.put("{{call_name}}", call.getName()); - bodyPlaceholders.put("{{protocol_number}}", protocol.getProtocolNumber().toString()); - bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatCreatedDate(protocol.getCreatedDate())); - bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(protocol.getTime(), GepafinConstant.HH_MM_SS)); - bodyPlaceholders.put("{{form_text}}", "YOUR_FORM_TEXT_HERE"); // Replace with actual data input if available - - // Replace placeholders in the subject and body - String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); - String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); - - String email = userEntity.getEmail(); - if (userEntity.getBeneficiary() != null) { - email = userEntity.getBeneficiary().getEmail(); - } - mailUtil.sendByMailGun(subject, body, List.of(email), null); - mailUtil.sendByMailGun(subject, body, List.of(applicationEntity.getCompany().getEmail()), null); - } - } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java new file mode 100644 index 00000000..cacbe281 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -0,0 +1,160 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.response.SystemEmailTemplateResponse; +import net.gepafin.tendermanagement.repositories.CallRepository; +import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.service.SystemEmailTemplatesService; +import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.util.MailUtil; +import net.gepafin.tendermanagement.util.Utils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +public class EmailNotificationDao { + + @Autowired + private MailUtil mailUtil; + + @Autowired + private SystemEmailTemplatesService systemEmailTemplatesService; + + @Autowired + private ApplicationService applicationService; + + @Autowired + private UserService userService; + + @Autowired + CallRepository callRepository; + + public void sendMailToNotifyBeneficiaryRegardingNewAmendment(ApplicationAmendmentRequestEntity applicationAmendmentRequest) { + + ApplicationEntity applicationEntity = applicationService.validateApplication(applicationAmendmentRequest.getApplicationId()); + + SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( + SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.DOCUMENTATION_INTEGRATION_REQUEST, applicationEntity.getCall(), null); + + // Create the map for subject placeholders + Map subjectPlaceholders = new HashMap<>(); + subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); + + // Create the map for body placeholders + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + bodyPlaceholders.put("{{protocol_number}}", applicationEntity.getProtocol().getProtocolNumber().toString()); + bodyPlaceholders.put("{{protocol_date}}", DateTimeUtil.formatLocalDateTime(applicationAmendmentRequest.getProtocol().getCreatedDate(), GepafinConstant.DD_MM_YYYY)); + bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationAmendmentRequest.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); + bodyPlaceholders.put("{{form_dataInput}}", ""); + + // Replace placeholders in the subject and body + String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); + String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); + mailUtil.sendByMailGun(subject, body, List.of(userEntity.getBeneficiary().getEmail()), null); + } + + public void sendApplicationFailureNotificationEmail(ApplicationAmendmentRequestEntity amendmentRequest) { + + ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); + SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( + SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE, applicationEntity.getCall(), null); + + // Create the map for subject placeholders + Map subjectPlaceholders = new HashMap<>(); + subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); + + // Create the map for body placeholders + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + bodyPlaceholders.put("{{date_time_emailSend}}", DateTimeUtil.formatLocalDateTime(amendmentRequest.getCreatedDate(), GepafinConstant.DD_MM_YYYY_HH_MM)); + + // Replace placeholders in the subject and body + String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); + String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); + if (userEntity.getBeneficiary().getEmail() != null) { + mailUtil.sendByMailGun(subject, body, List.of(userEntity.getBeneficiary().getEmail()), null); + } + } + + public void sendAdmissibilityNotificationEmailForApprovedApplication(ApplicationAmendmentRequestEntity amendmentRequest) { + + ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); + SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( + SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, applicationEntity.getCall(), null); + + // Create the map for subject placeholders + Map subjectPlaceholders = new HashMap<>(); + subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); + + // Create the map for body placeholders + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + 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)); + + // Replace placeholders in the subject and body + String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); + String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + + UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); + String userEmail; + String companyEmail; + if (userEntity.getBeneficiary().getEmail() != null && applicationEntity.getCompany().getEmail() != null) { + userEmail = userEntity.getBeneficiary().getEmail(); + companyEmail = applicationEntity.getCompany().getEmail(); + mailUtil.sendByMailGun(subject, body, List.of(userEmail), null); + mailUtil.sendByMailGun(subject, body, List.of(companyEmail), null); + } + } + + public void sendInadmissibilityEmailForRejectedApplication(ApplicationAmendmentRequestEntity amendmentRequest) { + + ApplicationEntity applicationEntity = applicationService.validateApplication(amendmentRequest.getApplicationId()); + SystemEmailTemplateResponse systemEmailTemplateResponse = systemEmailTemplatesService.retrieveTemplateByTypeAndCall( + SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, applicationEntity.getCall(), null); + + // Create the map for subject placeholders + Map subjectPlaceholders = new HashMap<>(); + subjectPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + subjectPlaceholders.put("{{company_name}}", applicationEntity.getCompany().getCompanyName()); + + // Create the map for body placeholders + Map bodyPlaceholders = new HashMap<>(); + bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); + 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}}", ""); + + // Replace placeholders in the subject and body + String subject = Utils.replacePlaceholders(systemEmailTemplateResponse.getSubject(), subjectPlaceholders); + String body = Utils.replacePlaceholders(systemEmailTemplateResponse.getHtmlContent(), bodyPlaceholders); + + UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); + String userEmail; + String companyEmail; + if (userEntity.getBeneficiary().getEmail() != null && applicationEntity.getCompany().getEmail() != null) { + userEmail = userEntity.getBeneficiary().getEmail(); + companyEmail = applicationEntity.getCompany().getEmail(); + mailUtil.sendByMailGun(subject, body, List.of(userEmail), null); + mailUtil.sendByMailGun(subject, body, List.of(companyEmail), null); + } + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 608786e9..55ff393d 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -17,4 +17,10 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository findByUserId(@Param("userId") Long userId); + + List findByIsDeletedFalse(); + + @Query(value = "SELECT amr FROM ApplicationAmendmentRequestEntity amr " + "WHERE amr.applicationEvaluationEntity.id = :id " + "AND amr.applicationEvaluationEntity.isDeleted = false") + ApplicationAmendmentRequestEntity findByApplicationEvaluationIdAndIsDeletedFalse(Long id); + } diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java index 43d844b0..f83af795 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java @@ -1,72 +1,65 @@ -//package net.gepafin.tendermanagement.scheduler; -// -//import net.gepafin.tendermanagement.dao.CommunicationDao; -//import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; -//import net.gepafin.tendermanagement.entities.ApplicationEntity; -//import net.gepafin.tendermanagement.entities.UserEntity; -//import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRepository; -//import net.gepafin.tendermanagement.repositories.ApplicationRepository; -//import net.gepafin.tendermanagement.repositories.UserRepository; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.scheduling.annotation.Scheduled; -//import org.springframework.stereotype.Component; -// -//import java.time.LocalDateTime; -//import java.util.List; -// -//@Component -//public class NotificationScheduler { -// -// @Autowired -// UserRepository userRepository; -// -// @Autowired -// ApplicationRepository applicationRepository; -// -// @Autowired -// ApplicationAmendmentRepository applicationAmendmentRepository; -// -// @Autowired -// CommunicationDao communicationDao; -// -// @Scheduled(cron = "0 0/10 * * * ?", zone = "Asia/Kolkata") -// void sendNotificationForRejectedApplicationToBeneficiary() { -// -// List applicationsList = applicationRepository.findByIsDeletedFalse(); -// List amendmentRequestList = applicationAmendmentRepository.findByIsDeletedFalse(); -// -// LocalDateTime today = LocalDateTime.now(); -// -// for (ApplicationEntity application : applicationsList) { -// ApplicationAmendmentRequestEntity amendmentRequest = getAmendmentRequestForApplication(application, amendmentRequestList); -// -// if (amendmentRequest != null) { -// LocalDateTime requestDate = amendmentRequest.getStartedDate(); -// -// // Check if requestDate + 7 days is less than or equal to today -// if (requestDate.plusDays(7).isAfter(today)) { -// // Update the application status to REJECTED -// application.setStatus("REJECTED"); -// applicationRepository.save(application); // Save updated application -// -// // Update the amendment request status to CLOSED -// amendmentRequest.setStatus("CLOSED"); -// applicationAmendmentRepository.save(amendmentRequest); // Save updated amendment request -// -// // Get the user associated with the application -// UserEntity user = userRepository.findById(application.getUserId()).orElse(null); // Adjust according to your UserRepository's method -// -// // Send email notification if user is found -// if (user != null && user.getEmail() != null) { -// communicationDao.sendApplicationFailureNotificationEmail(user.getEmail(), application); -// } -// } -// } -// } -// } -// -// private ApplicationAmendmentRequestEntity getAmendmentRequestForApplication(ApplicationEntity application, List amendmentRequestList) { -// -// return amendmentRequestList.stream().filter(request -> request.getId().equals(application.getId())).findFirst().orElse(null); -// } -//} +package net.gepafin.tendermanagement.scheduler; + +import net.gepafin.tendermanagement.dao.EmailNotificationDao; +import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; +import net.gepafin.tendermanagement.repositories.ApplicationRepository; +import net.gepafin.tendermanagement.repositories.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; + +@Component +public class NotificationScheduler { + + @Autowired + UserRepository userRepository; + + @Autowired + ApplicationRepository applicationRepository; + + @Autowired + ApplicationAmendmentRequestRepository applicationAmendmentRepository; + + @Autowired + EmailNotificationDao emailNotificationDao; + + @Scheduled(cron = "0 0/1 * * * ?") + void sendNotificationForRejectedApplicationToBeneficiary() { + + List applicationsList = applicationRepository.findByIsDeletedFalse(); + List amendmentRequestList = applicationAmendmentRepository.findByIsDeletedFalse(); + + LocalDateTime today = LocalDateTime.now(); + + for (ApplicationEntity application : applicationsList) { + ApplicationAmendmentRequestEntity amendmentRequest = getAmendmentRequestForApplication(application, amendmentRequestList); + + if (amendmentRequest != null) { + LocalDateTime requestDate = amendmentRequest.getCreatedDate(); + + // Eg :- Check if requestDate + 7 days is less than or equal to today + if (requestDate.plusDays(amendmentRequest.getResponseDays()).isAfter(today)) { + // Update the application status to REJECTED + application.setStatus("REJECTED"); + applicationRepository.save(application); // Save updated application + + // Update the amendment request status to CLOSED + // amendmentRequest.setStatus("CLOSE"); + // applicationAmendmentRepository.save(amendmentRequest); // Save updated amendment request + emailNotificationDao.sendApplicationFailureNotificationEmail(amendmentRequest); + } + } + } + } + + private ApplicationAmendmentRequestEntity getAmendmentRequestForApplication(ApplicationEntity application, List amendmentRequestList) { + + return amendmentRequestList.stream().filter(request -> request.getId().equals(application.getId())).findFirst().orElse(null); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java index 08174b06..4296eff9 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationAmendmentRequestApi.java @@ -72,7 +72,7 @@ public interface ApplicationAmendmentRequestApi { @GetMapping(value = "", produces = "application/json") ResponseEntity> getApplicationAmendmentRequestById(HttpServletRequest request,@Parameter(description = "The application amendment id", required = true) @RequestParam(value = "id", required = true) Long id); - @Operation(summary = "Api to get all applications amendment request", + @Operation(summary = "Api to get all applications amendment request by preInstructor user Id", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -109,7 +109,7 @@ public interface ApplicationAmendmentRequestApi { @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 = "/beneficiary/{id}", produces = "application/json") + @GetMapping(value = "/beneficiary/user/{id}", produces = "application/json") ResponseEntity>> getAllAmendmentRequestByBeneficiaryId(HttpServletRequest request, @Parameter(description = "Id", required = false) @PathVariable(value = "id",required = false) Long beneficiaryId); @Operation(summary = "Api to extend response days for an amendment request", diff --git a/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_27_10_2024.sql b/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_27_10_2024.sql index 60556052..360bdd30 100644 --- a/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_27_10_2024.sql +++ b/src/main/resources/db/dump/insert_system_email_template_for_notification_mail_27_10_2024.sql @@ -47,7 +47,7 @@ VALUES ( 4, 'Notification of Inadmissibility Due to Failure to Respond Template', - 'INADMISSIBILITY_NOTIFICATION', + 'INADMISSIBILITY_NOTIFICATION_DUE_TO_FAILURE', '
diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index e44ffd21..2a302b95 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -295,11 +295,11 @@ application.amendment.get.success = Application Amendment details fetched succes application.amendment.update.successfully = Application Amendment Updated Successfully. response.days.extended.success=Response days extended successfully. -added.comment.to.amendment.request.success = Application Amendment Comment Added Successfully.; -comment.not.found = Comment Not Found."; -comment.updated.successfully = Comment Updated Successfully."; -comment.deleted.successfully = Comment Deleted Successfully."; -comment.not.associate.with.amendment = Comment Not Associated with Amendment Request."; -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."; +added.comment.to.amendment.request.success = Application Amendment Comment Added Successfully. +comment.not.found = Comment Not Found. +comment.updated.successfully = Comment Updated Successfully. +comment.deleted.successfully = Comment Deleted Successfully. +comment.not.associate.with.amendment = Comment Not Associated with Amendment Request. +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 diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index d3b7fccb..9607f3b1 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -296,5 +296,5 @@ comment.deleted.successfully = Commento eliminato con successo. comment.not.associate.with.amendment = Il commento non � associato alla richiesta di emendamento. 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. +DD_MM_YYYY_HH_MM = dd_MM_yyyy HH:mm create.application.data.amendment.msg =Emendamento alla domanda inviato con successo