This is an automated email from the ASF dual-hosted git repository.

arnold pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new b44a2f2b1 Business date - part 3: Fix reports
b44a2f2b1 is described below

commit b44a2f2b140f6b0f35baf6bb558cd09d3d91bb3a
Author: Adam Saghy <[email protected]>
AuthorDate: Mon Jul 4 14:36:11 2022 +0200

    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 +
 .../tenant/parts/0017_fix_stretchy_reports.xml     | 67 ++++++++++++++++++++++
 5 files changed, 83 insertions(+), 5 deletions(-)

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<String, String> 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 @@
     <include file="parts/0014_remove_unused_jobs.xml" 
relativeToChangelogFile="true"/>
     <include file="parts/0015_add_business_date.xml" 
relativeToChangelogFile="true"/>
     <include file="parts/0016_changed_unique_constraint_of_ref_no.xml" 
relativeToChangelogFile="true"/>
+    <include file="parts/0017_fix_stretchy_reports.xml" 
relativeToChangelogFile="true"/>
 </databaseChangeLog>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog";
+                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+                   
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd";>
+    <changeSet author="fineract" id="1">
+        <update tableName="stretchy_parameter">
+            <column name="parameter_sql" value="select p.id, 
p.name&#13;&#10;from m_product_loan p&#13;&#10;where (p.currency_code = 
'${currencyId}' or '-1'= '${currencyId}')&#13;&#10;order by 2"/>
+            <where>id='25' AND parameter_name='loanProductIdSelectAll'</where>
+        </update>
+    </changeSet>
+    <changeSet author="fineract" id="2" context="postgresql">
+        <update tableName="stretchy_parameter">
+            <column name="parameter_sql" value="select sp.parameter_name, 
sp.parameter_variable, sp.parameter_label, 
sp.&quot;parameter_displayType&quot;, sp.&quot;parameter_FormatType&quot;, 
sp.parameter_default, sp.&quot;selectOne&quot;,  sp.&quot;selectAll&quot;, 
spp.parameter_name as parentParameterName from stretchy_parameter sp  left join 
stretchy_parameter spp on spp.id = sp.parent_id  where sp.special is null  and 
exists     (select 'f'    from stretchy_report sr    join stretchy [...]
+            <where>id='1002' AND parameter_name='FullParameterList'</where>
+        </update>
+    </changeSet>
+    <changeSet author="fineract" id="3" context="postgresql">
+        <update tableName="stretchy_report">
+            <column name="report_sql" value="select  ml.id as loanId,  
COALESCE(mc.id,mc2.id) as id,  COALESCE(mc.firstname,mc2.firstname) as 
firstname,   COALESCE(mc.middlename,mc2.middlename,(\'\')) as middlename, 
COALESCE(mc.lastname,mc2.lastname) as lastname,   
COALESCE(mc.display_name,mc2.display_name) as display_name, 
COALESCE(mc.status_enum,mc2.status_enum) as status_enum,  
COALESCE(mc.mobile_no,mc2.mobile_no) as mobile_no, 
COALESCE(mg.office_id,mc2.office_id) as office_id, COALES [...]
+            <where>id='190' AND report_name='Loan Approved - Email'</where>
+        </update>
+    </changeSet>
+    <changeSet author="fineract" id="4" context="postgresql">
+        <update tableName="stretchy_report">
+            <column name="report_sql" value="select  ml.id as loanId,  
COALESCE(mc.id,mc2.id) as id,  COALESCE(mc.firstname,mc2.firstname) as 
firstname,   COALESCE(mc.middlename,mc2.middlename,(\'\')) as middlename, 
COALESCE(mc.lastname,mc2.lastname) as lastname,   
COALESCE(mc.display_name,mc2.display_name) as display_name, 
COALESCE(mc.status_enum,mc2.status_enum) as status_enum,  
COALESCE(mc.mobile_no,mc2.mobile_no) as mobile_no, 
COALESCE(mg.office_id,mc2.office_id) as office_id, COALES [...]
+            <where>id='191' AND report_name='Loan Rejected - Email'</where>
+        </update>
+    </changeSet>
+    <changeSet author="fineract" id="5" context="postgresql">
+        <update tableName="stretchy_report">
+            <column name="report_sql" value="select  ml.id as loanId,  
COALESCE(mc.id,mc2.id) as id,  COALESCE(mc.firstname,mc2.firstname) as 
firstname,   COALESCE(mc.middlename,mc2.middlename,(\'\')) as middlename, 
COALESCE(mc.lastname,mc2.lastname) as lastname,   
COALESCE(mc.display_name,mc2.display_name) as display_name,  
COALESCE(mc.status_enum,mc2.status_enum) as status_enum,   
COALESCE(mc.mobile_no,mc2.mobile_no) as mobile_no, 
COALESCE(mg.office_id,mc2.office_id) as office_id, COAL [...]
+            <where>id='192' AND report_name='Loan Repayment - Email'</where>
+        </update>
+    </changeSet>
+    <changeSet author="fineract" id="6">
+        <update tableName="stretchy_parameter">
+            <column name="parameter_sql" value="select  r.id as report_id, 
r.report_name, r.report_type, r.report_subtype, r.report_category,&#10;rp.id as 
parameter_id, rp.report_parameter_name, p.parameter_name&#10;  from 
stretchy_report r&#10;  left join stretchy_report_parameter rp on rp.report_id 
= r.id &#10;  left join stretchy_parameter p on p.id = rp.parameter_id&#10;  
where r.use_report is true and r.self_service_user_report = 
${isSelfServiceUser}&#10;  and exists&#10;  ( select  [...]
+            <where>id='1001' AND parameter_name='FullReportList'</where>
+        </update>
+    </changeSet>
+    <changeSet author="fineract" id="7">
+        <update tableName="stretchy_parameter">
+            <column name="parameter_sql" value="select  r.id as report_id, 
r.report_name, r.report_type, r.report_subtype, r.report_category,&#10;  rp.id 
as parameter_id, rp.report_parameter_name, p.parameter_name&#10;  from 
stretchy_report r&#10;  left join stretchy_report_parameter rp on rp.report_id 
= r.id&#10;  left join stretchy_parameter p on p.id = rp.parameter_id&#10;  
where r.report_category = '${reportCategory}'&#10;  and r.use_report is true 
and r.self_service_user_report = ${ [...]
+            <where>id='1003' AND parameter_name='reportCategoryList'</where>
+        </update>
+    </changeSet>
+</databaseChangeLog>

Reply via email to