diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index d49de7fd..c7592e3e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -941,7 +941,7 @@ public class ApplicationDao { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_IN_PREVIOUS_STATUS)); } if (status.equals(ApplicationStatusTypeEnum.SUBMIT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.READY.getValue()))) { - callService.validatePublishedCall(applicationEntity.getCall().getId(), userEntity.getHub().getId()); +// callService.validatePublishedCall(applicationEntity.getCall().getId(), userEntity.getHub().getId()); Long protocolNumber = protocolDao.getProtocolNumber(userEntity.getHub()); ProtocolEntity protocolEntity = protocolDao.createProtocolEntity(applicationEntity, protocolNumber, userEntity.getHub().getId(),true); applicationEntity.setProtocol(protocolEntity); @@ -1724,19 +1724,21 @@ public class ApplicationDao { public void checkCallEndDate(CallEntity call) { - LocalDateTime now = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); - - LocalDateTime callEndDateTime = LocalDateTime.of( - call.getEndDate().toLocalDate(), - call.getEndTime() - ); - - if (now.isAfter(callEndDateTime)) { - throw new CustomValidationException( - Status.BAD_REQUEST, - Translator.toLocale(GepafinConstant.CALL_EXPIRED) - ); - } + + callService.validatePublishedCall(call.getId(), call.getHub().getId()); +// LocalDateTime now = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); +// +// LocalDateTime callEndDateTime = LocalDateTime.of( +// call.getEndDate().toLocalDate(), +// call.getEndTime() +// ); +// +// if (now.isAfter(callEndDateTime)) { +// throw new CustomValidationException( +// Status.BAD_REQUEST, +// Translator.toLocale(GepafinConstant.CALL_EXPIRED) +// ); +// } } public void calculationProcessForFormula(ApplicationFormEntity applicationFormEntity, List contentResponseBeans, ApplicationFormFieldRequestBean applicationFormFieldRequestBean,FieldValidator fieldValidator) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 86a19a42..7b43dc3f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -796,6 +796,7 @@ public class CallDao { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL)); } + expirePublishedCalls(request); Specification spec = buildCallSpecification(request, user, companyId, onlyPreferredCall, onlyConfidiCall, callStatusList); List calls = callRepository.findAll(spec); @@ -959,8 +960,8 @@ public class CallDao { Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_PUBLISHED)); } - LocalDate currentDate = LocalDate.now(); - LocalTime currentTime = LocalTime.now(); + LocalDate currentDate = DateTimeUtil.DateServerToUTC(LocalDateTime.now()).toLocalDate(); + LocalTime currentTime = DateTimeUtil.LocalTimeServerToEurope(LocalTime.now()); if (currentDate.isBefore(callEntity.getStartDate().toLocalDate()) || (currentDate.isEqual(callEntity.getStartDate().toLocalDate()) && currentTime.isBefore(callEntity.getStartTime()))) { @@ -1000,6 +1001,7 @@ public class CallDao { Translator.toLocale(GepafinConstant.COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL) ); } + expirePublishedCalls(request); Specification spec = search(request,user, callPageableRequestBean); Page entityPage; if (Boolean.TRUE.equals(onlyPreferredCall)) { @@ -1078,7 +1080,6 @@ public class CallDao { private List getPredicates(HttpServletRequest request,CallPageableRequestBean callPageableRequestBean, CriteriaBuilder criteriaBuilder, Root root, UserEntity userEntity) { - expirePublishedCalls(request); Integer year = null; String search = null; Map filters = new HashMap<>(); @@ -1162,42 +1163,24 @@ public class CallDao { } public void expirePublishedCalls(HttpServletRequest request) { - List expiredCalls = callRepository.findAll((root, query, criteriaBuilder) -> { - Predicate isPublished = criteriaBuilder.equal(root.get(GepafinConstant.STATUS), CallStatusEnum.PUBLISH.name()); - - // Concatenate date and time as a single string - Expression dateTimeString = criteriaBuilder.concat( - root.get(GepafinConstant.END_DATE), - criteriaBuilder.literal(" ") // Space between date and time - ); - Expression fullDateTimeString = criteriaBuilder.concat(dateTimeString, root.get(GepafinConstant.END_TIME)); - - // Convert the concatenated string into TIMESTAMP - Expression endDateTime = criteriaBuilder.function( - "to_timestamp", - LocalDateTime.class, - fullDateTimeString, - criteriaBuilder.literal("YYYY-MM-DD HH24:MI:SS") - ); - - Predicate isExpired = criteriaBuilder.lessThan(endDateTime, LocalDateTime.now()); - - return criteriaBuilder.and(isPublished, isExpired); - }); - - if (!expiredCalls.isEmpty()) { - for (CallEntity call : expiredCalls) { + + + LocalDate currentDate = DateTimeUtil.DateServerToUTC(LocalDateTime.now()).toLocalDate(); + LocalTime currentTime = DateTimeUtil.LocalTimeServerToEurope(LocalTime.now()); + + List expirdedCallList = callRepository.findExpiredCallsWhichIsPublished(CallStatusEnum.PUBLISH.getValue(), currentDate, currentTime); + + if (!expirdedCallList.isEmpty()) { + + loggingUtil.logUserAction(UserActionRequest.builder() + .request(request) + .actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.UPDATE_EXPIRED_CALL) + .build()); + for (CallEntity call : expirdedCallList) { CallEntity oldCallEntity = Utils.getClonedEntityForData(call); // Clone before modification call.setStatus(CallStatusEnum.EXPIRED.getValue()); - if (!oldCallEntity.getStatus().equals(call.getStatus())) { - // Log user action - loggingUtil.logUserAction(UserActionRequest.builder() - .request(request) - .actionType(UserActionLogsEnum.UPDATE) - .actionContext(UserActionContextEnum.UPDATE_EXPIRED_CALL) - .build()); - // Add version history log loggingUtil.addVersionHistory(VersionHistoryRequest.builder() .request(request) @@ -1205,9 +1188,8 @@ public class CallDao { .oldData(oldCallEntity) .newData(call) .build()); - } } - callRepository.saveAll(expiredCalls); // Save all modified calls at once + callRepository.saveAll(expirdedCallList); // Save all modified calls at once } } private void applyFilters(Root root, CriteriaBuilder criteriaBuilder, List predicates, Map filters) { diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index 5d2bf7f7..98a199d0 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -7,6 +7,8 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalTime; import java.util.List; @Repository @@ -58,5 +60,8 @@ public interface CallRepository extends JpaRepository, JpaSpec List findByIdInAndStatusInAndConfidi(@Param("ids") List ids, @Param("status") List status,Boolean confidi); public List findByStatusInAndHubIdAndConfidi(List callStatus, Long hubId,Boolean onlyConfidiCall); + + @Query("SELECT c FROM CallEntity c WHERE c.status = :status AND (FUNCTION('DATE', c.endDate) < :endDate OR (FUNCTION('DATE', c.endDate) = :endDate AND c.endTime <= :endTime))") + List findExpiredCallsWhichIsPublished(@Param("status") String status, @Param("endDate") LocalDate endDate, @Param("endTime") LocalTime endTime); } diff --git a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java index 1a68818f..bafd5d6d 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java +++ b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java @@ -4,6 +4,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.stereotype.Component; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; @@ -28,6 +29,11 @@ public class DateTimeUtil { return localDatetime; } + public static LocalTime LocalTimeServerToEurope(LocalTime systemTime) { + ZonedDateTime zonedDateTime = systemTime.atDate(LocalDate.now()).atZone(ZoneId.systemDefault()); + return zonedDateTime.withZoneSameInstant(ZoneId.of("Europe/Rome")).toLocalTime(); + } + public static LocalDateTime getPreviousMonthDate(int month) { Calendar c = Calendar.getInstance(); c.add(Calendar.MONTH, -month);