Resolved conflict of PR Updated Application Rejection Flow

This commit is contained in:
rajesh
2025-10-16 17:40:56 +05:30
parent 42538bfb19
commit e51bee3fa5
23 changed files with 166 additions and 54 deletions

View File

@@ -621,6 +621,7 @@ public class GepafinConstant {
public static final String SUBJECT = "subject";
public static final List<String> 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";
}

View File

@@ -604,6 +604,8 @@ public class ApplicationAmendmentRequestDao {
String body = emailContent.getBody();
response.setEmailTemplate(body);
}
response.setAmendmentType(entity.getType());
response.setAmendmentDocumentType(entity.getAmendmentDocumentType());
return response;
}

View File

@@ -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<EvaluationCriteriaEntity> evaluationCriterias = evaluationCriteriaRepository
.findByCallIdAndLookupDataTypeAndIsDeletedFalse(call.getId(), LookUpDataEntity.LookUpDataTypeEnum.EVALUATION_CRITERIA.getValue());
@@ -201,10 +208,39 @@ public class ApplicationEvaluationDao {
List<EvaluationDocumentRequest> allDocs = prepareEvaluationDocumentBeanList(entity);
setEvaluationDocResponse(response, allDocs);
setApplicationDetails(response, entity);
setRejectedDocuments(applicationEntity, response);
return response;
}
private void setRejectedDocuments(ApplicationEntity applicationEntity, ApplicationEvaluationResponse response) {
List<DocumentResponseBean> initialDocumentBeans = new ArrayList<>();
String initialDocuments = applicationEntity.getRejectedDocument();
if (initialDocuments != null && !initialDocuments.trim().isEmpty()) {
// Split the comma-separated values and process them
List<String> 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<ApplicationAmendmentRequestEntity> amendmentRequests=applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(entity.getId());
List<AmendmentDocumentResponseBean> amendmentDocumentResponseBeans=new ArrayList<>();
@@ -653,7 +689,7 @@ public class ApplicationEvaluationDao {
public ApplicationEvaluationResponse createOrUpdateApplicationEvaluation(
UserEntity user,
ApplicationEvaluationRequest req,
Long assignedApplicationId) {
Long assignedApplicationId, List<MultipartFile> rejectedDocuments) {
log.info("Start createOrUpdateApplicationEvaluation: assignedApplicationId={}, userId={}", assignedApplicationId, user.getId());
Optional<ApplicationEvaluationEntity> 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<MultipartFile> 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<DocumentResponseBean> documentResponseBeans = uploadRejectedDocument(user.getId(), files, application);
List<Long> 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<MultipartFile> 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<DocumentResponseBean> uploadRejectedDocument(Long userId,List<MultipartFile> files,ApplicationEntity application){
if(files!=null) {
return documentDao.uploadFiles(userId, files, application.getId(), DocumentSourceTypeEnum.APPLICATION, DocumentTypeEnum.DOCUMENT);
}
return new ArrayList<>();
}
}

View File

@@ -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;

View File

@@ -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<CommunicationResponseBean> getAmendmentComments(Long amendmentId) {
ApplicationAmendmentRequestEntity amendmentData = applicationAmendmentRequestService.validateApplicationAmendmentRequest(amendmentId);
List<CommunicationEntity> 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) {

View File

@@ -158,6 +158,13 @@ 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<Long> documentIds=applicationDao.validateDocumentIds(applicationEntity.getRejectedDocument());
Set<Long> setOfDocumentIds = (documentIds == null)
? Collections.emptySet()
: new HashSet<>(documentIds);
documentEntities=documentRepository.findAllByIdInAndIsDeletedFalse(setOfDocumentIds);
}
urls = documentEntities.stream()
.map(DocumentEntity::getFilePath) // or getUrl()
@@ -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<String, String> 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);
}

View File

@@ -81,7 +81,10 @@ public class ApplicationEntity extends BaseEntity {
@Column(name = "PREVIOUS_STATUS")
private String previousStatus;
@Column(name = "EMAIL_JSON")
private String emailJson;
@Column(name = "REJECTED_REASON")
private String rejectedReason;
@Column(name = "REJECTED_DOCUMENT")
private String rejectedDocument;
}

View File

@@ -16,4 +16,5 @@ public class ApplicationEvaluationFormRequestBean {
private List<ApplicationFormFieldRequestBean> formFields;
private String motivation;
private BigDecimal amountAccepted;
private String rejectedReason;
}

View File

@@ -17,4 +17,5 @@ public class ApplicationEvaluationRequest {
private ApplicationStatusForEvaluation applicationStatus;
private String motivation;
private BigDecimal amountAccepted;
private String rejectedReason;
}

View File

@@ -34,4 +34,6 @@ public class ApplicationAmendmentRequestResponse {
private String emailTemplate;
private List<EmailSendResponse> emailSendResponse;
private List<DocumentResponseBean> amendmentInitialDocuments;
private String amendmentType;
private String amendmentDocumentType;
}

View File

@@ -50,5 +50,6 @@ public class ApplicationEvaluationResponse {
private String companyVatNumber;
private String companyCodiceAteco;
private List<EmailSendResponse> emailSendResponse;
private List<DocumentResponseBean> rejectedDocument;
}

View File

@@ -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<MultipartFile> 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<MultipartFile> rejectedDocuments, ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, Long evaluationId, Long evaluationFormId);
ApplicationEvaluationFormResponse getApplicationEvaluationForm(HttpServletRequest request, Long applicationId, Long assignedApplicationId);

