diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 371437a6..813790f6 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -622,6 +622,7 @@ public class GepafinConstant { public static final String SUBJECT = "subject"; public static final List MANUAL_EMAIL_KEYS = Arrays.asList(SUBJECT, MESSAGE); public static final String INVALID_EMAIL_JSON = "invalid.email.json"; + public static final String MORE_FIELDS_REQUIRED_FOR_REJECTION="more.fields.required"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 76d17211..ed5f6362 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -604,6 +604,8 @@ public class ApplicationAmendmentRequestDao { String body = emailContent.getBody(); response.setEmailTemplate(body); } + response.setAmendmentType(entity.getType()); + response.setAmendmentDocumentType(entity.getAmendmentDocumentType()); return response; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index f5ba0615..66fda669 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -19,8 +19,10 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.apache.commons.lang3.StringUtils; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; +import org.springframework.web.multipart.MultipartFile; import java.math.BigDecimal; import java.text.MessageFormat; @@ -146,6 +148,11 @@ public class ApplicationEvaluationDao { @Autowired private EmailDao emailDao; + @Autowired + private DocumentDao documentDao; + + @Value("${default.hub.uuid}") + private String defaultHubUuid; private ApplicationEvaluationEntity convertToEntity(UserEntity user, ApplicationEvaluationRequest req, Long assignedApplciationId) { @@ -182,7 +189,7 @@ public class ApplicationEvaluationDao { ApplicationEvaluationResponse response = new ApplicationEvaluationResponse(); populateBasicDetails(entity, response); - + ApplicationEntity applicationEntity=entity.getAssignedApplicationsEntity().getApplication(); CallEntity call = callRepository.findCallEntityByApplicationId(entity.getApplicationId()); List evaluationCriterias = evaluationCriteriaRepository .findByCallIdAndLookupDataTypeAndIsDeletedFalse(call.getId(), LookUpDataEntity.LookUpDataTypeEnum.EVALUATION_CRITERIA.getValue()); @@ -201,10 +208,39 @@ public class ApplicationEvaluationDao { List allDocs = prepareEvaluationDocumentBeanList(entity); setEvaluationDocResponse(response, allDocs); setApplicationDetails(response, entity); + setRejectedDocuments(applicationEntity, response); return response; } + private void setRejectedDocuments(ApplicationEntity applicationEntity, ApplicationEvaluationResponse response) { + List initialDocumentBeans = new ArrayList<>(); + String initialDocuments = applicationEntity.getRejectedDocument(); + + if (initialDocuments != null && !initialDocuments.trim().isEmpty()) { + // Split the comma-separated values and process them + List documentIds = Arrays.stream(initialDocuments.split(",")) + .map(String::trim) + .filter(id -> !id.isEmpty()) + .collect(Collectors.toList()); + + initialDocumentBeans.addAll( + documentIds.stream() + .map(id -> { + try { + return applicationAmendmentRequestDao.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.setRejectedDocument(initialDocumentBeans); + } + private void setAmendmentDetails(ApplicationEvaluationEntity entity, ApplicationEvaluationResponse response) { List amendmentRequests=applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); List amendmentDocumentResponseBeans=new ArrayList<>(); @@ -653,7 +689,7 @@ public class ApplicationEvaluationDao { public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation( UserEntity user, ApplicationEvaluationRequest req, - Long assignedApplicationId) { + Long assignedApplicationId, List rejectedDocuments) { log.info("Start createOrUpdateApplicationEvaluation: assignedApplicationId={}, userId={}", assignedApplicationId, user.getId()); Optional existingEntityOptional = @@ -741,7 +777,7 @@ public class ApplicationEvaluationDao { if (status != null) { AssignedApplicationsEntity assignedApplicationsEntity = assignedApplications.get(); - return updateApplicationEvaluationStatus(application, assignedApplicationsEntity, status); + return updateApplicationEvaluationStatus(application, assignedApplicationsEntity, status,rejectedDocuments,req); } else { return convertToResponse(entity); } @@ -1903,7 +1939,7 @@ public class ApplicationEvaluationDao { } public ApplicationEvaluationResponse updateApplicationEvaluationStatus(ApplicationEntity application, AssignedApplicationsEntity assignedApplicationsEntity, - ApplicationStatusForEvaluation newStatus) { + ApplicationStatusForEvaluation newStatus, List files,ApplicationEvaluationRequest applicationEvaluationRequest) { log.info("Starting updateApplicationEvaluationStatus for applicationId: {}, assignedApplicationId: {}, newStatus: {}", application.getId(), assignedApplicationsEntity.getId(), newStatus); @@ -1942,17 +1978,17 @@ public class ApplicationEvaluationDao { log.info("Application status updated to {} for applicationId: {}", newStatus, application.getId()); } -// if(newStatus.equals(ApplicationStatusForEvaluation.TECHNICAL_EVALUATION_REJECTED)) { -// application.setStatus(newStatus.getValue()); -// log.info("Application status updated to {} for applicationId: {}", newStatus, application.getId()); -// emailNotificationDao.sendMailForApplicationTechnicalEvaluationRejected(application,hub,existingEntity); -// application.setDateRejected(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); -// emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); -// responses = List.of(emailSendResponse); -// if (!Boolean.TRUE.equals(emailSendResponse.getIsEmailSend())) { -// saveEmailSendResponseToEvaluation(emailSendResponse, existingEntity); -// } -// } + if(newStatus.equals(ApplicationStatusForEvaluation.TECHNICAL_EVALUATION_REJECTED)) { + application.setStatus(newStatus.getValue()); + log.info("Application status updated to {} for applicationId: {}", newStatus, application.getId()); + emailNotificationDao.sendMailForApplicationTechnicalEvaluationRejected(application,hub,existingEntity); + application.setDateRejected(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); + responses = List.of(emailSendResponse); + if (!Boolean.TRUE.equals(emailSendResponse.getIsEmailSend())) { + saveEmailSendResponseToEvaluation(emailSendResponse, existingEntity); + } + } application = applicationRepository.save(application); ApplicationEvaluationEntity oldApplicationEvaluation = Utils.getClonedEntityForData(existingEntity); @@ -1997,10 +2033,28 @@ public class ApplicationEvaluationDao { notificationDao.sendNotificationToBeneficiary(application, NotificationTypeEnum.EVALUATION_RESULT); } if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.REJECTED.getValue())))) { + String tipoInammissibilita =null; + if(Boolean.TRUE.equals(hub.getUniqueUuid().equals(defaultHubUuid))) { + if (applicationEvaluationRequest.getMotivation() == null || applicationEvaluationRequest.getRejectedReason() == null) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.MORE_FIELDS_REQUIRED_FOR_REJECTION)); + } + if (files != null) { + List documentResponseBeans = uploadRejectedDocument(user.getId(), files, application); + List rejectedDocumentIds = documentResponseBeans.stream() + .map(DocumentResponseBean::getId) + .collect(Collectors.toList()); + String rejectedDocumentId = rejectedDocumentIds.stream() + .map(String::valueOf) + .collect(Collectors.joining(",")); + application.setRejectedDocument(rejectedDocumentId); + } + tipoInammissibilita=applicationEvaluationRequest.getRejectedReason(); + application.setRejectedReason(applicationEvaluationRequest.getRejectedReason()); + } application.setDateRejected(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); application.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); application = applicationRepository.save(application); - emailNotificationDao.sendInadmissibilityEmailForRejectedApplication(application,existingEntity); + emailNotificationDao.sendInadmissibilityEmailForRejectedApplication(application,existingEntity,tipoInammissibilita); emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); responses = List.of(emailSendResponse); if (!Boolean.TRUE.equals(emailSendResponse.getIsEmailSend())) { @@ -2083,7 +2137,7 @@ public class ApplicationEvaluationDao { return convertToResponse(savedEntity); } - public ApplicationEvaluationFormResponse createApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, Long evaluationFormId, Long assignedApplicationId){ + public ApplicationEvaluationFormResponse createApplicationEvaluation(HttpServletRequest request, List files, ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, Long evaluationFormId, Long assignedApplicationId){ log.info("Start createApplicationEvaluation - assignedApplicationId: {}, evaluationFormId: {}", assignedApplicationId, evaluationFormId); UserEntity user = validator.validateUser(request); @@ -2094,7 +2148,7 @@ public class ApplicationEvaluationDao { ApplicationEvaluationRequest req = convertToApplicationEvaluationRequest(applicationEvaluationFormRequestBean); // Call the existing method to create or update evaluation - ApplicationEvaluationResponse evaluationResponse = createOrUpdateApplicationEvaluation(user, req, assignedApplicationId); + ApplicationEvaluationResponse evaluationResponse = createOrUpdateApplicationEvaluation(user, req, assignedApplicationId,files); ApplicationEvaluationEntity entity = applicationEvaluationService.validateApplicationEvaluation(evaluationResponse.getId()); @@ -2415,7 +2469,7 @@ public class ApplicationEvaluationDao { request.setApplicationStatus(formRequestBean.getApplicationStatus()); request.setMotivation(formRequestBean.getMotivation()); request.setAmountAccepted(formRequestBean.getAmountAccepted()); - + request.setRejectedReason(formRequestBean.getRejectedReason()); request.setCriteria(null); request.setChecklist(null); @@ -2625,7 +2679,6 @@ public class ApplicationEvaluationDao { log.info("Application status updated to {} for applicationId: {}", ApplicationStatusForEvaluation.TECHNICAL_EVALUATION_REJECTED, application.getId()); emailNotificationDao.sendMailForApplicationTechnicalEvaluationRejected(application, hub, existingEntity); application.setDateRejected(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - application.setEmailJson(Utils.convertMapIntoJsonString(applicationRequest.getEmailJson())); emailSendResponse = emailDao.buildEmailSendResponseFromRequest(request); responses = List.of(emailSendResponse); if (!Boolean.TRUE.equals(emailSendResponse.getIsEmailSend())) { @@ -2643,5 +2696,11 @@ public class ApplicationEvaluationDao { } return null; } + public List uploadRejectedDocument(Long userId,List files,ApplicationEntity application){ + if(files!=null) { + return documentDao.uploadFiles(userId, files, application.getId(), DocumentSourceTypeEnum.APPLICATION, DocumentTypeEnum.DOCUMENT); + } + return new ArrayList<>(); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index 0df566f5..1a3c2e05 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -116,7 +116,7 @@ public class AssignedApplicationsDao { UserEntity user = userService.validateUser(userId); AssignedApplicationsEntity assignment = createAssignmentEntity(application, user.getId(), assignedByUser, assignedApplicationsRequest); - applicationEvaluationDao.createOrUpdateApplicationEvaluation(user, new ApplicationEvaluationRequest(), assignment.getId()); + applicationEvaluationDao.createOrUpdateApplicationEvaluation(user, new ApplicationEvaluationRequest(), assignment.getId(),null); AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment); log.info("Application assigned succesfully {}", assignApplicationToInstructorResponse); return assignApplicationToInstructorResponse; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java index 81960f9d..ef7619b2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CommunicationDao.java @@ -12,7 +12,6 @@ import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; -import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse; import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.repositories.CommunicationRepository; @@ -117,7 +116,7 @@ public class CommunicationDao { return "Deleted Comment Successfully."; } - public ApplicationAmendmentResponse getAmendmentComments(Long amendmentId) { + public List getAmendmentComments(Long amendmentId) { ApplicationAmendmentRequestEntity amendmentData = applicationAmendmentRequestService.validateApplicationAmendmentRequest(amendmentId); List commentsList = communicationRepository.findByApplicationAmendmentRequestIdAndIsDeletedFalse(amendmentId); @@ -130,7 +129,7 @@ public class CommunicationDao { CommunicationResponseBean communicationResponseBean=convertToCommunicationResponseBean(communicationEntity,communicationDocumentBeans); communicationResponseBeans.add(communicationResponseBean); } - return new ApplicationAmendmentResponse(amendmentData, communicationResponseBeans); + return communicationResponseBeans; } public CommunicationResponseBean updateAmendmentComment(CommunicationRequestBean communicationRequestBean, Long amendmentId, Long commentId) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java index cc676a7b..bc35b897 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EmailNotificationDao.java @@ -158,8 +158,15 @@ public class EmailNotificationDao { : new HashSet<>(documentIds); documentEntities=documentRepository.findAllByIdInAndIsDeletedFalse(setOfDocumentIds); } + if(Boolean.TRUE.equals(userEntity.getHub().getUniqueUuid().equals(defaultHubUuid)) && Boolean.TRUE.equals(systemEmailTemplateResponse.getEmailScenario().equals(EmailScenarioTypeEnum.APPLICATION_REJECTED))) { + List documentIds=applicationDao.validateDocumentIds(applicationEntity.getRejectedDocument()); + Set setOfDocumentIds = (documentIds == null) + ? Collections.emptySet() + : new HashSet<>(documentIds); + documentEntities=documentRepository.findAllByIdInAndIsDeletedFalse(setOfDocumentIds); + } - urls = documentEntities.stream() + urls = documentEntities.stream() .map(DocumentEntity::getFilePath) // or getUrl() .collect(Collectors.toList()); if(Boolean.FALSE.equals(urls.isEmpty())) { @@ -376,7 +383,7 @@ public class EmailNotificationDao { sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.ADMISSIBILITY_NOTIFICATION, bodyPlaceholders, null,null); } - public void sendInadmissibilityEmailForRejectedApplication(ApplicationEntity applicationEntity,ApplicationEvaluationEntity applicationEvaluationEntity) { + public void sendInadmissibilityEmailForRejectedApplication(ApplicationEntity applicationEntity,ApplicationEvaluationEntity applicationEvaluationEntity,String tipoInammissibilita) { Map bodyPlaceholders = new HashMap<>(); bodyPlaceholders.put("{{call_name}}", applicationEntity.getCall().getName()); String protocolNumber=applicationEntity.getProtocol().getExternalProtocolNumber(); @@ -390,8 +397,9 @@ public class EmailNotificationDao { } bodyPlaceholders.put("{{protocol_date}}", protocolDate); bodyPlaceholders.put("{{protocol_time}}", DateTimeUtil.parseLocalTimeToString(applicationEntity.getProtocol().getTime(), GepafinConstant.HH_MM_SS)); + HubEntity hubEntity = hubService.valdateHub(applicationEntity.getHubId()); + bodyPlaceholders.put("{{tipo_inammissibilita}}", tipoInammissibilita); bodyPlaceholders.put("{{form_text}}", applicationEvaluationEntity.getMotivation()); - sendEmail(applicationEntity, SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum.INADMISSIBILITY_TEMPLATE, bodyPlaceholders, null,null); } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java index 11182c78..8b8c64d7 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java @@ -79,9 +79,12 @@ public class ApplicationEntity extends BaseEntity { @Column(name="VAT_NUMBER") private String vatNumber; - @Column(name = "EMAIL_JSON") - private String emailJson; - @Column(name = "PREVIOUS_STATUS") private String previousStatus; + + @Column(name = "REJECTED_REASON") + private String rejectedReason; + + @Column(name = "REJECTED_DOCUMENT") + private String rejectedDocument; } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationFormRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationFormRequestBean.java index d2c0e2dc..5564f08b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationFormRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationFormRequestBean.java @@ -16,4 +16,5 @@ public class ApplicationEvaluationFormRequestBean { private List formFields; private String motivation; private BigDecimal amountAccepted; + private String rejectedReason; } 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 bd63054c..e19358c9 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationEvaluationRequest.java @@ -17,4 +17,5 @@ public class ApplicationEvaluationRequest { private ApplicationStatusForEvaluation applicationStatus; private String motivation; private BigDecimal amountAccepted; + private String rejectedReason; } 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 c1fda306..b0df6e1c 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java @@ -34,4 +34,6 @@ public class ApplicationAmendmentRequestResponse { private String emailTemplate; private List emailSendResponse; private List amendmentInitialDocuments; + private String amendmentType; + private String amendmentDocumentType; } 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 49f07c6f..296d7f6b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -50,5 +50,6 @@ public class ApplicationEvaluationResponse { private String companyVatNumber; private String companyCodiceAteco; private List emailSendResponse; + private List rejectedDocument; } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java index 45851c4d..e8cfd308 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationEvaluationService.java @@ -5,6 +5,7 @@ import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.*; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -12,7 +13,7 @@ public interface ApplicationEvaluationService { ApplicationEvaluationResponse createOrUpdateApplicationEvaluation( HttpServletRequest request, ApplicationEvaluationRequest applicationEvaluationRequest, - Long assignedApplicationsId); + Long assignedApplicationsId, List rejectedDocuments); void deleteApplicationEvaluation(HttpServletRequest request,Long id); @@ -21,7 +22,7 @@ public interface ApplicationEvaluationService { ApplicationEvaluationEntity validateApplicationEvaluationByApplicationId(Long applicationId); - ApplicationEvaluationFormResponse createApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, Long evaluationId, Long evaluationFormId); + ApplicationEvaluationFormResponse createApplicationEvaluation(HttpServletRequest request, List rejectedDocuments, ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, Long evaluationId, Long evaluationFormId); ApplicationEvaluationFormResponse getApplicationEvaluationForm(HttpServletRequest request, Long applicationId, Long assignedApplicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/CommunicationService.java b/src/main/java/net/gepafin/tendermanagement/service/CommunicationService.java index 00b997b6..ac25493d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CommunicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CommunicationService.java @@ -2,7 +2,6 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; -import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse; import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; import org.springframework.web.multipart.MultipartFile; @@ -15,5 +14,5 @@ public interface CommunicationService { CommunicationResponseBean updateAmendmentComment(HttpServletRequest request,CommunicationRequestBean communicationRequestBean, Long amendmentId, Long commentId); - ApplicationAmendmentResponse getAmendmentComments(HttpServletRequest request,Long id); + List getAmendmentComments(HttpServletRequest request,Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java index 4033dd70..5d64f783 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationEvaluationServiceImpl.java @@ -22,6 +22,7 @@ import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -47,13 +48,13 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation( HttpServletRequest request, ApplicationEvaluationRequest req, - Long assignedApplicationsId) { + Long assignedApplicationsId, List rejectedDocuments) { AssignedApplicationsEntity assignedApplication =assignedApplicationsService.validateAssignedApplication(assignedApplicationsId); UserEntity user = validator.validatePreInstructor(request, assignedApplication.getUserId()); - return applicationEvaluationDao.createOrUpdateApplicationEvaluation(user, req, assignedApplication.getId()); + return applicationEvaluationDao.createOrUpdateApplicationEvaluation(user, req, assignedApplication.getId(),rejectedDocuments); } @Override @@ -88,10 +89,10 @@ public class ApplicationEvaluationServiceImpl implements ApplicationEvaluationSe @Override @Transactional(rollbackFor = Exception.class) - public ApplicationEvaluationFormResponse createApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, Long assignedApplicationId, Long evaluationFormId) { + public ApplicationEvaluationFormResponse createApplicationEvaluation(HttpServletRequest request, List rejectedDocuments, ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, Long assignedApplicationId, Long evaluationFormId) { AssignedApplicationsEntity assignedApplicationsEntity = assignedApplicationsService.validateAssignedApplication(assignedApplicationId); validator.validatePreInstructor(request, assignedApplicationsEntity.getUserId()); - return applicationEvaluationDao.createApplicationEvaluation(request,applicationEvaluationFormRequestBean,evaluationFormId,assignedApplicationId); + return applicationEvaluationDao.createApplicationEvaluation(request,rejectedDocuments,applicationEvaluationFormRequestBean,evaluationFormId,assignedApplicationId); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationServiceImpl.java index e0f125ae..a1096feb 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CommunicationServiceImpl.java @@ -5,7 +5,6 @@ import net.gepafin.tendermanagement.dao.ApplicationAmendmentRequestDao; import net.gepafin.tendermanagement.dao.CommunicationDao; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; 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.service.CommunicationService; import net.gepafin.tendermanagement.util.Validator; @@ -66,7 +65,7 @@ public class CommunicationServiceImpl implements CommunicationService { @Override @Transactional(rollbackFor = Exception.class) - public ApplicationAmendmentResponse getAmendmentComments(HttpServletRequest request,Long id) { + public List getAmendmentComments(HttpServletRequest request,Long id) { ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(id); if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) { validator.validatePreInstructor(request, applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getUserId()); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java index b2ff117e..30e0750d 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationEvaluationApi.java @@ -15,6 +15,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -28,11 +29,12 @@ public interface ApplicationEvaluationApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PutMapping(value = "/{assignedApplicationsId}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PutMapping(value = "/{assignedApplicationsId}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE) ResponseEntity> createOrUpdateApplicationEvaluation( HttpServletRequest request, - @Parameter(description = "Assigned Application ID", required = true) @PathVariable("assignedApplicationsId") Long assignedApplicationsId, - @Parameter(description = "Application Evaluation Request Body", required = true) @Valid @RequestBody ApplicationEvaluationRequest evaluationRequest); + @Parameter(description = "Assigned Application ID", required = true) @PathVariable("assignedApplicationsId") Long assignedApplicationsId, @Parameter(description = "List of files to upload", required = false) + @RequestPart(required = false) List rejectedDocuments, + @Parameter(description = "Application Evaluation Request Body", required = true) @RequestPart ApplicationEvaluationRequest evaluationRequest); @Operation(summary = "API to get ApplicationEvaluation data for evaluation process", responses = { @@ -67,9 +69,10 @@ public interface ApplicationEvaluationApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PutMapping(value = "/v2/assignedApplication/{id}", - produces = { "application/json" }) - ResponseEntity> createApplicationEvaluation(HttpServletRequest request, - @Valid @RequestBody ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, + produces = { "application/json" },consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + ResponseEntity> createApplicationEvaluation(HttpServletRequest request, @Parameter(description = "List of files to upload", required = false) + @RequestPart(required = false) List rejectedDocuments, + @RequestPart ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, @Parameter(description = "Assigned Application ID", required = true) @PathVariable(value = "id", required = true) Long assignedApplicationId, @Parameter(description = "The evaluation form ID", required = true) @RequestParam("evaluationFormId") Long evaluationFormId); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationApi.java index 78ecf16e..6f9d9ddc 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CommunicationApi.java @@ -7,7 +7,6 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; 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.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -44,7 +43,7 @@ public interface CommunicationApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE))) }) @GetMapping(value = "/{amendmentId}", produces = "application/json") - public ResponseEntity> getAmendmentComments(HttpServletRequest request,@PathVariable(value = "amendmentId") Long amendmentId); + public ResponseEntity>> getAmendmentComments(HttpServletRequest request,@PathVariable(value = "amendmentId") Long amendmentId); @Operation(summary = "Api to update communication comments", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java index 21739f40..11e1eb1c 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationEvaluationApiController.java @@ -18,6 +18,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -34,7 +35,7 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation @Override public ResponseEntity> createOrUpdateApplicationEvaluation( HttpServletRequest request, - Long assignedApplicationsId, + Long assignedApplicationsId, List rejectedDocuments, ApplicationEvaluationRequest evaluationRequest) { /** This code is responsible for creating user action logs for the "Create or update Application Evaluation" operation. **/ @@ -43,7 +44,7 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation ApplicationEvaluationResponse response = applicationEvaluationService.createOrUpdateApplicationEvaluation( - request, evaluationRequest, assignedApplicationsId); + request, evaluationRequest, assignedApplicationsId,rejectedDocuments); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_REQUEST_COMPLETED))); @@ -82,13 +83,13 @@ public class ApplicationEvaluationApiController implements ApplicationEvaluation } @Override - public ResponseEntity> createApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, Long assignedApplicationId, Long evaluationFormId) { + public ResponseEntity> createApplicationEvaluation(HttpServletRequest request, List rejectedDocuments, ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, Long assignedApplicationId, Long evaluationFormId) { /** This code is responsible for creating user action logs for the "Create or update application evaluation form" operation. **/ loggingUtil.logUserAction( UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE).actionContext(UserActionContextEnum.CREATE_UPDATE_APPLICATION_EVALUATION_FORM).build()); - ApplicationEvaluationFormResponse applicationEvaluationResponseBean = applicationEvaluationService.createApplicationEvaluation(request, applicationEvaluationFormRequestBean, assignedApplicationId, evaluationFormId); + ApplicationEvaluationFormResponse applicationEvaluationResponseBean = applicationEvaluationService.createApplicationEvaluation(request,rejectedDocuments, applicationEvaluationFormRequestBean, assignedApplicationId, evaluationFormId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(applicationEvaluationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CREATED_SUCCESSFULLY))); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationController.java index 5473d560..83b83fb3 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CommunicationController.java @@ -7,7 +7,6 @@ import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.CommunicationRequestBean; import net.gepafin.tendermanagement.model.request.UserActionRequest; -import net.gepafin.tendermanagement.model.response.ApplicationAmendmentResponse; import net.gepafin.tendermanagement.model.response.CommunicationResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.CommunicationService; @@ -45,12 +44,12 @@ public class CommunicationController implements CommunicationApi { .body(new Response<>(communicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMMUNICATION_ADDED_TO_AMENDMENT_REQUEST_SUCCESS))); } @Override - public ResponseEntity> getAmendmentComments(HttpServletRequest request,Long amendmentId) { + public ResponseEntity>> getAmendmentComments(HttpServletRequest request,Long amendmentId) { /** This code is responsible for creating user action logs for the "getting comment of amendment" operation. **/ loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_AMENDMENT_COMMENT).build()); - ApplicationAmendmentResponse response = communicationService.getAmendmentComments(request,amendmentId); + List response = communicationService.getAmendmentComments(request,amendmentId); return ResponseEntity.ok(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.AMENDMENT_FOUND_SUCCESS))); } @Override diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 12afc8f4..d06919f3 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -3074,4 +3074,17 @@ + + + + + + + + + + + + + diff --git a/src/main/resources/db/dump/update_system_email_template_of_application_rejected_16_10_2025.sql b/src/main/resources/db/dump/update_system_email_template_of_application_rejected_16_10_2025.sql new file mode 100644 index 00000000..fb8bd4a2 --- /dev/null +++ b/src/main/resources/db/dump/update_system_email_template_of_application_rejected_16_10_2025.sql @@ -0,0 +1,18 @@ +UPDATE gepafin_schema.system_email_template +SET html_content = ' + +
+

Buongiorno,

+

Si comunica che, in riferimento alla domanda a valere sul bando “{{call_name}}” di cui al + Protocollo n. {{protocol_number}} del {{protocol_date}} alle {{protocol_time}}, +

+

+ {{tipo_inammissibilita}}.

+

Le motivazioni sono le seguenti: {{form_text}}

+

Vi ricordiamo che i Beneficiari che hanno presentato richieste valutate non ammissibili entro 10 giorni dalla data di ricevimento della presente potranno finoltrare richiesta di chiarimenti e/o osservazioni alla scrivente Società ai sensi e per gli effetti dell’art.10 bis della L.241/1990 e s.m.i.

+

Distinti Saluti,

+

{{email_signature}}

+
+ + ' +WHERE "type" = 'INADMISSIBILITY_NOTIFICATION' and "email_scenario" = 'APPLICATION_REJECTED' and "system" = true; \ No newline at end of file diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 4357cac5..c02deff6 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -415,5 +415,6 @@ end.date.greater.than.now=End date must be greater than the current date and tim pec.email.required=PEC email is required. application.technical.evaluation.rejected.success=Application changes to status application technical evaluation rejected successfully. invalid.email.json=Invalid email json. +more.fields.required=Subject, reason, and motivation are required when rejecting the application. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 8a027a3a..e18f529a 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -406,3 +406,4 @@ end.date.greater.than.now=La data di fine deve essere successiva alla data e all pec.email.required=Obbligatorio l'indirizzo e-mail PEC. application.technical.evaluation.rejected.success=Lo stato dell'applicazione cambia: valutazione tecnica dell'applicazione rifiutata con successo. invalid.email.json=Codice email json non valido. +more.fields.required=Per rifiutare la domanda sono richiesti oggetto, motivo e motivazione.