diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 272d3f23..9d477c37 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -294,5 +294,7 @@ public class GepafinConstant { 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 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"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index a4da3b00..c646c73b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -31,6 +31,7 @@ import java.time.temporal.ChronoUnit; import java.util.*; 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.setIfUpdated; @@ -97,6 +98,9 @@ public class ApplicationAmendmentRequestDao { @Autowired private EmailLogDao emailLogDao; + @Autowired + private ApplicationAmendmentRequestDao applicationAmendmentRequestDao; + public ApplicationAmendmentRequestResponse getApplicationDataForAmendment(Long applicationEvaluationId) { log.info("Fetching the application data for the Amendment process {}", applicationEvaluationId); ApplicationEvaluationEntity applicationEvaluationEntity = applicationEvaluationService.validateApplicationEvaluation(applicationEvaluationId); @@ -204,6 +208,11 @@ public class ApplicationAmendmentRequestDao { ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = new ApplicationAmendmentRequestEntity(); applicationAmendmentRequestEntity.setNote(applicationAmendmentRequest.getNote()); 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.setIsNotification(applicationAmendmentRequest.getIsSendNotification()); applicationAmendmentRequestEntity.setStartDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); @@ -228,6 +237,20 @@ public class ApplicationAmendmentRequestDao { String formFieldsJson = Utils.convertObjectToJson(formFieldRequestBean); applicationAmendmentRequestEntity.setFormFields(formFieldsJson); } + List 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()); Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub()); ProtocolEntity protocolEntity = protocolDao.createProtocolEntity( @@ -238,6 +261,7 @@ public class ApplicationAmendmentRequestDao { //Set Status applicationEvaluationEntity.setStatus(ApplicationEvaluationStatusTypeEnum.SOCCORSO.getValue()); + applicationEvaluationRepository.save(applicationEvaluationEntity); ApplicationEntity applicationEntity = applicationService.validateApplication(applicationId); @@ -271,10 +295,8 @@ public class ApplicationAmendmentRequestDao { applicationAmendmentRequestResponse.setInternalNote(applicationAmendmentRequestEntity.getInternalNote()); LocalDateTime startDate = applicationAmendmentRequestEntity.getStartDate(); applicationAmendmentRequestResponse.setStartDate(startDate); - - LocalDateTime expirationDate = startDate.plus(expirationDays, ChronoUnit.DAYS); - applicationAmendmentRequestResponse.setExpirationDate(expirationDate); - + applicationAmendmentRequestResponse.setExpirationDate(applicationAmendmentRequestEntity.getEndDate()); + applicationAmendmentRequestResponse.setEvaluationEndDate(applicationAmendmentRequestEntity.getApplicationEvaluationEntity().getEndDate()); applicationAmendmentRequestResponse.setIsSendEmail(applicationAmendmentRequestEntity.getIsEmail()); applicationAmendmentRequestResponse.setIsSendNotification(applicationAmendmentRequestEntity.getIsNotification()); String callName = application.getCall().getName(); @@ -642,6 +664,19 @@ public class ApplicationAmendmentRequestDao { log.info("Closing application amendement with ID: {}", id); ApplicationAmendmentRequestEntity existingApplicationAmendment = validateApplicationAmendmentRequest(id); + List 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::getStatus, existingApplicationAmendment::setStatus, ApplicationAmendmentRequestEnum.CLOSE.getValue()); @@ -669,6 +704,7 @@ public class ApplicationAmendmentRequestDao { if (newResponseDays != null && newResponseDays > 0) { Long currentResponseDays = request.getResponseDays() != null ? request.getResponseDays() : 0L; request.setResponseDays(currentResponseDays + newResponseDays); + request.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now().plusDays(request.getResponseDays()))); applicationAmendmentRequestRepository.save(request); } return convertEntityToResponse(request); @@ -762,12 +798,24 @@ public class ApplicationAmendmentRequestDao { LocalDateTime dueDate = amendment.getStartDate().plusDays(amendment.getResponseDays()); bodyPlaceholders.put("{{amendment_due_date}}", DateTimeUtil.formatLocalDateTime(dueDate, GepafinConstant.DD_MM_YYYY)); } else { - bodyPlaceholders.put("{{amendment_due_date}}", "Not available"); } 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 getApplicationAmendmentRequestEntitiesByApplicationEvaluationId(Long applicationEvaluationId){ + List applicationAmendmentRequestEntities=new ArrayList<>(); + applicationAmendmentRequestEntities=applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(applicationEvaluationId,ApplicationAmendmentRequestEnum.CLOSE.getValue()); + return applicationAmendmentRequestEntities; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 2bcbade9..e9bd2098 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -17,7 +17,9 @@ import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; @@ -96,6 +98,11 @@ public class ApplicationEvaluationDao { entity.setFile(Utils.convertObjectToJson(req.getFiles())); entity.setNote(req.getNote()); 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()); return entity; } @@ -127,6 +134,7 @@ public class ApplicationEvaluationDao { response.setAssignedApplicationId(assignedApplications.getId()); response.setNote(entity.getNote()); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(entity.getStatus())); + response.setEvaluationEndDate(entity.getEndDate()); response.setCreatedDate(entity.getCreatedDate()); response.setUpdatedDate(entity.getUpdatedDate()); } @@ -405,7 +413,6 @@ public class ApplicationEvaluationDao { response.setCallName(application.getCall().getName() != null ? application.getCall().getName() : null); response.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null); response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null); - response.setEvaluationDate(application.getSubmissionDate() != null ? application.getSubmissionDate().plusDays(30) : null); LocalDateTime callEndDate = application.getCall().getEndDate(); response.setCallEndDate(callEndDate); } @@ -631,6 +638,7 @@ public class ApplicationEvaluationDao { response.setApplicationStatus(ApplicationStatusTypeEnum.valueOf(application.getStatus())); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(ApplicationEvaluationStatusTypeEnum.OPEN.getValue())); response.setMinScore(call.getThreshold()!=null?call.getThreshold():null); + response.setEvaluationEndDate(entity.getEndDate()); LocalDateTime callEndDate = application.getCall().getEndDate(); response.setCallEndDate(callEndDate); setCriteriaResponses(entity, application.getId(), response, evaluationCriterias); @@ -928,7 +936,6 @@ public class ApplicationEvaluationDao { response.setCallName(application.getCall().getName() != null ? application.getCall().getName() : null); response.setProtocolNumber(application.getProtocol() != null ? application.getProtocol().getProtocolNumber() : null); response.setSubmissionDate(application.getSubmissionDate() != null ? application.getSubmissionDate() : null); - response.setEvaluationDate(application.getSubmissionDate() != null ? application.getSubmissionDate().plusDays(30) : null); } private Optional findFormFieldValue(Long applicationId, String formFieldId) { @@ -1307,10 +1314,10 @@ public class ApplicationEvaluationDao { entity = applicationEvaluationRepository.save(existingEntity); assignedApplicationsRepository.save(assignedApplicationsEntity); - List amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); - for (ApplicationAmendmentRequestEntity request : amendmentRequest) { - request.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue()); - } + List amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(existingEntity.getId(),ApplicationAmendmentRequestEnum.AWAITING.getValue()); + if(amendmentRequest !=null && Boolean.FALSE.equals(amendmentRequest.isEmpty())){ + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_CANNOT_APPROVED_OR_REJECTED)); + } applicationAmendmentRequestRepository.saveAll(amendmentRequest); if (Boolean.TRUE.equals(statusType.equals((ApplicationStatusTypeEnum.APPROVED.getValue())))) { emailNotificationDao.sendAdmissibilityNotificationEmailForApprovedApplication(application); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java index 4d2dabf6..4b3fe79c 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationAmendmentRequestEntity.java @@ -47,4 +47,7 @@ public class ApplicationAmendmentRequestEntity extends BaseEntity { @JoinColumn(name = "PROTOCOL_Id") private ProtocolEntity protocol; + @Column(name = "end_date") + private LocalDateTime endDate; + } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java index dae9a3fb..8f6eb656 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEvaluationEntity.java @@ -3,6 +3,8 @@ package net.gepafin.tendermanagement.entities; import jakarta.persistence.*; import lombok.Data; +import java.time.LocalDateTime; + @Data @Entity @Table(name = "application_evaluation") @@ -35,5 +37,22 @@ public class ApplicationEvaluationEntity extends BaseEntity{ @ManyToOne @JoinColumn(name = "assigned_applications_id", nullable = true) 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; } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationEvaluationStatusTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationEvaluationStatusTypeEnum.java index 18cfc30d..59e47f9a 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationEvaluationStatusTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationEvaluationStatusTypeEnum.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum ApplicationEvaluationStatusTypeEnum { OPEN ("OPEN"), SOCCORSO("SOCCORSO"), + EXPIRED("EXPIRED"), CLOSE("CLOSE"); private String value; 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 76e445de..5523098e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationAmendmentRequestResponse.java @@ -23,6 +23,7 @@ public class ApplicationAmendmentRequestResponse { private List applicationFormFields; private Long applicationId; private Long applicationEvaluationId; + private LocalDateTime evaluationEndDate; private LocalDateTime expirationDate; private List commentsList; private String internalNote; 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 f0be1236..81d4314d 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -27,6 +27,6 @@ public class ApplicationEvaluationResponse { private Long protocolNumber; private String callName; private LocalDateTime submissionDate; - private LocalDateTime evaluationDate; + private LocalDateTime evaluationEndDate; private LocalDateTime callEndDate; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 57331e43..af46d7b5 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -25,6 +26,7 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository findAllByApplicationEvaluationIdAndIsDeletedFalse(Long id); @@ -34,4 +36,19 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository findByApplicationIdAndStatusInAndIsDeletedFalse(Long applicationId, List 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 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 findActiveAmendments(Long applicationId, LocalDateTime currentTime); + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java index 9ec88ffa..4e4069f3 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationEvaluationRepository.java @@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -21,5 +22,6 @@ public interface ApplicationEvaluationRepository extends JpaRepository findFirstByIsDeletedFalseOrderByCreatedDateDesc(); boolean existsByApplicationIdAndIsDeletedFalse(Long applicationId); - + @Query("SELECT a FROM ApplicationEvaluationEntity a WHERE a.isDeleted = false AND a.endDate < :currentDate") + List findAllByIsDeletedFalseAndEndDateBefore(@Param("currentDate") LocalDateTime currentDate); } diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java new file mode 100644 index 00000000..9b424e29 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java @@ -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 evaluations = applicationEvaluationRepository.findAllByIsDeletedFalseAndEndDateBefore(currentDate); + + for (ApplicationEvaluationEntity evaluation : evaluations) { + evaluation.setStatus(ApplicationEvaluationStatusTypeEnum.EXPIRED.getValue()); + } + applicationEvaluationRepository.saveAll(evaluations); + } + } + diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java index 58908280..521726a9 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java @@ -1,20 +1,26 @@ package net.gepafin.tendermanagement.scheduler; +import net.gepafin.tendermanagement.dao.ApplicationAmendmentRequestDao; import net.gepafin.tendermanagement.dao.EmailNotificationDao; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; +import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.util.DateTimeUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Component public class NotificationScheduler { @@ -31,6 +37,12 @@ public class NotificationScheduler { @Autowired EmailNotificationDao emailNotificationDao; + @Autowired + private ApplicationAmendmentRequestDao applicationAmendmentRequestDao; + + @Autowired + private ApplicationEvaluationRepository applicationEvaluationRepository; + @Scheduled(cron = "0 0 1 * * ?") void sendNotificationForRejectedApplicationToBeneficiary() { @@ -40,17 +52,18 @@ public class NotificationScheduler { LocalDateTime today = LocalDateTime.now(); for (ApplicationEntity application : applicationsList) { - ApplicationAmendmentRequestEntity amendmentRequest = getAmendmentRequestForApplication(application, amendmentRequestList); - - if (amendmentRequest != null) { - LocalDateTime requestDate = amendmentRequest.getStartDate(); - if (requestDate.plusDays(amendmentRequest.getResponseDays()).isBefore(today)) { - // Update the application status to REJECTED + List amendmentRequestEntities = applicationAmendmentRepository.findActiveAmendments(application.getId(), DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + List applicationAmendmentRequestEntities = new ArrayList<>(); + if (amendmentRequestEntities != null && Boolean.FALSE.equals(amendmentRequestEntities.isEmpty())) { + for (ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity : amendmentRequestEntities) { + if (amendmentRequestEntities.size() == 1) { + applicationAmendmentRequestDao.calculateEndDateAndSuspensionDays(applicationAmendmentRequestEntity.getApplicationEvaluationEntity()); + } application.setStatus(ApplicationStatusTypeEnum.REJECTED.getValue()); applicationRepository.save(application); - amendmentRequest.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue()); - applicationAmendmentRepository.save(amendmentRequest); - emailNotificationDao.sendApplicationFailureNotificationEmail(amendmentRequest); + applicationAmendmentRequestEntity.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue()); + applicationAmendmentRepository.save(applicationAmendmentRequestEntity); + emailNotificationDao.sendApplicationFailureNotificationEmail(applicationAmendmentRequestEntity); } } } 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 a7fe774d..faab8f35 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 @@ -1785,4 +1785,20 @@ + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 87c95e39..4576117e 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -309,3 +309,6 @@ DD_MM_YYYY_HH_MM = dd_MM_yyyy HH:mm 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. 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. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index c4763ec7..937a2d21 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -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. 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. +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.