diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 205ff89a..63e399b0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -2,7 +2,6 @@ package net.gepafin.tendermanagement.dao; import jakarta.persistence.criteria.*; import net.gepafin.tendermanagement.config.Translator; -import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; @@ -47,6 +46,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.math.BigDecimal; +import java.sql.Timestamp; import java.text.MessageFormat; import java.text.NumberFormat; import java.text.ParseException; @@ -54,6 +54,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -63,6 +64,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import static org.apache.commons.lang3.StringUtils.isEmpty; +import static org.hibernate.validator.internal.engine.messageinterpolation.el.RootResolver.FORMATTER; @Component public class ApplicationDao { @@ -1592,7 +1594,7 @@ public class ApplicationDao { if (fieldPath != null) { applyStringFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); applyNumberFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); - // applyDateFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); // Date filter is commented + applyDateFilter(fieldPath, criteriaBuilder, predicates, value, matchMode,root); } } } @@ -1603,7 +1605,7 @@ public class ApplicationDao { if (value instanceof String) { String valueStr = (String) value; if (fieldPath.getJavaType().equals(String.class)) { - MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); switch (mode) { case CONTAINS -> predicates.add(criteriaBuilder.like(criteriaBuilder.lower(fieldPath.as(String.class)), "%" + valueStr.toLowerCase() + "%")); @@ -1623,31 +1625,36 @@ public class ApplicationDao { if (value instanceof Number) { numberValue = (Number) value; } - MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); switch (mode) { case EQUALS -> predicates.add(criteriaBuilder.equal(fieldPath, numberValue)); } } } -/* -private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode) { - if (fieldPath.getJavaType().equals(LocalDateTime.class)) { - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); - LocalDateTime dateValue = LocalDateTime.parse(value.toString(), formatter); - Expression fieldAsString = criteriaBuilder.function("TO_CHAR", String.class, fieldPath, criteriaBuilder.literal("YYYY-MM-DD HH24:MI:SS.MS")); + public static LocalDateTime parseStringToLocalDateTime(String timestampStr) { + // Use ISO_LOCAL_DATE_TIME to parse the input string + return LocalDateTime.parse(timestampStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME); + } - MatchModeEnum mode = MatchModeEnum.valueOf(matchMode.getValue()); - switch (mode) { + private void applyDateFilter(Path fieldPath, CriteriaBuilder criteriaBuilder, List predicates, Object value, MatchModeEnum matchMode, Root root) { + if (fieldPath.getJavaType().equals(LocalDateTime.class)) { + LocalDateTime testDateTime = parseStringToLocalDateTime(value.toString()); + MatchModeEnum mode = MatchModeEnum.fromObject(matchMode.getValue()); - case EQUALS -> predicates.add(criteriaBuilder.equal(fieldAsString, value.toString())); - case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(LocalDateTime.class), dateValue)); - case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(LocalDateTime.class), dateValue)); + + switch (mode) { +// case DATEIS -> predicates.add(criteriaBuilder.equal(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); + case DATEISNOT -> predicates.add(criteriaBuilder.notEqual(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); + case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); + case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(testDateTime))); + } } } -} -*/ + + + private Path getFieldPath(Root root, String fieldName) { try { diff --git a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java index 836eb592..f3ee252c 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/MatchModeEnum.java @@ -4,18 +4,33 @@ import com.fasterxml.jackson.annotation.JsonValue; public enum MatchModeEnum { - STARTSWITH("STARTSWITH"), - ENDSWITH("ENDSWITH"), - CONTAINS("CONTAINS"), - EQUALS("EQUALS"), - BEFORE("BEFORE"), - AFTER("AFTER"); + STARTSWITH("Starts with"), + ENDSWITH("Ends with"), + CONTAINS("Contains"), + EQUALS("Equals"), + DATEIS("Date is"), + DATEISNOT("Date is not"), + BEFORE("Date is before"), + AFTER("Date is after"); private String value; MatchModeEnum(String value) { this.value = value; } + public static MatchModeEnum fromObject(Object value) { + if (value instanceof String) { + String strValue = ((String) value).trim(); + for (MatchModeEnum mode : MatchModeEnum.values()) { + if (mode.getValue().equalsIgnoreCase(strValue)) { + return mode; + } + } + } + throw new IllegalArgumentException("Invalid MatchModeEnum: " + value); + } + + @JsonValue public String getValue() {