diff --git a/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResource.java index eb2685c49e2..d54dae31d4e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResource.java +++ b/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResource.java @@ -131,8 +131,25 @@ private SQLBuilder getExtraCriteria(MakerCheckerRequest makerCheckerRequest) { } extraCriteria.addNonNullCriteria("aud.resource_id = ", makerCheckerRequest.getResourceId()); extraCriteria.addNonNullCriteria("aud.maker_id = ", makerCheckerRequest.getMakerId()); - extraCriteria.addNonNullCriteria("aud.made_on_date >= ", makerCheckerRequest.getMakerDateTimeFrom()); - extraCriteria.addNonNullCriteria("aud.made_on_date <= ", makerCheckerRequest.getMakerDateTimeTo()); + if (StringUtils.isNotBlank(makerCheckerRequest.getUsername())) { + extraCriteria.addCriteria("mk.username like ", makerCheckerRequest.getUsername().trim() + "%"); + } + if (makerCheckerRequest.getMakerDateTimeFrom() != null) { + extraCriteria.addSubOperation((SQLBuilder criteria) -> { + criteria.addNonNullCriteria("aud.made_on_date >= ", makerCheckerRequest.getMakerDateTimeFrom(), + SQLBuilder.WhereLogicalOperator.NONE); + criteria.addNonNullCriteria("aud.made_on_date_utc >= ", makerCheckerRequest.getMakerDateTimeFrom(), + SQLBuilder.WhereLogicalOperator.OR); + }); + } + if (makerCheckerRequest.getMakerDateTimeTo() != null) { + extraCriteria.addSubOperation((SQLBuilder criteria) -> { + criteria.addNonNullCriteria("aud.made_on_date <= ", makerCheckerRequest.getMakerDateTimeTo(), + SQLBuilder.WhereLogicalOperator.NONE); + criteria.addNonNullCriteria("aud.made_on_date_utc <= ", makerCheckerRequest.getMakerDateTimeTo(), + SQLBuilder.WhereLogicalOperator.OR); + }); + } extraCriteria.addNonNullCriteria("aud.office_id = ", makerCheckerRequest.getOfficeId()); extraCriteria.addNonNullCriteria("aud.group_id = ", makerCheckerRequest.getGroupId()); extraCriteria.addNonNullCriteria("aud.client_id = ", makerCheckerRequest.getClientId()); diff --git a/fineract-provider/src/main/java/org/apache/fineract/commands/data/request/MakerCheckerRequest.java b/fineract-provider/src/main/java/org/apache/fineract/commands/data/request/MakerCheckerRequest.java index 0843789b28c..673a585d591 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/commands/data/request/MakerCheckerRequest.java +++ b/fineract-provider/src/main/java/org/apache/fineract/commands/data/request/MakerCheckerRequest.java @@ -21,11 +21,17 @@ import jakarta.ws.rs.QueryParam; import java.io.Serial; import java.io.Serializable; +import java.time.LocalDate; import java.time.LocalTime; import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.Locale; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.apache.commons.lang3.StringUtils; import org.apache.fineract.infrastructure.core.service.DateUtils; @Setter @@ -44,6 +50,8 @@ public class MakerCheckerRequest implements Serializable { private Long resourceId; @QueryParam("makerId") private Long makerId; + @QueryParam("username") + private String username; @QueryParam("makerDateTimeFrom") private String makerDateTimeFrom; @QueryParam("makerDateTimeTo") @@ -64,10 +72,28 @@ public class MakerCheckerRequest implements Serializable { private String locale; public OffsetDateTime getMakerDateTimeFrom() { - return DateUtils.convertDateTimeStringToOffsetDateTime(makerDateTimeFrom, dateFormat, locale, LocalTime.MIN); + OffsetDateTime parsed = tryParseDayMonthYear(makerDateTimeFrom, LocalTime.MIN); + return parsed != null ? parsed + : DateUtils.convertDateTimeStringToOffsetDateTime(makerDateTimeFrom, dateFormat, locale, LocalTime.MIN); } public OffsetDateTime getMakerDateTimeTo() { - return DateUtils.convertDateTimeStringToOffsetDateTime(makerDateTimeTo, dateFormat, locale, LocalTime.MAX); + OffsetDateTime parsed = tryParseDayMonthYear(makerDateTimeTo, LocalTime.MAX); + return parsed != null ? parsed + : DateUtils.convertDateTimeStringToOffsetDateTime(makerDateTimeTo, dateFormat, locale, LocalTime.MAX); + } + + private static final DateTimeFormatter DAY_MONTH_YEAR = DateTimeFormatter.ofPattern("dd MMMM yyyy", Locale.ENGLISH); + + private static OffsetDateTime tryParseDayMonthYear(String value, LocalTime time) { + if (StringUtils.isBlank(value)) { + return null; + } + try { + LocalDate date = LocalDate.parse(value.trim(), DAY_MONTH_YEAR); + return date.atTime(time).atOffset(ZoneOffset.UTC); + } catch (DateTimeParseException e) { + return null; + } } }