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 e15459c65 Datatables datetime fields management
e15459c65 is described below

commit e15459c659148565f0a3d38363ba62dcd0bb5616
Author: Jose Alberto Hernandez <[email protected]>
AuthorDate: Sat Jul 23 22:40:24 2022 -0500

    Datatables datetime fields management
---
 .../dataqueries/data/ResultsetRowData.java         |  8 ++---
 .../service/GenericDataServiceImpl.java            | 41 +++++++++-------------
 .../service/ReadReportingServiceImpl.java          |  8 ++---
 .../service/ReadWriteNonCoreDataServiceImpl.java   | 30 ++++++++++------
 .../parts/0019_refactor_loan_transaction.xml       |  4 +--
 5 files changed, 46 insertions(+), 45 deletions(-)

diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetRowData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetRowData.java
index d60252a1d..d000f15e2 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetRowData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetRowData.java
@@ -22,17 +22,17 @@ import java.util.List;
 
 public final class ResultsetRowData {
 
-    private final List<String> row;
+    private final List<Object> row;
 
-    public static ResultsetRowData create(final List<String> rowValues) {
+    public static ResultsetRowData create(final List<Object> rowValues) {
         return new ResultsetRowData(rowValues);
     }
 
-    private ResultsetRowData(final List<String> rowValues) {
+    private ResultsetRowData(final List<Object> rowValues) {
         this.row = rowValues;
     }
 
-    public List<String> getRow() {
+    public List<Object> getRow() {
         return this.row;
     }
 }
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 8ea83c115..597bca73c 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
@@ -18,15 +18,17 @@
  */
 package org.apache.fineract.infrastructure.dataqueries.service;
 
+import static java.lang.String.format;
+
+import java.sql.Timestamp;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
-import java.time.temporal.ChronoField;
 import java.util.ArrayList;
+import java.util.Date;
 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;
 import 
org.apache.fineract.infrastructure.core.service.database.DatabaseIndependentQueryService;
 import 
org.apache.fineract.infrastructure.dataqueries.data.GenericResultsetData;
@@ -77,7 +79,7 @@ public class GenericDataServiceImpl implements 
GenericDataService {
             }
 
             while (rs.next()) {
-                final List<String> columnValues = new ArrayList<>();
+                final List<Object> columnValues = new ArrayList<>();
                 for (int i = 0; i < rsmd.getColumnCount(); i++) {
                     final String columnName = rsmd.getColumnName(i + 1);
                     final String columnValue = rs.getString(columnName);
@@ -134,12 +136,12 @@ public class GenericDataServiceImpl implements 
GenericDataService {
         final List<ResultsetColumnHeaderData> columnHeaders = 
grs.getColumnHeaders();
 
         final List<ResultsetRowData> data = grs.getData();
-        List<String> row;
+        List<Object> row;
         Integer rSize;
         final String doubleQuote = "\"";
         final String slashDoubleQuote = "\\\"";
         String currColType;
-        String currVal;
+        Object currVal;
 
         for (int i = 0; i < data.size(); i++) {
             writer.append("\n{");
@@ -160,23 +162,24 @@ public class GenericDataServiceImpl implements 
GenericDataService {
                 if (currColType == null && colType.equalsIgnoreCase("DATE")) {
                     currColType = "DATE";
                 }
+                if (currColType == null && 
colType.equalsIgnoreCase("DATETIME")) {
+                    currColType = "DATETIME";
+                }
                 currVal = row.get(j);
                 if (currVal != null && currColType != null) {
                     if (currColType.equals("DECIMAL") || 
currColType.equals("INTEGER")) {
                         writer.append(currVal);
                     } else {
                         if (currColType.equals("DATE")) {
-                            final LocalDate localDate = 
LocalDate.parse(currVal);
-                            writer.append(
-                                    "[" + localDate.getYear() + ", " + 
localDate.getMonthValue() + ", " + localDate.getDayOfMonth() + "]");
+                            final LocalDate localDate = new 
java.sql.Date(((Date) currVal).getTime()).toLocalDate();
+                            writer.append(format("[%d,%d,%d]", 
localDate.getYear(), localDate.getMonthValue(), localDate.getDayOfMonth()));
                         } else if (currColType.equals("DATETIME")) {
-                            final LocalDateTime localDateTime = 
LocalDateTime.parse(formatDateTimeValue(currVal),
-                                    DateUtils.DEFAULT_DATETIME_FORMATTER);
-                            writer.append("[" + localDateTime.getYear() + ", " 
+ localDateTime.getMonthValue() + ", "
-                                    + localDateTime.getDayOfMonth() + ", " + 
localDateTime.getHour() + ", " + localDateTime.getMinute()
-                                    + ", " + localDateTime.getSecond() + ", " 
+ localDateTime.get(ChronoField.MILLI_OF_SECOND) + "]");
+                            final LocalDateTime ldt = currVal instanceof 
Timestamp ? ((Timestamp) currVal).toLocalDateTime()
+                                    : (LocalDateTime) currVal;
+                            writer.append(format("[%d,%d,%d,%d,%d,%d,%d]", 
ldt.getYear(), ldt.getMonthValue(), ldt.getDayOfMonth(),
+                                    ldt.getHour(), ldt.getMinute(), 
ldt.getSecond(), ldt.getNano()));
                         } else {
-                            writer.append(doubleQuote + replace(currVal, 
doubleQuote, slashDoubleQuote) + doubleQuote);
+                            writer.append(doubleQuote + replace((String) 
currVal, doubleQuote, slashDoubleQuote) + doubleQuote);
                         }
                     }
                 } else {
@@ -264,14 +267,4 @@ public class GenericDataServiceImpl implements 
GenericDataService {
             throw new DatatableNotFoundException(datatable);
         }
     }
-
-    private String formatDateTimeValue(String dateTimeValue) {
-        if (dateTimeValue.length() > 19) {
-            dateTimeValue = dateTimeValue.substring(0, 19);
-        }
-        if (dateTimeValue.contains("T")) {
-            dateTimeValue = dateTimeValue.replace("T", " ");
-        }
-        return dateTimeValue;
-    }
 }
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 8f9ca8b80..aa07c9c63 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
@@ -115,7 +115,7 @@ public class ReadReportingServiceImpl implements 
ReadReportingService {
         writer.append('\n');
 
         final List<ResultsetRowData> data = result.getData();
-        List<String> row;
+        List<Object> row;
         Integer rSize;
         // String currCol;
         String currColType;
@@ -129,7 +129,7 @@ public class ReadReportingServiceImpl implements 
ReadReportingService {
             for (int j = 0; j < rSize; j++) {
                 // currCol = columnHeaders.get(j).getColumnName();
                 currColType = columnHeaders.get(j).getColumnType();
-                currVal = row.get(j);
+                currVal = (String) row.get(j);
                 if (currVal != null) {
                     if (currColType.equals("DECIMAL") || 
currColType.equals("DOUBLE") || currColType.equals("BIGINT")
                             || currColType.equals("SMALLINT") || 
currColType.equals("INT")) {
@@ -252,7 +252,7 @@ public class ReadReportingServiceImpl implements 
ReadReportingService {
 
             final List<ResultsetColumnHeaderData> columnHeaders = 
result.getColumnHeaders();
             final List<ResultsetRowData> data = result.getData();
-            List<String> row;
+            List<Object> row;
 
             log.info("NO. of Columns: {}", columnHeaders.size());
             final Integer chSize = columnHeaders.size();
@@ -282,7 +282,7 @@ public class ReadReportingServiceImpl implements 
ReadReportingService {
                 rSize = row.size();
                 for (int j = 0; j < rSize; j++) {
                     currColType = columnHeaders.get(j).getColumnType();
-                    currVal = row.get(j);
+                    currVal = (String) row.get(j);
                     if (currVal != null) {
                         if (currColType.equals("DECIMAL") || 
currColType.equals("DOUBLE") || currColType.equals("BIGINT")
                                 || currColType.equals("SMALLINT") || 
currColType.equals("INT")) {
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java
index ca887a6b0..5c9ad7fef 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/service/ReadWriteNonCoreDataServiceImpl.java
@@ -1310,7 +1310,7 @@ public class ReadWriteNonCoreDataServiceImpl implements 
ReadWriteNonCoreDataServ
             sql = sql + " order by " + order;
         }
 
-        final List<ResultsetRowData> result = 
fillDatatableResultSetDataRows(sql);
+        final List<ResultsetRowData> result = 
fillDatatableResultSetDataRows(sql, columnHeaders);
 
         return new GenericResultsetData(columnHeaders, result);
     }
@@ -1331,7 +1331,7 @@ public class ReadWriteNonCoreDataServiceImpl implements 
ReadWriteNonCoreDataServ
             sql = sql + " and id = " + id;
         }
 
-        final List<ResultsetRowData> result = 
fillDatatableResultSetDataRows(sql);
+        final List<ResultsetRowData> result = 
fillDatatableResultSetDataRows(sql, columnHeaders);
 
         return new GenericResultsetData(columnHeaders, result);
     }
@@ -1339,7 +1339,7 @@ public class ReadWriteNonCoreDataServiceImpl implements 
ReadWriteNonCoreDataServ
     private CommandProcessingResult checkMainResourceExistsWithinScope(final 
String appTable, final Long appTableId) {
 
         final String sql = dataScopedSQL(appTable, appTableId);
-        LOG.info("data scoped sql: {}", sql);
+        LOG.debug("data scoped sql: {}", sql);
         final SqlRowSet rs = this.jdbcTemplate.queryForRowSet(sql);
 
         if (!rs.next()) {
@@ -1471,22 +1471,30 @@ public class ReadWriteNonCoreDataServiceImpl implements 
ReadWriteNonCoreDataServ
         return appTable;
     }
 
-    private List<ResultsetRowData> fillDatatableResultSetDataRows(final String 
sql) {
+    private List<ResultsetRowData> fillDatatableResultSetDataRows(final String 
sql, final List<ResultsetColumnHeaderData> columnHeaders) {
         final List<ResultsetRowData> resultsetDataRows = new ArrayList<>();
+        final GenericResultsetData genericResultsetData = new 
GenericResultsetData(columnHeaders, null);
 
         final SqlRowSet rowSet = jdbcTemplate.queryForRowSet(sql); // NOSONAR
         final SqlRowSetMetaData rsmd = rowSet.getMetaData();
 
         while (rowSet.next()) {
-            final List<String> columnValues = new ArrayList<>();
+            final List<Object> columnValues = new ArrayList<>();
+
             for (int i = 0; i < rsmd.getColumnCount(); i++) {
                 final String columnName = rsmd.getColumnName(i + 1);
-                final String columnValue = rowSet.getString(columnName);
-                columnValues.add(columnValue);
+                final String colType = 
genericResultsetData.getColTypeOfColumnNamed(columnName);
+                if ("DECIMAL".equalsIgnoreCase(colType)) {
+                    columnValues.add(rowSet.getBigDecimal(columnName));
+                } else if ("DATE".equalsIgnoreCase(colType) || ("TIMESTAMP 
WITHOUT TIME ZONE".equalsIgnoreCase(colType) // PostgreSQL
+                        || "DATETIME".equalsIgnoreCase(colType) || 
"TIMESTAMP".equalsIgnoreCase(colType))) {
+                    columnValues.add(rowSet.getObject(columnName));
+                } else {
+                    columnValues.add(rowSet.getString(columnName));
+                }
             }
 
-            final ResultsetRowData resultsetDataRow = 
ResultsetRowData.create(columnValues);
-            resultsetDataRows.add(resultsetDataRow);
+            resultsetDataRows.add(ResultsetRowData.create(columnValues));
         }
 
         return resultsetDataRows;
@@ -1696,13 +1704,13 @@ public class ReadWriteNonCoreDataServiceImpl implements 
ReadWriteNonCoreDataServ
 
     private boolean columnChanged(final String key, final String keyValue, 
final String colType, final GenericResultsetData grs) {
 
-        final List<String> columnValues = grs.getData().get(0).getRow();
+        final List<Object> columnValues = grs.getData().get(0).getRow();
 
         String columnValue = null;
         for (int i = 0; i < grs.getColumnHeaders().size(); i++) {
 
             if (key.equals(grs.getColumnHeaders().get(i).getColumnName())) {
-                columnValue = columnValues.get(i);
+                columnValue = (String) columnValues.get(i);
 
                 if (notTheSame(columnValue, keyValue, colType)) {
                     return true;
diff --git 
a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0019_refactor_loan_transaction.xml
 
b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0019_refactor_loan_transaction.xml
index bea15f721..373a15845 100644
--- 
a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0019_refactor_loan_transaction.xml
+++ 
b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0019_refactor_loan_transaction.xml
@@ -22,8 +22,8 @@
 <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">
-        <validCheckSum>8:4500ffb68c695d72caba498deff75643</validCheckSum>
+    <changeSet author="fineract" id="1" onValidationFail="MARK_RAN">
+        <validCheckSum>8:177f2e2cbac12752ede2182bbbfde6ae</validCheckSum>
         <addColumn tableName="m_loan_transaction">
             <column name="createdby_id" type="BIGINT" 
valueComputed="appuser_id"/>
             <column name="lastmodifiedby_id" type="BIGINT"/>

Reply via email to