Skip to content

Commit 414aec0

Browse files
authored
Merge pull request apache#5864
FINERACT-2611: Allow MakerCheckerRequest does not accept makerDateTim…
2 parents dc3dae0 + fe70b79 commit 414aec0

2 files changed

Lines changed: 48 additions & 3 deletions

File tree

fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/DateUtils.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant;
4343
import org.apache.fineract.infrastructure.core.exception.PlatformApiDataValidationException;
4444
import org.apache.fineract.infrastructure.core.serialization.JsonParserHelper;
45+
import org.apache.logging.log4j.util.Strings;
4546
import org.springframework.lang.NonNull;
4647

4748
public final class DateUtils {
@@ -464,6 +465,36 @@ public static LocalDateTime convertDateTimeStringToLocalDateTime(String dateTime
464465
}
465466
}
466467

468+
public static OffsetDateTime convertDateTimeStringToOffsetDateTime(String dateTimeStr, String dateFormat, String localeStr,
469+
LocalTime fallbackTime) {
470+
if (Strings.isEmpty(dateTimeStr)) {
471+
return null;
472+
}
473+
final Locale locale = localeStr == null ? null : JsonParserHelper.localeFromString(localeStr);
474+
DateTimeFormatter formatter = getDateFormatter(dateFormat, locale);
475+
TemporalAccessor parsed = formatter.parse(dateTimeStr);
476+
477+
boolean hasTime = parsed.isSupported(ChronoField.HOUR_OF_DAY) && parsed.isSupported(ChronoField.MINUTE_OF_HOUR);
478+
boolean hasOffset = parsed.isSupported(ChronoField.OFFSET_SECONDS);
479+
480+
try {
481+
if (hasTime && hasOffset) {
482+
return OffsetDateTime.from(parsed);
483+
} else if (hasTime) {
484+
LocalDateTime localDateTime = LocalDateTime.from(parsed);
485+
return localDateTime.atOffset(ZoneOffset.UTC);
486+
} else {
487+
LocalDate date = LocalDate.from(parsed);
488+
LocalDateTime localDateTime = LocalDateTime.of(date, fallbackTime);
489+
return localDateTime.atOffset(ZoneOffset.UTC);
490+
}
491+
} catch (final DateTimeParseException e) {
492+
final List<ApiParameterError> errors = List.of(ApiParameterError.parameterError("validation.msg.invalid.date.pattern",
493+
"The parameter date (" + dateTimeStr + ") format is invalid", "date", dateTimeStr));
494+
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", errors, e);
495+
}
496+
}
497+
467498
/**
468499
* Returns the earlier date. If date1 is before date2 it return date1 otherwise date2.
469500
*

fineract-provider/src/main/java/org/apache/fineract/commands/data/request/MakerCheckerRequest.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@
2121
import jakarta.ws.rs.QueryParam;
2222
import java.io.Serial;
2323
import java.io.Serializable;
24-
import java.time.ZonedDateTime;
24+
import java.time.LocalTime;
25+
import java.time.OffsetDateTime;
2526
import lombok.Getter;
2627
import lombok.NoArgsConstructor;
2728
import lombok.Setter;
29+
import org.apache.fineract.infrastructure.core.service.DateUtils;
2830

2931
@Setter
3032
@Getter
@@ -43,9 +45,9 @@ public class MakerCheckerRequest implements Serializable {
4345
@QueryParam("makerId")
4446
private Long makerId;
4547
@QueryParam("makerDateTimeFrom")
46-
private ZonedDateTime makerDateTimeFrom;
48+
private String makerDateTimeFrom;
4749
@QueryParam("makerDateTimeTo")
48-
private ZonedDateTime makerDateTimeTo;
50+
private String makerDateTimeTo;
4951
@QueryParam("clientId")
5052
private Long clientId;
5153
@QueryParam("loanid")
@@ -56,4 +58,16 @@ public class MakerCheckerRequest implements Serializable {
5658
private Long groupId;
5759
@QueryParam("savingsAccountId")
5860
private Long savingsAccountId;
61+
@QueryParam("dateFormat")
62+
private String dateFormat;
63+
@QueryParam("locale")
64+
private String locale;
65+
66+
public OffsetDateTime getMakerDateTimeFrom() {
67+
return DateUtils.convertDateTimeStringToOffsetDateTime(makerDateTimeFrom, dateFormat, locale, LocalTime.MIN);
68+
}
69+
70+
public OffsetDateTime getMakerDateTimeTo() {
71+
return DateUtils.convertDateTimeStringToOffsetDateTime(makerDateTimeTo, dateFormat, locale, LocalTime.MAX);
72+
}
5973
}

0 commit comments

Comments
 (0)