Done ticket GEPAFINBE-90

This commit is contained in:
nisha
2024-11-24 23:52:51 +05:30
parent cac2fd209b
commit 36725d3d46
15 changed files with 186 additions and 23 deletions

View File

@@ -294,5 +294,7 @@ public class GepafinConstant {
public static final String DUPLICATE_BENEFICIARY_CALL = "beneficiary.call.duplicate"; public static final String DUPLICATE_BENEFICIARY_CALL = "beneficiary.call.duplicate";
public static final String COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL = "company.id.required.for.preferred.call"; public static final String COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL = "company.id.required.for.preferred.call";
public static final String CREATED_DATE = "createdDate"; public static final String CREATED_DATE = "createdDate";
public static final String RESPONSE_DAYS_NOT_NULL="response.days.not.null";
public static final String APPLICATION_CANNOT_APPROVED_OR_REJECTED="application.cannot.approved.or.rejected";
} }

View File

@@ -31,6 +31,7 @@ import java.time.temporal.ChronoUnit;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static java.time.temporal.ChronoUnit.DAYS;
import static net.gepafin.tendermanagement.util.Utils.log; import static net.gepafin.tendermanagement.util.Utils.log;
import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated;
@@ -97,6 +98,9 @@ public class ApplicationAmendmentRequestDao {
@Autowired @Autowired
private EmailLogDao emailLogDao; private EmailLogDao emailLogDao;
@Autowired
private ApplicationAmendmentRequestDao applicationAmendmentRequestDao;
public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(Long applicationEvaluationId) { public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(Long applicationEvaluationId) {
log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId);
ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId);
@@ -204,6 +208,11 @@ public class ApplicationAmendmentRequestDao {
ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = new ApplicationAmendmentRequestEntity(); ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = new ApplicationAmendmentRequestEntity();
applicationAmendmentRequestEntity.setNote(applicationAmendmentRequest.getNote()); applicationAmendmentRequestEntity.setNote(applicationAmendmentRequest.getNote());
applicationAmendmentRequestEntity.setResponseDays(applicationAmendmentRequest.getResponseDays()); applicationAmendmentRequestEntity.setResponseDays(applicationAmendmentRequest.getResponseDays());
if(applicationAmendmentRequest.getResponseDays()==null && applicationAmendmentRequest.getResponseDays() < 0){
throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.RESPONSE_DAYS_NOT_NULL));
}
applicationAmendmentRequestEntity.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()).plusDays(applicationAmendmentRequest.getResponseDays()));
applicationAmendmentRequestEntity.setIsEmail(applicationAmendmentRequest.getIsSendEmail()); applicationAmendmentRequestEntity.setIsEmail(applicationAmendmentRequest.getIsSendEmail());
applicationAmendmentRequestEntity.setIsNotification(applicationAmendmentRequest.getIsSendNotification()); applicationAmendmentRequestEntity.setIsNotification(applicationAmendmentRequest.getIsSendNotification());
applicationAmendmentRequestEntity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); applicationAmendmentRequestEntity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
@@ -228,6 +237,20 @@ public class ApplicationAmendmentRequestDao {
String formFieldsJson = Utils.convertObjectToJson(formFieldRequestBean); String formFieldsJson = Utils.convertObjectToJson(formFieldRequestBean);
applicationAmendmentRequestEntity.setFormFields(formFieldsJson); applicationAmendmentRequestEntity.setFormFields(formFieldsJson);
} }
List<ApplicationAmendmentRequestEntity> amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(applicationEvaluationEntity.getId());
// Ensure startDate and initialDays are not null to avoid NullPointerException
if (amendmentRequest !=null && amendmentRequest.isEmpty() && applicationEvaluationEntity.getStartDate() != null && applicationEvaluationEntity.getInitialDays() != null ) {
Long initialDays = applicationEvaluationEntity.getInitialDays();
LocalDateTime startDate = applicationEvaluationEntity.getStartDate();
LocalDateTime nowInUTC = DateTimeUtil.DateServerToUTC(LocalDateTime.now());
// Calculate remaining days
Long remainingDays = initialDays - DAYS.between(startDate, nowInUTC);
// Set remaining days in the entity
applicationEvaluationEntity.setRemainingDays(remainingDays);
//Set stop date time in the entity becuase amendment has started
applicationEvaluationEntity.setStopDateTime(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
}
UserEntity userEntity = userService.validateUser(applicationEvaluationEntity.getUserId()); UserEntity userEntity = userService.validateUser(applicationEvaluationEntity.getUserId());
Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub()); Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub());
ProtocolEntity protocolEntity = protocolDao.createProtocolEntity( ProtocolEntity protocolEntity = protocolDao.createProtocolEntity(
@@ -238,6 +261,7 @@ public class ApplicationAmendmentRequestDao {
//Set Status //Set Status
applicationEvaluationEntity.setStatus(ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue()); applicationEvaluationEntity.setStatus(ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue());
applicationEvaluationRepository.save(applicationEvaluationEntity); applicationEvaluationRepository.save(applicationEvaluationEntity);
ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId); ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId);
@@ -271,10 +295,8 @@ public class ApplicationAmendmentRequestDao {
applicationAmendmentRequestResponse.setInternalNote(applicationAmendmentRequestEntity.getInternalNote()); applicationAmendmentRequestResponse.setInternalNote(applicationAmendmentRequestEntity.getInternalNote());
LocalDateTime startDate = applicationAmendmentRequestEntity.getStartDate(); LocalDateTime startDate = applicationAmendmentRequestEntity.getStartDate();
applicationAmendmentRequestResponse.setStartDate(startDate); applicationAmendmentRequestResponse.setStartDate(startDate);
applicationAmendmentRequestResponse.setExpirationDate(applicationAmendmentRequestEntity.getEndDate());
LocalDateTime expirationDate = startDate.plus(expirationDays, ChronoUnit.DAYS); applicationAmendmentRequestResponse.setEvaluationEndDate(applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getEndDate());
applicationAmendmentRequestResponse.setExpirationDate(expirationDate);
applicationAmendmentRequestResponse.setIsSendEmail(applicationAmendmentRequestEntity.getIsEmail()); applicationAmendmentRequestResponse.setIsSendEmail(applicationAmendmentRequestEntity.getIsEmail());
applicationAmendmentRequestResponse.setIsSendNotification(applicationAmendmentRequestEntity.getIsNotification()); applicationAmendmentRequestResponse.setIsSendNotification(applicationAmendmentRequestEntity.getIsNotification());
String callName = application.getCall().getName(); String callName = application.getCall().getName();
@@ -642,6 +664,19 @@ public class ApplicationAmendmentRequestDao {
log.info("Closing application amendement with ID: {}", id); log.info("Closing application amendement with ID: {}", id);
ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id);
List<ApplicationAmendmentRequestEntity> amendmentRequestList = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(
existingApplicationAmendment.getApplicationEvaluationEntity().getId()
);
// Check if this is the last amendment being closed
boolean isLastRemaining = amendmentRequestList.stream()
.filter(amendment -> !amendment.getId().equals(id)) // Exclude the current amendment
.allMatch(amendment -> amendment.getStatus().equals(ApplicationAmendmentRequestEnum.CLOSE.getValue()));
if (isLastRemaining) {
log.info("The current amendment is the last remaining one to be closed.");
applicationAmendmentRequestDao.calculateEndDateAndSuspensionDays(existingApplicationAmendment.getApplicationEvaluationEntity());
}
setIfUpdated(existingApplicationAmendment::getInternalNote, existingApplicationAmendment::setInternalNote, closeAmendmentRequest.getInternalNote()); setIfUpdated(existingApplicationAmendment::getInternalNote, existingApplicationAmendment::setInternalNote, closeAmendmentRequest.getInternalNote());
setIfUpdated(existingApplicationAmendment::getStatus, existingApplicationAmendment::setStatus, ApplicationAmendmentRequestEnum.CLOSE.getValue()); setIfUpdated(existingApplicationAmendment::getStatus, existingApplicationAmendment::setStatus, ApplicationAmendmentRequestEnum.CLOSE.getValue());
@@ -669,6 +704,7 @@ public class ApplicationAmendmentRequestDao {
if (newResponseDays != null && newResponseDays > 0) { if (newResponseDays != null && newResponseDays > 0) {
Long currentResponseDays = request.getResponseDays() != null ? request.getResponseDays() : 0L; Long currentResponseDays = request.getResponseDays() != null ? request.getResponseDays() : 0L;
request.setResponseDays(currentResponseDays + newResponseDays); request.setResponseDays(currentResponseDays + newResponseDays);
request.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now().plusDays(request.getResponseDays())));
applicationAmendmentRequestRepository.save(request); applicationAmendmentRequestRepository.save(request);
} }
return convertEntityToResponse(request); return convertEntityToResponse(request);
@@ -762,12 +798,24 @@ public class ApplicationAmendmentRequestDao {
LocalDateTime dueDate = amendment.getStartDate().plusDays(amendment.getResponseDays()); LocalDateTime dueDate = amendment.getStartDate().plusDays(amendment.getResponseDays());
bodyPlaceholders.put("{{amendment_due_date}}", DateTimeUtil.formatLocalDateTime(dueDate, GepafinConstant.DD_MM_YYYY)); bodyPlaceholders.put("{{amendment_due_date}}", DateTimeUtil.formatLocalDateTime(dueDate, GepafinConstant.DD_MM_YYYY));
} else { } else {
bodyPlaceholders.put("{{amendment_due_date}}", "Not available"); bodyPlaceholders.put("{{amendment_due_date}}", "Not available");
} }
return Utils.replacePlaceholders(template.getHtmlContent(), bodyPlaceholders); return Utils.replacePlaceholders(template.getHtmlContent(), bodyPlaceholders);
} }
public ApplicationEvaluationEntity calculateEndDateAndSuspensionDays(ApplicationEvaluationEntity applicationEvaluationEntity){
LocalDateTime currentDate=DateTimeUtil.DateServerToUTC(LocalDateTime.now());
LocalDateTime endDate=currentDate.plusDays(applicationEvaluationEntity.getRemainingDays());
Long suspendedDays = ChronoUnit.DAYS.between(applicationEvaluationEntity.getStopDateTime(), currentDate);
applicationEvaluationEntity.setEndDate(endDate);
applicationEvaluationEntity.setSuspendedDays(applicationEvaluationEntity.getSuspendedDays()+suspendedDays);
return applicationEvaluationRepository.save(applicationEvaluationEntity);
}
public List<ApplicationAmendmentRequestEntity> getApplicationAmendmentRequestEntitiesByApplicationEvaluationId(Long applicationEvaluationId){
List<ApplicationAmendmentRequestEntity> applicationAmendmentRequestEntities=new ArrayList<>();
applicationAmendmentRequestEntities=applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(applicationEvaluationId,ApplicationAmendmentRequestEnum.CLOSE.getValue());
return applicationAmendmentRequestEntities;
}
} }

