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 8f7d54879..eb857450e 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 @@ -1659,7 +1659,7 @@ public class ReadWriteNonCoreDataServiceImpl implements ReadWriteNonCoreDataServ } pValue = String.valueOf(changedColumns.get(key)); - if (StringUtils.isEmpty(pValue)) { + if (StringUtils.isEmpty(pValue) || "null".equalsIgnoreCase(pValue)) { pValueWrite = "null"; } else { if ("bit".equalsIgnoreCase(pColumnHeader.getColumnType())) { diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DatatableIntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DatatableIntegrationTest.java index e3263b0bd..6299fbb7e 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/DatatableIntegrationTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/DatatableIntegrationTest.java @@ -22,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import io.restassured.builder.RequestSpecBuilder; import io.restassured.builder.ResponseSpecBuilder; import io.restassured.http.ContentType; @@ -256,7 +257,7 @@ public class DatatableIntegrationTest { @Test public void validateReadDatatableMultirow() { - // Fetch / Create tst code + // Fetch / Create TST code HashMap codeResponse = CodeHelper.getCodeByName(this.requestSpec, this.responseSpec, "TST_TST_TST"); Integer createdCodeId = (Integer) codeResponse.get("id"); @@ -284,13 +285,13 @@ public class DatatableIntegrationTest { columnMap.put("entitySubType", ""); columnMap.put("multiRow", true); DatatableHelper.addDatatableColumns(datatableColumnsList, "itsABoolean", "Boolean", false, null, null); - DatatableHelper.addDatatableColumns(datatableColumnsList, "itsADate", "Date", true, null, null); - DatatableHelper.addDatatableColumns(datatableColumnsList, "itsADatetime", "Datetime", true, null, null); - DatatableHelper.addDatatableColumns(datatableColumnsList, "itsADecimal", "Decimal", true, null, null); + DatatableHelper.addDatatableColumns(datatableColumnsList, "itsADate", "Date", false, null, null); + DatatableHelper.addDatatableColumns(datatableColumnsList, "itsADatetime", "Datetime", false, null, null); + DatatableHelper.addDatatableColumns(datatableColumnsList, "itsADecimal", "Decimal", false, null, null); DatatableHelper.addDatatableColumns(datatableColumnsList, "itsADropdown", "Dropdown", false, null, "TST_TST_TST"); - DatatableHelper.addDatatableColumns(datatableColumnsList, "itsANumber", "Number", true, null, null); - DatatableHelper.addDatatableColumns(datatableColumnsList, "itsAString", "String", true, 10, null); - DatatableHelper.addDatatableColumns(datatableColumnsList, "itsAText", "Text", true, null, null); + DatatableHelper.addDatatableColumns(datatableColumnsList, "itsANumber", "Number", false, null, null); + DatatableHelper.addDatatableColumns(datatableColumnsList, "itsAString", "String", false, 10, null); + DatatableHelper.addDatatableColumns(datatableColumnsList, "itsAText", "Text", false, null, null); columnMap.put("columns", datatableColumnsList); String datatabelRequestJsonString = new Gson().toJson(columnMap); LOG.info("map : {}", datatabelRequestJsonString); @@ -338,7 +339,7 @@ public class DatatableIntegrationTest { assertNotNull(datatableEntryResponseSecond.get("resourceId"), "ERROR IN CREATING THE ENTITY DATATABLE RECORD"); // Read the Datatable entry generated with genericResultSet in true (default) - final HashMap items = this.datatableHelper.readDatatableEntry(datatableName, loanID, genericResultSet, null, ""); + HashMap items = this.datatableHelper.readDatatableEntry(datatableName, loanID, genericResultSet, null, ""); assertNotNull(items); assertEquals(2, ((List) items.get("data")).size()); @@ -404,54 +405,75 @@ public class DatatableIntegrationTest { Boolean previousBoolean = (Boolean) datatableEntryMap.get("itsABoolean"); - datatableEntryMap.put("itsABoolean", !previousBoolean); - datatableEntryMap.put("itsADate", Utils.randomDateGenerator("yyyy-MM-dd")); - datatableEntryMap.put("itsADatetime", Utils.randomDateTimeGenerator("yyyy-MM-dd")); - datatableEntryMap.put("itsADecimal", Utils.randomDecimalGenerator(4, 3)); - datatableEntryMap.put("TST_TST_TST_cd_itsADropdown", createdCodeValueIdSecond); - datatableEntryMap.put("itsANumber", Utils.randomNumberGenerator(5)); - datatableEntryMap.put("itsAString", Utils.randomStringGenerator("", 8)); - datatableEntryMap.put("itsAText", Utils.randomStringGenerator("", 1000)); + datatableEntryMap.put("itsABoolean", null); + datatableEntryMap.put("itsADate", null); + datatableEntryMap.put("itsADatetime", null); + datatableEntryMap.put("itsADecimal", null); + datatableEntryMap.put("TST_TST_TST_cd_itsADropdown", null); + datatableEntryMap.put("itsANumber", null); + datatableEntryMap.put("itsAString", null); + datatableEntryMap.put("itsAText", null); datatableEntryMap.put("locale", "en"); datatableEntryMap.put("dateFormat", "yyyy-MM-dd"); - datatabelEntryRequestJsonString = new Gson().toJson(datatableEntryMap); + datatabelEntryRequestJsonString = new GsonBuilder().serializeNulls().create().toJson(datatableEntryMap); LOG.info("map : {}", datatabelEntryRequestJsonString); HashMap updatedDatatableEntryResponse = this.datatableHelper.updateDatatableEntry(datatableName, loanID, 1, false, datatabelEntryRequestJsonString); + this.datatableHelper.updateDatatableEntry(datatableName, loanID, 2, false, datatabelEntryRequestJsonString); assertEquals(loanID, updatedDatatableEntryResponse.get("loanId")); - assertEquals(datatableEntryMap.get("itsABoolean"), ((Map) updatedDatatableEntryResponse.get("changes")).get("itsABoolean")); - assertEquals(datatableEntryMap.get("itsADate"), - Utils.arrayDateToString((List) ((Map) updatedDatatableEntryResponse.get("changes")).get("itsADate"))); - assertEquals(datatableEntryMap.get("itsADecimal"), ((Map) updatedDatatableEntryResponse.get("changes")).get("itsADecimal")); - assertEquals(datatableEntryMap.get("itsADatetime"), - Utils.arrayDateTimeToString((List) ((Map) updatedDatatableEntryResponse.get("changes")).get("itsADatetime"))); + assertEquals(null, ((Map) updatedDatatableEntryResponse.get("changes")).get("itsABoolean")); + assertEquals(null, ((Map) updatedDatatableEntryResponse.get("changes")).get("itsADate")); + assertEquals(null, ((Map) updatedDatatableEntryResponse.get("changes")).get("itsADecimal")); + assertEquals(null, ((Map) updatedDatatableEntryResponse.get("changes")).get("itsADatetime")); + assertEquals(null, ((Map) updatedDatatableEntryResponse.get("changes")).get("TST_TST_TST_cd_itsADropdown")); + assertEquals(null, ((Map) updatedDatatableEntryResponse.get("changes")).get("itsANumber")); + assertEquals(null, ((Map) updatedDatatableEntryResponse.get("changes")).get("itsAString")); + assertEquals(null, ((Map) updatedDatatableEntryResponse.get("changes")).get("itsAText")); + + items = this.datatableHelper.readDatatableEntry(datatableName, loanID, genericResultSet, null, ""); + assertNotNull(items); + assertEquals(2, ((List) items.get("data")).size()); + + assertEquals("loan_id", ((Map) ((List) items.get("columnHeaders")).get(1)).get("columnName")); + assertEquals(loanID, ((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(1)); + assertEquals("itsABoolean", ((Map) ((List) items.get("columnHeaders")).get(2)).get("columnName")); + assertEquals(null, ((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(2)); + assertEquals("itsADate", ((Map) ((List) items.get("columnHeaders")).get(3)).get("columnName")); + assertEquals(null, ((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(3)); + assertEquals("itsADatetime", ((Map) ((List) items.get("columnHeaders")).get(4)).get("columnName")); + assertEquals(null, ((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(4)); + assertEquals("itsADecimal", ((Map) ((List) items.get("columnHeaders")).get(5)).get("columnName")); + assertEquals(null, ((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(5)); + assertEquals("TST_TST_TST_cd_itsADropdown", ((Map) ((List) items.get("columnHeaders")).get(6)).get("columnName")); + assertEquals(null, ((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(6)); + assertEquals("itsANumber", ((Map) ((List) items.get("columnHeaders")).get(7)).get("columnName")); + assertEquals(null, ((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(7)); + assertEquals("itsAString", ((Map) ((List) items.get("columnHeaders")).get(8)).get("columnName")); + assertEquals(null, ((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(8)); + assertEquals("itsAText", ((Map) ((List) items.get("columnHeaders")).get(9)).get("columnName")); + assertEquals(null, ((List) ((Map) ((List) items.get("data")).get(1)).get("row")).get(9)); + + // Read the Datatable entry generated with genericResultSet in false + datatableEntryResponseNoGenericResult = this.datatableHelper.readDatatableEntry(datatableName, loanID, !genericResultSet, + (Integer) datatableEntryResponseFirst.get("resourceId"), ""); + assertNotNull(datatableEntryResponseNoGenericResult, "ERROR IN GETTING THE DATE VALUE FROM DATATABLE RECORD"); + assertEquals(1, datatableEntryResponseNoGenericResult.size()); + + assertEquals(loanID, datatableEntryResponseNoGenericResult.get(0).get("loan_id")); + assertEquals(datatableEntryMap.get("itsABoolean"), datatableEntryResponseNoGenericResult.get(0).get("itsABoolean")); + assertEquals(datatableEntryMap.get("itsADate"), datatableEntryResponseNoGenericResult.get(0).get("itsADate")); + assertEquals(datatableEntryMap.get("itsADecimal"), datatableEntryResponseNoGenericResult.get(0).get("itsADecimal")); + assertEquals(datatableEntryMap.get("itsADatetime"), datatableEntryResponseNoGenericResult.get(0).get("itsADatetime")); assertEquals(datatableEntryMap.get("TST_TST_TST_cd_itsADropdown"), - ((Map) updatedDatatableEntryResponse.get("changes")).get("TST_TST_TST_cd_itsADropdown")); - assertEquals(datatableEntryMap.get("itsANumber"), ((Map) updatedDatatableEntryResponse.get("changes")).get("itsANumber")); - assertEquals(datatableEntryMap.get("itsAString"), ((Map) updatedDatatableEntryResponse.get("changes")).get("itsAString")); - assertEquals(datatableEntryMap.get("itsAText"), ((Map) updatedDatatableEntryResponse.get("changes")).get("itsAText")); - - updatedDatatableEntryResponse = this.datatableHelper.updateDatatableEntry(datatableName, loanID, 2, false, - datatabelEntryRequestJsonString); - - assertEquals(loanID, updatedDatatableEntryResponse.get("loanId")); - - assertEquals(datatableEntryMap.get("itsABoolean"), ((Map) updatedDatatableEntryResponse.get("changes")).get("itsABoolean")); - assertEquals(datatableEntryMap.get("itsADate"), - Utils.arrayDateToString((List) ((Map) updatedDatatableEntryResponse.get("changes")).get("itsADate"))); - assertEquals(datatableEntryMap.get("itsADecimal"), ((Map) updatedDatatableEntryResponse.get("changes")).get("itsADecimal")); - assertEquals(datatableEntryMap.get("itsADatetime"), - Utils.arrayDateTimeToString((List) ((Map) updatedDatatableEntryResponse.get("changes")).get("itsADatetime"))); - assertEquals(datatableEntryMap.get("TST_TST_TST_cd_itsADropdown"), - ((Map) updatedDatatableEntryResponse.get("changes")).get("TST_TST_TST_cd_itsADropdown")); - assertEquals(datatableEntryMap.get("itsANumber"), ((Map) updatedDatatableEntryResponse.get("changes")).get("itsANumber")); - assertEquals(datatableEntryMap.get("itsAString"), ((Map) updatedDatatableEntryResponse.get("changes")).get("itsAString")); - assertEquals(datatableEntryMap.get("itsAText"), ((Map) updatedDatatableEntryResponse.get("changes")).get("itsAText")); + datatableEntryResponseNoGenericResult.get(0).get("TST_TST_TST_cd_itsADropdown")); + assertEquals(datatableEntryMap.get("itsANumber"), datatableEntryResponseNoGenericResult.get(0).get("itsANumber")); + assertEquals(datatableEntryMap.get("itsAString"), datatableEntryResponseNoGenericResult.get(0).get("itsAString")); + assertEquals(datatableEntryMap.get("itsAText"), datatableEntryResponseNoGenericResult.get(0).get("itsAText")); // deleting datatable entries Integer appTableId = this.datatableHelper.deleteDatatableEntries(datatableName, loanID, "loanId");