From b44a2f2b140f6b0f35baf6bb558cd09d3d91bb3a Mon Sep 17 00:00:00 2001 From: Adam Saghy Date: Mon, 4 Jul 2022 14:36:11 +0200 Subject: [PATCH] Business date - part 3: Fix reports --- .../data/ResultsetColumnHeaderData.java | 6 +- .../service/GenericDataServiceImpl.java | 3 + .../service/ReadReportingServiceImpl.java | 11 ++- .../db/changelog/tenant/changelog-tenant.xml | 1 + .../parts/0017_fix_stretchy_reports.xml | 67 +++++++++++++++++++ 5 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 fineract-provider/src/main/resources/db/changelog/tenant/parts/0017_fix_stretchy_reports.xml diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnHeaderData.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnHeaderData.java index d5d6bf4cd..e318cd02d 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnHeaderData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnHeaderData.java @@ -179,7 +179,8 @@ public final class ResultsetColumnHeaderData implements Serializable { } private boolean isChar() { - return "char".equalsIgnoreCase(this.columnType) || "CHARACTER VARYING".equalsIgnoreCase(this.columnType); + return "char".equalsIgnoreCase(this.columnType) || "CHARACTER VARYING".equalsIgnoreCase(this.columnType) + || "bpchar".equalsIgnoreCase(this.columnType); } private boolean isVarchar() { @@ -201,7 +202,8 @@ public final class ResultsetColumnHeaderData implements Serializable { } private boolean isInteger() { - return "integer".equalsIgnoreCase(this.columnType) || "int4".equalsIgnoreCase(this.columnType); + return "integer".equalsIgnoreCase(this.columnType) || "int2".equalsIgnoreCase(this.columnType) + || "int4".equalsIgnoreCase(this.columnType); } private boolean isSmallInt() { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java index bbd8e1243..925871aac 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/GenericDataServiceImpl.java @@ -24,6 +24,7 @@ import java.time.temporal.ChronoField; import java.util.ArrayList; import java.util.List; import javax.sql.DataSource; +import lombok.extern.slf4j.Slf4j; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; import org.apache.fineract.infrastructure.core.service.DateUtils; import org.apache.fineract.infrastructure.core.service.RoutingDataSource; @@ -41,6 +42,7 @@ import org.springframework.jdbc.support.rowset.SqlRowSetMetaData; import org.springframework.stereotype.Service; @Service +@Slf4j public class GenericDataServiceImpl implements GenericDataService { private final JdbcTemplate jdbcTemplate; @@ -88,6 +90,7 @@ public class GenericDataServiceImpl implements GenericDataService { return new GenericResultsetData(columnHeaders, resultsetDataRows); } catch (DataAccessException e) { + log.error("Reporting error: {}", e.getMessage()); throw new PlatformDataIntegrityException("error.msg.report.unknown.data.integrity.issue", e.getClass().getName(), e); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java index 4b518014e..8f9ca8b80 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadReportingServiceImpl.java @@ -39,8 +39,10 @@ import java.util.Set; import javax.ws.rs.core.StreamingOutput; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.apache.fineract.infrastructure.core.domain.JdbcSupport; import org.apache.fineract.infrastructure.core.exception.PlatformDataIntegrityException; +import org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator; import org.apache.fineract.infrastructure.dataqueries.data.GenericResultsetData; import org.apache.fineract.infrastructure.dataqueries.data.ReportData; import org.apache.fineract.infrastructure.dataqueries.data.ReportParameterData; @@ -69,6 +71,7 @@ public class ReadReportingServiceImpl implements ReadReportingService { private final PlatformSecurityContext context; private final GenericDataService genericDataService; private final SqlInjectionPreventerService sqlInjectionPreventerService; + private final DatabaseSpecificSQLGenerator sqlGenerator; @Override public StreamingOutput retrieveReportCSV(final String name, final String type, final Map queryParams, @@ -187,9 +190,11 @@ public class ReadReportingServiceImpl implements ReadReportingService { // (typically used to return report lists containing only reports // permitted to be run by the user sql = this.genericDataService.replace(sql, "${currentUserId}", currentUser.getId().toString()); - - sql = this.genericDataService.replace(sql, "${isSelfServiceUser}", Integer.toString(isSelfServiceUserReport ? 1 : 0)); - + sql = this.genericDataService.replace(sql, "${isSelfServiceUser}", Boolean.toString(isSelfServiceUserReport)); + sql = this.genericDataService.replace(sql, "${currentDate}", sqlGenerator.currentBusinessDate()); + sql = StringUtils.replaceIgnoreCase(sql, "NOW()", sqlGenerator.currentTenantDateTime()); + sql = StringUtils.replaceIgnoreCase(sql, "curdate()", sqlGenerator.currentBusinessDate()); + sql = StringUtils.replaceIgnoreCase(sql, "CURRENT_DATE", sqlGenerator.currentBusinessDate()); sql = this.genericDataService.wrapSQL(sql); return sql; diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml index c5d7ef7f5..2b58405a6 100644 --- a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml +++ b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml @@ -36,4 +36,5 @@ + diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0017_fix_stretchy_reports.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0017_fix_stretchy_reports.xml new file mode 100644 index 000000000..331083ce2 --- /dev/null +++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0017_fix_stretchy_reports.xml @@ -0,0 +1,67 @@ + + + + + + + id='25' AND parameter_name='loanProductIdSelectAll' + + + + + + id='1002' AND parameter_name='FullParameterList' + + + + + + id='190' AND report_name='Loan Approved - Email' + + + + + + id='191' AND report_name='Loan Rejected - Email' + + + + + + id='192' AND report_name='Loan Repayment - Email' + + + + + + id='1001' AND parameter_name='FullReportList' + + + + + + id='1003' AND parameter_name='reportCategoryList' + + +