View File

@@ -17,7 +17,9 @@ import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.ApplicationService;
import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.CallService;
import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.service.UserService;
import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.Utils; 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.ResourceNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -96,6 +98,11 @@ public class ApplicationEvaluationDao {
entity.setFile(Utils.convertObjectToJson(req.getFiles())); entity.setFile(Utils.convertObjectToJson(req.getFiles()));
entity.setNote(req.getNote()); entity.setNote(req.getNote());
entity.setIsDeleted(false); entity.setIsDeleted(false);
entity.setInitialDays(30L);
entity.setRemainingDays(30L);
entity.setSuspendedDays(0L);
entity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
entity.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now().plusDays(30)));
entity.setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue()); entity.setStatus(ApplicationEvaluationStatusTypeEnum.OPEN.getValue());
return entity; return entity;
} }
@@ -127,6 +134,7 @@ public class ApplicationEvaluationDao {
response.setAssignedApplicationId(assignedApplications.getId()); response.setAssignedApplicationId(assignedApplications.getId());
response.setNote(entity.getNote()); response.setNote(entity.getNote());
response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(entity.getStatus())); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(entity.getStatus()));
response.setEvaluationEndDate(entity.getEndDate());
response.setCreatedDate(entity.getCreatedDate()); response.setCreatedDate(entity.getCreatedDate());
response.setUpdatedDate(entity.getUpdatedDate()); response.setUpdatedDate(entity.getUpdatedDate());
} }
@@ -405,7 +413,6 @@ public class ApplicationEvaluationDao {
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.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null);
response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null); response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null);
response.setEvaluationDate(application.getSubmissionDate() != null ? application.getSubmissionDate().plusDays(30) : null);
LocalDateTime callEndDate = application.getCall().getEndDate(); LocalDateTime callEndDate = application.getCall().getEndDate();
response.setCallEndDate(callEndDate); response.setCallEndDate(callEndDate);
} }
@@ -631,6 +638,7 @@ public class ApplicationEvaluationDao {
response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus()));
response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.OPEN.getValue())); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.OPEN.getValue()));
response.setMinScore(call.getThreshold()!=null?call.getThreshold():null); response.setMinScore(call.getThreshold()!=null?call.getThreshold():null);
response.setEvaluationEndDate(entity.getEndDate());
LocalDateTime callEndDate = application.getCall().getEndDate(); LocalDateTime callEndDate = application.getCall().getEndDate();
response.setCallEndDate(callEndDate); response.setCallEndDate(callEndDate);
setCriteriaResponses(entity, application.getId(), response, evaluationCriterias); setCriteriaResponses(entity, application.getId(), response, evaluationCriterias);
@@ -928,7 +936,6 @@ public class ApplicationEvaluationDao {
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.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null);
response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null); response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null);
response.setEvaluationDate(application.getSubmissionDate() != null ? application.getSubmissionDate().plusDays(30) : null);
} }
private Optional<ApplicationFormFieldEntity> findFormFieldValue(Long applicationId, String formFieldId) { private Optional<ApplicationFormFieldEntity> findFormFieldValue(Long applicationId, String formFieldId) {
@@ -1307,10 +1314,10 @@ public class ApplicationEvaluationDao {
entity = applicationEvaluationRepository.save(existingEntity); entity = applicationEvaluationRepository.save(existingEntity);
assignedApplicationsRepository.save(assignedApplicationsEntity); assignedApplicationsRepository.save(assignedApplicationsEntity);
List<ApplicationAmendmentRequestEntity> amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); List<ApplicationAmendmentRequestEntity> amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(existingEntity.getId(),ApplicationAmendmentRequestEnum.AWAITING.getValue());
for (ApplicationAmendmentRequestEntity request : amendmentRequest) { if(amendmentRequest !=null && Boolean.FALSE.equals(amendmentRequest.isEmpty())){
request.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue()); throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_CANNOT_APPROVED_OR_REJECTED));
} }
applicationAmendmentRequestRepository.saveAll(amendmentRequest); applicationAmendmentRequestRepository.saveAll(amendmentRequest);
if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.APPROVED.getValue())))) { if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.APPROVED.getValue())))) {
emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application); emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application);

