package net.gepafin.tendermanagement.scheduler; import net.gepafin.tendermanagement.dao.EmailNotificationDao; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.List; @Component public class NotificationScheduler { @Autowired UserRepository userRepository; @Autowired ApplicationRepository applicationRepository; @Autowired ApplicationAmendmentRequestRepository applicationAmendmentRepository; @Autowired EmailNotificationDao emailNotificationDao; // @Scheduled(cron = "0 0 1 * * ?") void sendNotificationForRejectedApplicationToBeneficiary() { List applicationsList = applicationRepository.findByIsDeletedFalse(); List amendmentRequestList = applicationAmendmentRepository.findByIsDeletedFalse(); LocalDateTime today = LocalDateTime.now(); for (ApplicationEntity application : applicationsList) { ApplicationAmendmentRequestEntity amendmentRequest = getAmendmentRequestForApplication(application, amendmentRequestList); if (amendmentRequest != null) { LocalDateTime requestDate = amendmentRequest.getStartDate(); if (requestDate.plusDays(amendmentRequest.getResponseDays()).isBefore(today)) { // Update the application status to REJECTED application.setStatus(ApplicationStatusTypeEnum.REJECTED.getValue()); applicationRepository.save(application); amendmentRequest.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue()); applicationAmendmentRepository.save(amendmentRequest); emailNotificationDao.sendApplicationFailureNotificationEmail(amendmentRequest); } } } } private ApplicationAmendmentRequestEntity getAmendmentRequestForApplication(ApplicationEntity application, List amendmentRequestList) { return amendmentRequestList.stream().filter(request -> request.getApplicationId().equals(application.getId())).findFirst().orElse(null); } }