diff --git a/pom.xml b/pom.xml index 08c677d0..f3424e44 100644 --- a/pom.xml +++ b/pom.xml @@ -225,6 +225,11 @@ 3.0.0 + + + org.springframework + spring-test + diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 97730f80..dbf39e8f 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -294,6 +294,9 @@ public class GepafinConstant { public static final String DUPLICATE_BENEFICIARY_CALL = "beneficiary.call.duplicate"; public static final String USER_MUST_BE_ASSOCIATED_WITH_COMPANY="user.must.be.associated.with.company.to.create.application"; 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"; public static final String SUBMISSION_DATE = "submissionDate"; public static final String ASSIGNED_AT = "assignedAt"; public static final String AUTH = "auth"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 9e08c776..c9c19708 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -34,6 +34,7 @@ import java.util.*; import java.util.function.Function; 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; @@ -92,6 +93,9 @@ public class ApplicationAmendmentRequestDao { @Autowired private EmailLogDao emailLogDao; + @Autowired + private ApplicationAmendmentRequestDao applicationAmendmentRequestDao; + @Autowired LoggingUtil loggingUtil; @@ -208,6 +212,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())); @@ -234,6 +243,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( @@ -315,7 +338,8 @@ public class ApplicationAmendmentRequestDao { LocalDateTime startDate = entity.getStartDate(); response.setStartDate(startDate); - response.setExpirationDate(startDate.plus(expirationDays, ChronoUnit.DAYS)); + response.setExpirationDate(entity.getEndDate()); + response.setEvaluationEndDate(entity.getApplicationEvaluationEntity().getEndDate()); response.setIsSendEmail(entity.getIsEmail()); response.setIsSendNotification(entity.getIsNotification()); @@ -805,6 +829,19 @@ public class ApplicationAmendmentRequestDao { //cloned entity for old data and versioning ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(existingApplicationAmendment); + 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()); @@ -857,19 +894,17 @@ public class ApplicationAmendmentRequestDao { } public ApplicationAmendmentRequestResponse extendResponseDays(Long id, Long newResponseDays) { - ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.APPLICATION_AMENDMENT_NOT_FOUND_MSG))); + ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validateApplicationAmendmentRequest(id); if (newResponseDays != null && newResponseDays > 0) { - ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity); + ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity); Long currentResponseDays = applicationAmendmentRequestEntity.getResponseDays() != null ? applicationAmendmentRequestEntity.getResponseDays() : 0L; applicationAmendmentRequestEntity.setResponseDays(currentResponseDays + newResponseDays); + applicationAmendmentRequestEntity.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now().plusDays(applicationAmendmentRequestEntity.getResponseDays()))); applicationAmendmentRequestRepository.save(applicationAmendmentRequestEntity); /** This code is responsible for adding a version history log for the "Update Application Amendment" operation. **/ loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationAmendmentEntity).newData(applicationAmendmentRequestEntity).build()); - } return convertEntityToResponse(applicationAmendmentRequestEntity); } @@ -966,13 +1001,38 @@ 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 oldApplicationEvaluationEntity = Utils.getClonedEntityForData(applicationEvaluationEntity); + applicationEvaluationEntity.setEndDate(endDate); + if(applicationEvaluationEntity.getSuspendedDays() == null) { + applicationEvaluationEntity.setSuspendedDays(0L); + } + applicationEvaluationEntity.setSuspendedDays(applicationEvaluationEntity.getSuspendedDays()+suspendedDays); + ApplicationEvaluationEntity applicationEvaluation = applicationEvaluationRepository.save(applicationEvaluationEntity); + + /** This code is responsible for adding a version history log for the "Update Application Amendment" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluationEntity).newData(applicationEvaluation).build()); + + return applicationEvaluation; + + + } + public List getApplicationAmendmentRequestEntitiesByApplicationEvaluationId(Long applicationEvaluationId){ + List applicationAmendmentRequestEntities=new ArrayList<>(); + applicationAmendmentRequestEntities=applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(applicationEvaluationId,ApplicationAmendmentRequestEnum.CLOSE.getValue()); + return applicationAmendmentRequestEntities; + } + private void softDeleteDocument(Long documentId) { documentService.deleteFile(documentId); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java index 9c0c8d90..fefe1469 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationEvaluationDao.java @@ -16,8 +16,10 @@ import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.AssignedApplicationsService; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.LoggingUtil; 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; @@ -106,6 +108,11 @@ public class ApplicationEvaluationDao { entity.setNote(req.getNote()); entity.setMotivation(req.getMotivation()); 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; } @@ -140,6 +147,7 @@ public class ApplicationEvaluationDao { response.setNote(entity.getNote()); response.setMotivation(entity.getMotivation()); response.setStatus(ApplicationEvaluationStatusTypeEnum.valueOf(entity.getStatus())); + response.setEvaluationEndDate(entity.getEndDate()); response.setCreatedDate(entity.getCreatedDate()); response.setUpdatedDate(entity.getUpdatedDate()); } @@ -421,7 +429,6 @@ public class ApplicationEvaluationDao { response.setCallName(application.getCall().getName() != null ? application.getCall().getName() : null); response.setProtocolNumber((application.getProtocol() != null && application.getProtocol().getProtocolNumber() != 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); } @@ -659,6 +666,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); @@ -958,7 +966,6 @@ public class ApplicationEvaluationDao { response.setCallName(application.getCall().getName() != null ? application.getCall().getName() : null); response.setProtocolNumber((application.getProtocol() != null && application.getProtocol().getProtocolNumber() != 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) { @@ -1366,16 +1373,11 @@ public class ApplicationEvaluationDao { } - List amendmentRequest = applicationAmendmentRequestRepository.findAllByApplicationEvaluationIdAndIsDeletedFalse(entity.getId()); - for (ApplicationAmendmentRequestEntity amendment : amendmentRequest) { - ApplicationAmendmentRequestEntity oldAmendment = Utils.getClonedEntityForData(amendment); - amendment.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue()); - - /** This code is responsible for adding a version history log for the "Update Application Amendment" operation. **/ - loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldAmendment).newData(amendment).build()); - + 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/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index 3332f0c0..e820297d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -5,6 +5,7 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.FaqEntity; @@ -16,6 +17,7 @@ import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; +import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; import net.gepafin.tendermanagement.service.ApplicationService; @@ -34,6 +36,7 @@ import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import static net.gepafin.tendermanagement.util.Utils.log; @@ -69,6 +72,9 @@ public class AssignedApplicationsDao { @Autowired private HttpServletRequest request; + @Autowired + private ApplicationEvaluationRepository applicationEvaluationRepository; + public AssignedApplicationsResponse createAssignedApplications(Long applicationId, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest) { log.info("Assigning application to pre-Instructor with details: {}", applicationId, userId); @@ -94,8 +100,8 @@ public class AssignedApplicationsDao { UserEntity user = userService.validateUser(userId); AssignedApplicationsEntity assignment = createAssignmentEntity(application, user.getId(), assignedByUser, assignedApplicationsRequest); + applicationEvaluationDao.createOrUpdateApplicationEvaluation(user, new ApplicationEvaluationRequest(), assignment.getId()); AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment); - applicationEvaluationDao.createOrUpdateApplicationEvaluation(user, new ApplicationEvaluationRequest(), assignApplicationToInstructorResponse.getId()); log.info("Application assigned succesfully {}", assignApplicationToInstructorResponse); return assignApplicationToInstructorResponse; } @@ -134,6 +140,7 @@ public class AssignedApplicationsDao { ApplicationEntity application = applicationService.validateApplication(assignedApplications.getApplication().getId()); String callName = application.getCall() != null ? application.getCall().getName() : ""; + Optional applicationEvaluationEntity=applicationEvaluationRepository.findByApplicationIdAndIsDeletedFalse(application.getId()); LocalDateTime callEndDate = application.getCall().getEndDate(); LocalDateTime callStartDate = application.getCall().getStartDate(); @@ -166,7 +173,9 @@ public class AssignedApplicationsDao { assignedApplicationsResponse.setSubmissionDate(submissionDate); assignedApplicationsResponse.setCallEndDate(callEndDate); assignedApplicationsResponse.setCallStartDate(callStartDate); - + if(applicationEvaluationEntity.isPresent()){ + assignedApplicationsResponse.setEvaluationEndDate(applicationEvaluationEntity.get().getEndDate()); + } return assignedApplicationsResponse; } 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 e2bb27aa..e33881b1 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") @@ -38,5 +40,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/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 0a92143b..7023b40b 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -147,7 +147,11 @@ public enum UserActionContextEnum { GET_FORM("GET_FORM"), CREATE_FORM("CREATE_FORM"), UPDATE_FORM("UPDATE_FORM"), - DELETE_FORM("DELETE_FORM"); + DELETE_FORM("DELETE_FORM"), + + /** scheduler action context **/ + AMENDMENT_EXPIRATION_SCHEDULER("AMENDMENT_EXPIRATION_SCHEDULER"), + EVALUATION_EXPIRATION_SCHEDULER("EVALUATION_EXPIRATION_SCHEDULER"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionLogsEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionLogsEnum.java index f68f6ae9..6fdd86f5 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionLogsEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionLogsEnum.java @@ -10,7 +10,8 @@ public enum UserActionLogsEnum { VIEW("VIEW"), INSERT("INSERT"), DOWNLOAD("DOWNLOAD"), - UPLOAD("UPLOAD"); + UPLOAD("UPLOAD"), + SCHEDULER("SCHEDULER"); private final 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 7f4722e2..8d144e50 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationEvaluationResponse.java @@ -28,6 +28,6 @@ public class ApplicationEvaluationResponse { private String callName; private String motivation; private LocalDateTime submissionDate; - private LocalDateTime evaluationDate; + private LocalDateTime evaluationEndDate; private LocalDateTime callEndDate; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java index 3affe42f..b975c150 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -21,6 +21,7 @@ public class AssignedApplicationsResponse extends BaseBean { private LocalDateTime callStartDate; private LocalDateTime callEndDate; private String companyName; + private LocalDateTime evaluationEndDate; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index 57331e43..a5443dd3 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -1,13 +1,17 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; + import org.springframework.data.jpa.repository.JpaRepository; 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; +import java.util.Set; public interface ApplicationAmendmentRequestRepository extends JpaRepository, JpaSpecificationExecutor { Optional findByIdAndIsDeletedFalse(Long id); @@ -25,6 +29,7 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository findAllByApplicationEvaluationIdAndIsDeletedFalse(Long id); @@ -34,4 +39,31 @@ 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.isDeleted = false " + + "AND a.status <> 'CLOSE' " + + "AND a.endDate < :currentTime") + List findAmendmentsDueForExpiration(LocalDateTime currentTime); + + + + @Query("SELECT DISTINCT a.applicationEvaluationEntity " + + "FROM ApplicationAmendmentRequestEntity a " + + "WHERE a.applicationEvaluationEntity.id IN :applicationEvaluationIds " + + "AND a.isDeleted = false " + + "AND NOT EXISTS ( " + + " SELECT 1 FROM ApplicationAmendmentRequestEntity activeAmendment" + + " WHERE activeAmendment.applicationEvaluationEntity.id = a.applicationEvaluationEntity.id " + + " AND activeAmendment.status <> 'CLOSE' " + + " AND activeAmendment.isDeleted = false) ") + Set findEvaluationsWithoutActiveAmendmentsByIds(@Param("applicationEvaluationIds") Set applicationEvaluationIds); + } 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/ApplicationAmendmentScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationAmendmentScheduler.java new file mode 100644 index 00000000..a3112a1c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationAmendmentScheduler.java @@ -0,0 +1,122 @@ +package net.gepafin.tendermanagement.scheduler; + +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.ApplicationAmendmentRequestDao; +import net.gepafin.tendermanagement.dao.EmailNotificationDao; +import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; +import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.enums.UserActionLogsEnum; +import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; +import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; +import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; +import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.util.LoggingUtil; +import net.gepafin.tendermanagement.util.Utils; + +@Component +public class ApplicationAmendmentScheduler { + + @Autowired + private HttpServletRequest httpServletRequest; + + @Autowired + private ApplicationAmendmentRequestRepository applicationAmendmentRepository; + + @Autowired + private EmailNotificationDao emailNotificationDao; + + @Autowired + private ApplicationAmendmentRequestDao applicationAmendmentRequestDao; + + @Autowired + private LoggingUtil loggingUtil; + + private static final Logger log = LoggerFactory.getLogger(ApplicationAmendmentScheduler.class); + + @Scheduled(cron = "0 0 1 * * ?") + public void processAmendmentExpirationScheduler() { + log.info("Starting the Application Amendment Expiration scheduler."); + try { + + Utils.setHttpServletRequestForScheduler(); + + /** This code is responsible for creating user action logs for the "Application Amendment Expiration scheduler" operation. **/ + loggingUtil.logUserActionWithoutToken( + UserActionRequest.builder().request(httpServletRequest).actionType(UserActionLogsEnum.SCHEDULER).actionContext(UserActionContextEnum.AMENDMENT_EXPIRATION_SCHEDULER).build()); + + List amendmentRequestList = applicationAmendmentRepository + .findAmendmentsDueForExpiration( + DateTimeUtil.DateServerToUTC(LocalDateTime.now()).with(LocalTime.MIN).plusSeconds(5)); + processAmendmentsForExpiration(amendmentRequestList); + log.info("Application Amendment Expiration scheduler completed successfully."); + } catch (Exception e) { + log.error("An error occurred during the Application Amendment Expiration scheduler: {}", e.getMessage(), e); + } + Utils.clearHttpServletRequest(); + } + + private void processAmendmentsForExpiration(List amendmentRequests) { + + log.info("Starting the process of expiring application amendments."); + amendmentRequests.forEach(request -> { + try { + ApplicationAmendmentRequestEntity oldAmendmentRequestEntity = Utils.getClonedEntityForData(request); + request.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue()); + request = applicationAmendmentRepository.save(request); + + /** This code is responsible for adding a version history log for the "Update Application Amendment" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(httpServletRequest).actionType(VersionActionTypeEnum.UPDATE).oldData(oldAmendmentRequestEntity).newData(request).build()); + + emailNotificationDao.sendApplicationFailureNotificationEmail(request); + log.info("Updated status to CLOSED for ApplicationAmendmentRequest with ID: {}", request.getId()); + } catch (Exception e) { + log.error("Error expiring ApplicationAmendmentRequest with ID {}: {}", request.getId(), e.getMessage(), + e); + } + }); + log.info("Completed the process of updating expiring application amendments."); + + log.info("Starting the process of updating EndDate in ApplicationEvaluations."); + try { + Set applicationEvaluationIds = amendmentRequests.stream() + .map(request -> request.getApplicationEvaluationEntity().getId()).collect(Collectors.toSet()); + + Set evaluationsWithoutActiveAmendmentList = applicationAmendmentRepository + .findEvaluationsWithoutActiveAmendmentsByIds(applicationEvaluationIds); + evaluationsWithoutActiveAmendmentList.forEach(evaluation -> { + try { + applicationAmendmentRequestDao.calculateEndDateAndSuspensionDays(evaluation); + log.info("Updated EndDate and suspension days for ApplicationEvaluation with ID: {}", + evaluation.getId()); + } catch (Exception e) { + log.error("Error updating EndDate for ApplicationEvaluation with ID {}: {}", evaluation.getId(), + e.getMessage(), e); + } + }); + + log.info("Completed the process of updating EndDate in ApplicationEvaluations."); + } catch (Exception e) { + log.error("An error occurred while updating EndDate in ApplicationEvaluations: {}", e.getMessage(), e); + } + + } + +} 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..a0444349 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java @@ -0,0 +1,99 @@ +package net.gepafin.tendermanagement.scheduler; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; +import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.enums.UserActionLogsEnum; +import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; +import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; +import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; +import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.util.LoggingUtil; +import net.gepafin.tendermanagement.util.Utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.List; + +@Component +public class ApplicationEvaluationScheduler { + + @Autowired + private ApplicationEvaluationRepository applicationEvaluationRepository; + + @Autowired + private LoggingUtil loggingUtil; + + @Autowired + private HttpServletRequest httpServletRequest; + + private static final Logger log = LoggerFactory.getLogger(ApplicationEvaluationScheduler.class); + + @Scheduled(cron = "0 0 2 * * ?") // Runs daily at midnight + public void updateExpiredEvaluations() { + log.info("Starting the Application Evaluation Expiration scheduler..."); + try { + + Utils.setHttpServletRequestForScheduler(); + + // Logging user action for the scheduler operation + loggingUtil.logUserActionWithoutToken( + UserActionRequest.builder().request(httpServletRequest).actionType(UserActionLogsEnum.SCHEDULER) + .actionContext(UserActionContextEnum.EVALUATION_EXPIRATION_SCHEDULER).build()); + + + processExpiredEvaluation(); + log.info("Completed the process of updating expiring application evaluations."); + } catch (Exception e) { + log.error("An error occurred during the Application Evaluation Expiration scheduler: {}", e.getMessage(), + e); + } finally { + Utils.clearHttpServletRequest(); + } + } + + private void processExpiredEvaluation() { + log.info("Starting the process of expiring application evaluations."); + + + try { + List evaluations = applicationEvaluationRepository + .findAllByIsDeletedFalseAndEndDateBefore( + DateTimeUtil.DateServerToUTC(LocalDateTime.now()).with(LocalTime.MIN).plusSeconds(5)); + log.info("Found {} evaluations to process for expiration.", evaluations.size()); + + for (ApplicationEvaluationEntity evaluation : evaluations) { + try { + log.debug("Processing evaluation with ID: {}", evaluation.getId()); + + ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils + .getClonedEntityForData(evaluation); + + evaluation.setStatus(ApplicationEvaluationStatusTypeEnum.EXPIRED.getValue()); + evaluation = applicationEvaluationRepository.save(evaluation); + + // Logging version history for the update operation + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(httpServletRequest) + .actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluationEntity) + .newData(evaluation).build()); + + log.info("Updated evaluation status to EXPIRED for ID: {}", evaluation.getId()); + } catch (Exception e) { + log.error("Error processing evaluation with ID: {}. Error: {}", evaluation.getId(), e.getMessage(), + e); + } + } + } catch (Exception e) { + log.error("An error occurred while fetching evaluations for expiration. Error: {}", e.getMessage(), e); + } + + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java deleted file mode 100644 index 69dc05cb..00000000 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java +++ /dev/null @@ -1,63 +0,0 @@ -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); - } -} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java index 4d3092a3..7329c5c3 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -20,6 +20,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundExceptio import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; @@ -45,6 +46,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override + @Transactional(rollbackFor = Exception.class) public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(HttpServletRequest request, Long applicationEvaluationId , ApplicationAmendmentRequest applicationAmendmentRequest) { Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(applicationEvaluationId); entityOptional.ifPresent(applicationEvaluationEntity -> validator.validatePreInstructor(request, applicationEvaluationEntity.getUserId())); @@ -52,6 +54,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override + @Transactional(rollbackFor = Exception.class) public void deleteApplicationAmendmentRequest(HttpServletRequest request, Long id) { ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, @@ -86,6 +89,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override + @Transactional(rollbackFor = Exception.class) public ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean) { ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(id); @@ -110,6 +114,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override + @Transactional(rollbackFor = Exception.class) public ApplicationAmendmentRequestResponse closeAmendmentRequest(HttpServletRequest request, Long id, CloseAmendmentRequest closeAmendmentRequest) { ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, @@ -123,6 +128,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override + @Transactional(rollbackFor = Exception.class) public ApplicationAmendmentRequestResponse extendResponseDays(HttpServletRequest request, Long id, Long addedDays) { UserEntity user= validator.validateUser(request); return applicationAmendmentRequestDao.extendResponseDays(id, addedDays); @@ -132,6 +138,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm return applicationAmendmentRequestDao.getAmendmentByApplicationId(request,applicationId,statuses); } @Override + @Transactional(rollbackFor = Exception.class) public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationAmendmentId, ApplicationAmendmentRequestEnum status) { return applicationAmendmentRequestDao.updateApplicationAmendmentStatus(applicationAmendmentId, status); diff --git a/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java b/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java index 53ed01cb..319795ec 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java +++ b/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java @@ -134,8 +134,12 @@ public class LoggingUtil { try { VersionHistoryEntity history = new VersionHistoryEntity(); String token = tokenProvider.extractTokenFromRequest(versionHistoryRequest.getRequest()); - Claims claims = tokenProvider.getClaimsFromToken(token); - Long userId = claims.get(GepafinConstant.USER_ID, Long.class); + if(versionHistoryRequest.getRequest() != null && token != null) + { + Claims claims = tokenProvider.getClaimsFromToken(token); + Long userId = claims.get(GepafinConstant.USER_ID, Long.class); + history.setUserId(userId); + } String oldData = Utils.convertEntityToJsonForLogging(versionHistoryRequest.getOldData()); String newData = Utils.convertEntityToJsonForLogging(versionHistoryRequest.getNewData()); history.setUserActionId(userActionId); @@ -144,7 +148,6 @@ public class LoggingUtil { history.setNewData(newData); history.setRecordId(recordId); history.setTableName(tableName); - history.setUserId(userId); versionHistoryRepository.save(history); } catch (Exception e) { log.error("Error logging version history: {}", e.getMessage(), e); diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 4949e5d5..7524c306 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -46,6 +46,9 @@ import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientNotFoundExcep import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientUnauthorizedException; import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientValidationException; import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; @@ -564,4 +567,17 @@ public class Utils { return null; } } + + public static void setHttpServletRequestForScheduler() { + MockHttpServletRequest mockRequest = new MockHttpServletRequest(); + mockRequest.setRequestURI("/scheduled"); + mockRequest.setMethod("POST"); + ServletRequestAttributes attributes = new ServletRequestAttributes(mockRequest); + RequestContextHolder.setRequestAttributes(attributes); + } + + public static void clearHttpServletRequest() { + // Clear the RequestContextHolder after task execution + RequestContextHolder.resetRequestAttributes(); + } } 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 de22ad45..a7703a60 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 @@ -1787,6 +1787,22 @@ + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 5c8345ed..d6aa4578 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -310,3 +310,6 @@ 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. user.must.be.associated.with.company.to.create.application=You must be associated with a company to apply for this application. 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 1aaaf17d..051ed432 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -305,3 +305,5 @@ 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. user.must.be.associated.with.company.to.create.application=Devi essere associato a un'azienda per poter presentare domanda per questa applicazione. 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.