View File

@@ -47,4 +47,7 @@ public class ApplicationAmendmentRequestEntity extends BaseEntity {
@JoinColumn(name = "PROTOCOL_Id") @JoinColumn(name = "PROTOCOL_Id")
private ProtocolEntity protocol; private ProtocolEntity protocol;
@Column(name = "end_date")
private LocalDateTime endDate;
} }

View File

@@ -3,6 +3,8 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.*; import jakarta.persistence.*;
import lombok.Data; import lombok.Data;
import java.time.LocalDateTime;
@Data @Data
@Entity @Entity
@Table(name = "application_evaluation") @Table(name = "application_evaluation")
@@ -36,4 +38,21 @@ public class ApplicationEvaluationEntity extends BaseEntity{
@JoinColumn(name = "assigned_applications_id", nullable = true) @JoinColumn(name = "assigned_applications_id", nullable = true)
private AssignedApplicationsEntity assignedApplicationsEntity; private AssignedApplicationsEntity assignedApplicationsEntity;
@Column(name = "INITIAL_DAYS")
private Long initialDays;
@Column(name = "REMAINING_DAYS")
private Long remainingDays;
@Column(name = "SUSPENDED_DAYS")
private Long suspendedDays;
@Column(name = "START_DATE")
private LocalDateTime startDate;
@Column(name = "END_DATE")
private LocalDateTime endDate;
@Column(name = "STOP_DATE_TIME")
private LocalDateTime stopDateTime;
} }

