Fix transaction cannot be in future check

This commit is contained in:
Adam Saghy
2022-08-01 07:25:13 +02:00
committed by Arnold Gálovics
parent a73c593eb8
commit 7fb61d028e
14 changed files with 116 additions and 28 deletions
@@ -53,7 +53,7 @@ public class ProvisioningEntriesReadPlatformServiceImpl implements ProvisioningE
@Override
public Collection<LoanProductProvisioningEntryData> retrieveLoanProductsProvisioningData(LocalDate date) {
String formattedDate = DateUtils.DEFAULT_DATE_FORMATER.format(date);
String formattedDate = DateUtils.DEFAULT_DATE_FORMATTER.format(date);
LoanProductProvisioningEntryMapper mapper = new LoanProductProvisioningEntryMapper(sqlGenerator);
final String sql = mapper.schema();
return this.jdbcTemplate.query(sql, mapper, formattedDate, formattedDate, formattedDate);
@@ -181,8 +181,8 @@ public class EmailReadPlatformServiceImpl implements EmailReadPlatformService {
String fromDateString = null;
String toDateString = null;
if (dateFrom != null && dateTo != null) {
fromDateString = DateUtils.DEFAULT_DATE_FORMATER.format(dateFrom);
toDateString = DateUtils.DEFAULT_DATE_FORMATER.format(dateTo);
fromDateString = DateUtils.DEFAULT_DATE_FORMATTER.format(dateFrom);
toDateString = DateUtils.DEFAULT_DATE_FORMATTER.format(dateTo);
sqlBuilder.append(" and emo.submittedon_date >= ? and emo.submittedon_date <= ? ");
}
final String sqlPlusLimit = (limit > 0) ? " " + sqlGenerator.limit(limit) : "";
@@ -31,9 +31,9 @@ public final class DateUtils {
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
public static final String DEFAULT_DATETIME_FORMAT = DEFAULT_DATE_FORMAT + " HH:mm:ss";
public static final DateTimeFormatter DEFAULT_DATETIME_FORMATER = new DateTimeFormatterBuilder().appendPattern(DEFAULT_DATETIME_FORMAT)
public static final DateTimeFormatter DEFAULT_DATETIME_FORMATTER = new DateTimeFormatterBuilder().appendPattern(DEFAULT_DATETIME_FORMAT)
.toFormatter();
public static final DateTimeFormatter DEFAULT_DATE_FORMATER = new DateTimeFormatterBuilder().appendPattern(DEFAULT_DATE_FORMAT)
public static final DateTimeFormatter DEFAULT_DATE_FORMATTER = new DateTimeFormatterBuilder().appendPattern(DEFAULT_DATE_FORMAT)
.toFormatter();
private DateUtils() {
@@ -90,9 +90,9 @@ public class DatabaseSpecificSQLGenerator {
public String currentBusinessDate() {
if (databaseTypeResolver.isMySQL()) {
return format("DATE('%s')", DateUtils.getBusinessLocalDate().format(DateUtils.DEFAULT_DATE_FORMATER));
return format("DATE('%s')", DateUtils.getBusinessLocalDate().format(DateUtils.DEFAULT_DATE_FORMATTER));
} else if (databaseTypeResolver.isPostgreSQL()) {
return format("DATE '%s'", DateUtils.getBusinessLocalDate().format(DateUtils.DEFAULT_DATE_FORMATER));
return format("DATE '%s'", DateUtils.getBusinessLocalDate().format(DateUtils.DEFAULT_DATE_FORMATTER));
} else {
throw new IllegalStateException("Database type is not supported for current date " + databaseTypeResolver.databaseType());
}
@@ -100,9 +100,9 @@ public class DatabaseSpecificSQLGenerator {
public String currentTenantDate() {
if (databaseTypeResolver.isMySQL()) {
return format("DATE('%s')", DateUtils.getLocalDateOfTenant().format(DateUtils.DEFAULT_DATE_FORMATER));
return format("DATE('%s')", DateUtils.getLocalDateOfTenant().format(DateUtils.DEFAULT_DATE_FORMATTER));
} else if (databaseTypeResolver.isPostgreSQL()) {
return format("DATE '%s'", DateUtils.getLocalDateOfTenant().format(DateUtils.DEFAULT_DATE_FORMATER));
return format("DATE '%s'", DateUtils.getLocalDateOfTenant().format(DateUtils.DEFAULT_DATE_FORMATTER));
} else {
throw new IllegalStateException("Database type is not supported for current date " + databaseTypeResolver.databaseType());
}
@@ -110,9 +110,9 @@ public class DatabaseSpecificSQLGenerator {
public String currentTenantDateTime() {
if (databaseTypeResolver.isMySQL()) {
return format("TIMESTAMP('%s')", DateUtils.getLocalDateTimeOfTenant().format(DateUtils.DEFAULT_DATETIME_FORMATER));
return format("TIMESTAMP('%s')", DateUtils.getLocalDateTimeOfTenant().format(DateUtils.DEFAULT_DATETIME_FORMATTER));
} else if (databaseTypeResolver.isPostgreSQL()) {
return format("TIMESTAMP '%s'", DateUtils.getLocalDateTimeOfTenant().format(DateUtils.DEFAULT_DATETIME_FORMATER));
return format("TIMESTAMP '%s'", DateUtils.getLocalDateTimeOfTenant().format(DateUtils.DEFAULT_DATETIME_FORMATTER));
} else {
throw new IllegalStateException("Database type is not supported for current date time" + databaseTypeResolver.databaseType());
}
@@ -171,7 +171,7 @@ public class GenericDataServiceImpl implements GenericDataService {
"[" + localDate.getYear() + ", " + localDate.getMonthValue() + ", " + localDate.getDayOfMonth() + "]");
} else if (currColType.equals("DATETIME")) {
final LocalDateTime localDateTime = LocalDateTime.parse(formatDateTimeValue(currVal),
DateUtils.DEFAULT_DATETIME_FORMATER);
DateUtils.DEFAULT_DATETIME_FORMATTER);
writer.append("[" + localDateTime.getYear() + ", " + localDateTime.getMonthValue() + ", "
+ localDateTime.getDayOfMonth() + ", " + localDateTime.getHour() + ", " + localDateTime.getMinute()
+ ", " + localDateTime.getSecond() + ", " + localDateTime.get(ChronoField.MILLI_OF_SECOND) + "]");
@@ -33,21 +33,21 @@ public final class ReportMailingJobDateUtil {
* get the current date as string using the mysql date format yyyy-MM-dd
**/
public static String getTodayDateAsString() {
return DateUtils.getLocalDateOfTenant().format(DateUtils.DEFAULT_DATE_FORMATER);
return DateUtils.getLocalDateOfTenant().format(DateUtils.DEFAULT_DATE_FORMATTER);
}
/**
* get the yesterday's date as string using the mysql date format yyyy-MM-dd
**/
public static String getYesterdayDateAsString() {
return DateUtils.getLocalDateOfTenant().minusDays(1).format(DateUtils.DEFAULT_DATE_FORMATER);
return DateUtils.getLocalDateOfTenant().minusDays(1).format(DateUtils.DEFAULT_DATE_FORMATTER);
}
/**
* get the tomorrow's date as string using the mysql date format yyyy-MM-dd
**/
public static String getTomorrowDateAsString() {
return DateUtils.getLocalDateOfTenant().plusDays(1).format(DateUtils.DEFAULT_DATE_FORMATER);
return DateUtils.getLocalDateOfTenant().plusDays(1).format(DateUtils.DEFAULT_DATE_FORMATTER);
}
/**
@@ -216,8 +216,8 @@ public class SmsReadPlatformServiceImpl implements SmsReadPlatformService {
String fromDateString = null;
String toDateString = null;
if (dateFrom != null && dateTo != null) {
fromDateString = DateUtils.DEFAULT_DATE_FORMATER.format(dateFrom);
toDateString = DateUtils.DEFAULT_DATE_FORMATER.format(dateTo);
fromDateString = DateUtils.DEFAULT_DATE_FORMATTER.format(dateFrom);
toDateString = DateUtils.DEFAULT_DATE_FORMATTER.format(dateTo);
sqlBuilder.append(" and smo.submittedon_date >= ? and smo.submittedon_date <= ? ");
objectArray[arrayPos] = fromDateString;
arrayPos = arrayPos + 1;
@@ -89,7 +89,7 @@ public class HolidayReadPlatformServiceImpl implements HolidayReadPlatformServic
final LocalDate toDate) {
this.context.authenticatedUser();
final DateTimeFormatter df = DateUtils.DEFAULT_DATE_FORMATER;
final DateTimeFormatter df = DateUtils.DEFAULT_DATE_FORMATTER;
final Object[] objectArray = new Object[3];
int arrayPos = 0;
@@ -60,7 +60,7 @@ public class DateRange {
final String testee;
if (dateToParse == null) {
testee = DateUtils.DEFAULT_DATE_FORMATER.format(DateUtils.getBusinessLocalDate());
testee = DateUtils.DEFAULT_DATE_FORMATTER.format(DateUtils.getBusinessLocalDate());
} else {
testee = dateToParse;
}
@@ -68,14 +68,14 @@ public class DateRange {
final StringTokenizer tokenizer = new StringTokenizer(testee, DateRange.RANGE_DELIMITER);
try {
dateRange.setStartDate(LocalDate.parse(tokenizer.nextToken(), DateUtils.DEFAULT_DATE_FORMATER));
dateRange.setStartDate(LocalDate.parse(tokenizer.nextToken(), DateUtils.DEFAULT_DATE_FORMATTER));
} catch (DateTimeParseException ex) {
LOG.error("Problem occurred in DateRange function Could not parse the date recieved.", ex);
}
if (tokenizer.hasMoreTokens()) {
try {
dateRange.setEndDate(LocalDate.parse(tokenizer.nextToken(), DateUtils.DEFAULT_DATE_FORMATER));
dateRange.setEndDate(LocalDate.parse(tokenizer.nextToken(), DateUtils.DEFAULT_DATE_FORMATTER));
} catch (DateTimeParseException ex) {
LOG.error("Problem occurred in DateRange function Could not parse the date recieved.", ex);
}
@@ -126,7 +126,7 @@ public class StandingInstructionHistoryReadPlatformServiceImpl implements Standi
sqlBuilder.append(" and ");
}
sqlBuilder.append(" atsih.execution_time >= ? ");
paramObj.add(DateUtils.DEFAULT_DATE_FORMATER.format(standingInstructionDTO.startDateRange()));
paramObj.add(DateUtils.DEFAULT_DATE_FORMATTER.format(standingInstructionDTO.startDateRange()));
addAndCaluse = true;
}
@@ -135,7 +135,7 @@ public class StandingInstructionHistoryReadPlatformServiceImpl implements Standi
sqlBuilder.append(" and ");
}
sqlBuilder.append(" atsih.execution_time < ? ");
paramObj.add(DateUtils.DEFAULT_DATE_FORMATER.format(standingInstructionDTO.endDateRange()));
paramObj.add(DateUtils.DEFAULT_DATE_FORMATTER.format(standingInstructionDTO.endDateRange()));
addAndCaluse = true;
}
@@ -138,7 +138,7 @@ public final class CalendarUtils {
private static Date convertToiCal4JCompatibleDate(final LocalDateTime inputDate) {
Date formattedDate = null;
final String seedDateStr = DateUtils.DEFAULT_DATETIME_FORMATER.format(inputDate);
final String seedDateStr = DateUtils.DEFAULT_DATETIME_FORMATTER.format(inputDate);
try {
formattedDate = new Date(seedDateStr, DateUtils.DEFAULT_DATETIME_FORMAT);
} catch (final ParseException e) {
@@ -327,7 +327,7 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
final Long calendarId = query.longValueOfParameterNamed(calendarIdParamName);
final LocalDate transactionDate = query.localDateValueOfParameterNamed(transactionDateParamName);
final String transactionDateStr = DateUtils.DEFAULT_DATE_FORMATER.format(transactionDate);
final String transactionDateStr = DateUtils.DEFAULT_DATE_FORMATTER.format(transactionDate);
final Calendar calendar = this.calendarRepositoryWrapper.findOneWithNotFoundDetection(calendarId);
// check if transaction against calendar effective from date
@@ -462,7 +462,7 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
final CenterData center = this.centerReadPlatformService.retrieveOne(centerId);
final LocalDate transactionDate = query.localDateValueOfParameterNamed(transactionDateParamName);
final String dueDateStr = DateUtils.DEFAULT_DATE_FORMATER.format(transactionDate);
final String dueDateStr = DateUtils.DEFAULT_DATE_FORMATTER.format(transactionDate);
final JLGCollectionSheetFaltDataMapper mapper = new JLGCollectionSheetFaltDataMapper(sqlGenerator);
@@ -679,7 +679,7 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
this.collectionSheetGenerateCommandFromApiJsonDeserializer.validateForGenerateCollectionSheetOfIndividuals(query.json());
final LocalDate transactionDate = query.localDateValueOfParameterNamed(transactionDateParamName);
final String transactionDateStr = DateUtils.DEFAULT_DATE_FORMATER.format(transactionDate);
final String transactionDateStr = DateUtils.DEFAULT_DATE_FORMATTER.format(transactionDate);
final AppUser currentUser = this.context.authenticatedUser();
final String hierarchy = currentUser.getOffice().getHierarchy();
@@ -50,7 +50,7 @@ public class GenerateRdScheduleTasklet implements Tasklet {
final Collection<Map<String, Object>> scheduleDetails = depositAccountReadPlatformService.retriveDataForRDScheduleCreation();
String insertSql = "INSERT INTO m_mandatory_savings_schedule (savings_account_id, duedate, installment, deposit_amount, completed_derived, created_date, lastmodified_date) VALUES ";
StringBuilder sb = new StringBuilder();
String currentDate = DateUtils.getLocalDateTimeOfTenant().format(DateUtils.DEFAULT_DATETIME_FORMATER);
String currentDate = DateUtils.getLocalDateTimeOfTenant().format(DateUtils.DEFAULT_DATETIME_FORMATTER);
int iterations = 0;
for (Map<String, Object> details : scheduleDetails) {
Long count = (Long) details.get("futureInstallemts");
@@ -0,0 +1,88 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.infrastructure.core.service;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;
import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType;
import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class DateUtilsTest {
@BeforeEach
public void init() {
ThreadLocalContextUtil.setTenant(new FineractPlatformTenant(1L, "default", "Default", "Asia/Kolkata", null));
ThreadLocalContextUtil.setBusinessDates(new HashMap<>(Map.of(BusinessDateType.BUSINESS_DATE, LocalDate.of(2022, 6, 12))));
}
@Test
public void getSystemZoneIdTest() {
TimeZone.setDefault(TimeZone.getTimeZone("GMT+02:00"));
assertEquals("GMT+02:00", DateUtils.getSystemZoneId().getId());
}
@Test
public void getDateTimeZoneOfTenant() {
assertEquals(ZoneId.of("Asia/Kolkata"), DateUtils.getDateTimeZoneOfTenant());
}
@Test
public void getLocalDateOfTenant() {
assertEquals(LocalDate.now(ZoneId.of("Asia/Kolkata")), DateUtils.getLocalDateOfTenant());
}
@Test
public void getLocalDateTimeOfTenant() {
assertEquals(LocalDateTime.now(ZoneId.of("Asia/Kolkata")).truncatedTo(ChronoUnit.SECONDS), DateUtils.getLocalDateTimeOfTenant());
}
@Test
public void getOffsetDateTimeOfTenant() {
assertEquals(OffsetDateTime.now(ZoneId.of("Asia/Kolkata")).truncatedTo(ChronoUnit.SECONDS), DateUtils.getOffsetDateTimeOfTenant());
}
@Test
public void getLocalDateTimeOfSystem() {
assertEquals(LocalDateTime.now(ZoneId.systemDefault()).truncatedTo(ChronoUnit.SECONDS), DateUtils.getLocalDateTimeOfSystem());
}
@Test
public void isDateInTheFuture() {
assertFalse(DateUtils.isDateInTheFuture(LocalDate.of(2022, 6, 11)));
assertFalse(DateUtils.isDateInTheFuture(LocalDate.of(2022, 6, 12)));
assertTrue(DateUtils.isDateInTheFuture(LocalDate.of(2022, 6, 13)));
}
@Test
public void getBusinesLocalDate() {
assertEquals(LocalDate.of(2022, 6, 12), DateUtils.getBusinessLocalDate());
}
}