View File

@@ -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<CommunicationResponseBean> getAmendmentComments(HttpServletRequest request,Long id);
}

View File

@@ -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<MultipartFile> 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<MultipartFile> 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

View File

@@ -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<CommunicationResponseBean> getAmendmentComments(HttpServletRequest request,Long id) {
ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(id);
if (Boolean.FALSE.equals(validator.checkIsBeneficiary())) {
validator.validatePreInstructor(request, applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getUserId());

View File

@@ -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<Response<ApplicationEvaluationResponse>> 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<MultipartFile> 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<Response<ApplicationEvaluationFormResponse>> createApplicationEvaluation(HttpServletRequest request,
@Valid @RequestBody ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean,
produces = { "application/json" },consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
ResponseEntity<Response<ApplicationEvaluationFormResponse>> createApplicationEvaluation(HttpServletRequest request, @Parameter(description = "List of files to upload", required = false)
@RequestPart(required = false) List<MultipartFile> 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);

View File

@@ -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<Response<ApplicationAmendmentResponse>> getAmendmentComments(HttpServletRequest request,@PathVariable(value = "amendmentId") Long amendmentId);
public ResponseEntity<Response<List<CommunicationResponseBean>>> 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 = {

View File

@@ -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<Response<ApplicationEvaluationResponse>> createOrUpdateApplicationEvaluation(
HttpServletRequest request,
Long assignedApplicationsId,
Long assignedApplicationsId, List<MultipartFile> 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<Response<ApplicationEvaluationFormResponse>> createApplicationEvaluation(HttpServletRequest request, ApplicationEvaluationFormRequestBean applicationEvaluationFormRequestBean, Long assignedApplicationId, Long evaluationFormId) {
public ResponseEntity<Response<ApplicationEvaluationFormResponse>> createApplicationEvaluation(HttpServletRequest request, List<MultipartFile> 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)));

View File

@@ -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<Response<ApplicationAmendmentResponse>> getAmendmentComments(HttpServletRequest request,Long amendmentId) {
public ResponseEntity<Response<List<CommunicationResponseBean>>> 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<CommunicationResponseBean> response = communicationService.getAmendmentComments(request,amendmentId);
return ResponseEntity.ok(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.AMENDMENT_FOUND_SUCCESS)));
}
@Override

View File

@@ -3067,4 +3067,17 @@
<column name="previous_status" type="VARCHAR(255)"></column>
</addColumn>
</changeSet>
<changeSet id="15-10-2025_RK_152435" author="Rajesh Khore">
<dropColumn tableName="application" columnName="email_json"/>
<addColumn tableName="application">
<column name="rejected_reason" type="VARCHAR(255)"/>
<column name="rejected_document" type="VARCHAR(255)"/>
</addColumn>
</changeSet>
<changeSet id="16-10-2025_RK_13352" author="Rajesh Khore">
<sqlFile dbms="postgresql" path="db/dump/update_system_email_template_of_application_rejected_16_10_2025.sql"/>
</changeSet>
</databaseChangeLog>

View File

@@ -0,0 +1,18 @@
UPDATE gepafin_schema.system_email_template
SET html_content = '<html>
<body style="font-family: Arial, sans-serif; color: #000; line-height: 1.6;">
<div style="padding: 20px; border: 1px solid #ddd; border-radius: 8px; max-width: 600px; margin: auto;">
<p>Buongiorno,</p>
<p>Si comunica che, in riferimento alla domanda a valere sul bando “<strong>{{call_name}}</strong>” di cui al
<strong>Protocollo n. {{protocol_number}} del {{protocol_date}} alle {{protocol_time}}</strong>,
</p>
<p>
{{tipo_inammissibilita}}.</p>
<p>Le motivazioni sono le seguenti: <strong>{{form_text}}</strong></p>
<p>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 dellart.10 bis della L.241/1990 e s.m.i.</p>
<p>Distinti Saluti,</p>
<p><strong>{{email_signature}}</strong></p>
</div>
</body>
</html>'
WHERE "type" = 'INADMISSIBILITY_NOTIFICATION' and "email_scenario" = 'APPLICATION_REJECTED' and "system" = true;

View File

@@ -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.

View File

@@ -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.