View File

@@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonValue;
public enum ApplicationEvaluationStatusTypeEnum { public enum ApplicationEvaluationStatusTypeEnum {
OPEN ("OPEN"), OPEN ("OPEN"),
SOCCORSO("SOCCORSO"), SOCCORSO("SOCCORSO"),
EXPIRED("EXPIRED"),
CLOSE("CLOSE"); CLOSE("CLOSE");
private String value; private String value;

View File

@@ -23,6 +23,7 @@ public class ApplicationAmendmentRequestResponse {
private List<ApplicationFormFieldResponseBean> applicationFormFields; private List<ApplicationFormFieldResponseBean> applicationFormFields;
private Long applicationId; private Long applicationId;
private Long applicationEvaluationId; private Long applicationEvaluationId;
private LocalDateTime evaluationEndDate;
private LocalDateTime expirationDate; private LocalDateTime expirationDate;
private List<CommunicationResponseBean> commentsList; private List<CommunicationResponseBean> commentsList;
private String internalNote; private String internalNote;

View File

@@ -27,6 +27,6 @@ public class ApplicationEvaluationResponse {
private Long protocolNumber; private Long protocolNumber;
private String callName; private String callName;
private LocalDateTime submissionDate; private LocalDateTime submissionDate;
private LocalDateTime evaluationDate; private LocalDateTime evaluationEndDate;
private LocalDateTime callEndDate; private LocalDateTime callEndDate;
} }

View File

@@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@@ -25,6 +26,7 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository<App
@Query(value = "SELECT amr FROM ApplicationAmendmentRequestEntity amr " + @Query(value = "SELECT amr FROM ApplicationAmendmentRequestEntity amr " +
"WHERE amr.applicationEvaluationEntity.id = :id " + "WHERE amr.applicationEvaluationEntity.id = :id " +
"AND amr.isDeleted = false " +
"AND amr.applicationEvaluationEntity.isDeleted = false") "AND amr.applicationEvaluationEntity.isDeleted = false")
List<ApplicationAmendmentRequestEntity> findAllByApplicationEvaluationIdAndIsDeletedFalse(Long id); List<ApplicationAmendmentRequestEntity> findAllByApplicationEvaluationIdAndIsDeletedFalse(Long id);
@@ -34,4 +36,19 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository<App
List<ApplicationAmendmentRequestEntity> findByApplicationIdAndStatusInAndIsDeletedFalse(Long applicationId, List<String> statuses); List<ApplicationAmendmentRequestEntity> findByApplicationIdAndStatusInAndIsDeletedFalse(Long applicationId, List<String> statuses);
@Query(value = "SELECT amr " +
"FROM ApplicationAmendmentRequestEntity amr " +
"WHERE amr.applicationEvaluationEntity.id = :id " +
"AND amr.isDeleted = false " +
"AND amr.applicationEvaluationEntity.isDeleted = false " +
"AND amr.status = :status")
List<ApplicationAmendmentRequestEntity> findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(Long id, String status);
@Query("SELECT a FROM ApplicationAmendmentRequestEntity a " +
"WHERE a.applicationId = :applicationId " +
"AND a.isDeleted = false " +
"AND a.status <> 'CLOSE' " +
"AND a.endDate < :currentTime")
List<ApplicationAmendmentRequestEntity> findActiveAmendments(Long applicationId, LocalDateTime currentTime);
} }

View File

@@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@@ -21,5 +22,6 @@ public interface ApplicationEvaluationRepository extends JpaRepository<Applicati
Optional<ApplicationEvaluationEntity> findFirstByIsDeletedFalseOrderByCreatedDateDesc(); Optional<ApplicationEvaluationEntity> findFirstByIsDeletedFalseOrderByCreatedDateDesc();
boolean existsByApplicationIdAndIsDeletedFalse(Long applicationId); boolean existsByApplicationIdAndIsDeletedFalse(Long applicationId);
@Query("SELECT a FROM ApplicationEvaluationEntity a WHERE a.isDeleted = false AND a.endDate < :currentDate")
List<ApplicationEvaluationEntity> findAllByIsDeletedFalseAndEndDateBefore(@Param("currentDate") LocalDateTime currentDate);
} }

View File

@@ -0,0 +1,29 @@
package net.gepafin.tendermanagement.scheduler;
import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity;
import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum;
import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import java.time.LocalDateTime;
import java.util.List;
public class ApplicationEvaluationScheduler {
@Autowired
private ApplicationEvaluationRepository applicationEvaluationRepository;
@Scheduled(cron = "0 0 1 * * ?") // Runs daily at midnight
public void updateExpiredEvaluations() {
LocalDateTime currentDate = LocalDateTime.now();
List<ApplicationEvaluationEntity> evaluations = applicationEvaluationRepository.findAllByIsDeletedFalseAndEndDateBefore(currentDate);
for (ApplicationEvaluationEntity evaluation : evaluations) {
evaluation.setStatus(ApplicationEvaluationStatusTypeEnum.EXPIRED.getValue());
}
applicationEvaluationRepository.saveAll(evaluations);
}
}

View File

@@ -1,20 +1,26 @@
package net.gepafin.tendermanagement.scheduler; package net.gepafin.tendermanagement.scheduler;
import net.gepafin.tendermanagement.dao.ApplicationAmendmentRequestDao;
import net.gepafin.tendermanagement.dao.EmailNotificationDao; import net.gepafin.tendermanagement.dao.EmailNotificationDao;
import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity;
import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.ApplicationEntity;
import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity;
import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum;
import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum;
import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository;
import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository;
import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository;
import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.repositories.UserRepository;
import net.gepafin.tendermanagement.util.DateTimeUtil;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
@Component @Component
public class NotificationScheduler { public class NotificationScheduler {
@@ -31,6 +37,12 @@ public class NotificationScheduler {
@Autowired @Autowired
EmailNotificationDao emailNotificationDao; EmailNotificationDao emailNotificationDao;
@Autowired
private ApplicationAmendmentRequestDao applicationAmendmentRequestDao;
@Autowired
private ApplicationEvaluationRepository applicationEvaluationRepository;
@Scheduled(cron = "0 0 1 * * ?") @Scheduled(cron = "0 0 1 * * ?")
void sendNotificationForRejectedApplicationToBeneficiary() { void sendNotificationForRejectedApplicationToBeneficiary() {
@@ -40,17 +52,18 @@ public class NotificationScheduler {
LocalDateTime today = LocalDateTime.now(); LocalDateTime today = LocalDateTime.now();
for (ApplicationEntity application : applicationsList) { for (ApplicationEntity application : applicationsList) {
ApplicationAmendmentRequestEntity amendmentRequest = getAmendmentRequestForApplication(application, amendmentRequestList); List<ApplicationAmendmentRequestEntity> amendmentRequestEntities = applicationAmendmentRepository.findActiveAmendments(application.getId(), DateTimeUtil.DateServerToUTC(LocalDateTime.now()));
List<ApplicationAmendmentRequestEntity> applicationAmendmentRequestEntities = new ArrayList<>();
if (amendmentRequest != null) { if (amendmentRequestEntities != null && Boolean.FALSE.equals(amendmentRequestEntities.isEmpty())) {
LocalDateTime requestDate = amendmentRequest.getStartDate(); for (ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity : amendmentRequestEntities) {
if (requestDate.plusDays(amendmentRequest.getResponseDays()).isBefore(today)) { if (amendmentRequestEntities.size() == 1) {
// Update the application status to REJECTED applicationAmendmentRequestDao.calculateEndDateAndSuspensionDays(applicationAmendmentRequestEntity.getApplicationEvaluationEntity());
}
application.setStatus(ApplicationStatusTypeEnum.REJECTED.getValue()); application.setStatus(ApplicationStatusTypeEnum.REJECTED.getValue());
applicationRepository.save(application); applicationRepository.save(application);
amendmentRequest.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue()); applicationAmendmentRequestEntity.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue());
applicationAmendmentRepository.save(amendmentRequest); applicationAmendmentRepository.save(applicationAmendmentRequestEntity);
emailNotificationDao.sendApplicationFailureNotificationEmail(amendmentRequest); emailNotificationDao.sendApplicationFailureNotificationEmail(applicationAmendmentRequestEntity);
} }
} }
} }

View File

@@ -1785,4 +1785,20 @@
</dropColumn> </dropColumn>
</changeSet> </changeSet>
<changeSet id="25-11-2024_1" author="Nisha Kashyap">
<addColumn tableName="application_evaluation">
<column name="initial_days" type="INTEGER"></column>
<column name="remaining_days" type="INTEGER"></column>
<column name="suspended_days" type="INTEGER"></column>
<column name="start_date" type="TIMESTAMP WITHOUT TIME ZONE"></column>
<column name="end_date" type="TIMESTAMP WITHOUT TIME ZONE"></column>
<column name="stop_date_time" type="TIMESTAMP WITHOUT TIME ZONE"></column>
</addColumn>
</changeSet>
<changeSet id="25-11-2024_2" author="Nisha kashyap">
<addColumn tableName="application_amendment_request">
<column name="end_date" type="TIMESTAMP WITHOUT TIME ZONE"></column>
</addColumn>
</changeSet>
</databaseChangeLog> </databaseChangeLog>

View File

@@ -309,3 +309,6 @@ DD_MM_YYYY_HH_MM = dd_MM_yyyy HH:mm
application.documents.not.found=No documents found for the application. application.documents.not.found=No documents found for the application.
beneficiary.call.duplicate = A preferred call with this call ID and company ID already exists for this user. beneficiary.call.duplicate = A preferred call with this call ID and company ID already exists for this user.
company.id.required.for.preferred.call=Company ID is required when requesting only preferred calls. company.id.required.for.preferred.call=Company ID is required when requesting only preferred calls.
response.days.not.null=Response days should not be null and greater than zero.
application.cannot.approved.or.rejected=Application cannot be approved and rejected because amendment is active.

View File

@@ -304,3 +304,5 @@ reminder.email.sent.success.msg=Email di promemoria inviata con successo!
application.documents.not.found=Nessun documento trovato per la domanda. application.documents.not.found=Nessun documento trovato per la domanda.
beneficiary.call.duplicate = Una chiamata preferita con questo ID di chiamata e ID azienda esiste gi� per questo utente. beneficiary.call.duplicate = Una chiamata preferita con questo ID di chiamata e ID azienda esiste gi� per questo utente.
company.id.required.for.preferred.call=ID azienda obbligatorio quando si richiedono solo chiamate preferite. company.id.required.for.preferred.call=ID azienda obbligatorio quando si richiedono solo chiamate preferite.
response.days.not.null=I giorni di risposta non devono essere nulli e maggiori di zero.
application.cannot.approved.or.rejected=La domanda non può essere approvata o rifiutata perché l'emendamento è attivo.