You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by na...@apache.org on 2017/12/11 10:29:24 UTC

[1/6] fineract git commit: ReportRunFrequncy parameter was added

Repository: fineract
Updated Branches:
  refs/heads/develop 504f679c8 -> bf894732d


ReportRunFrequncy parameter was added


Project: http://git-wip-us.apache.org/repos/asf/fineract/repo
Commit: http://git-wip-us.apache.org/repos/asf/fineract/commit/5cfea884
Tree: http://git-wip-us.apache.org/repos/asf/fineract/tree/5cfea884
Diff: http://git-wip-us.apache.org/repos/asf/fineract/diff/5cfea884

Branch: refs/heads/develop
Commit: 5cfea884cee0e3545d3090e8f6c401aff82b54ae
Parents: d6accae
Author: Konstantin Golub <ke...@runbox.com>
Authored: Wed Oct 4 17:22:26 2017 -0300
Committer: Konstantin Golub <ke...@runbox.com>
Committed: Wed Oct 4 17:22:26 2017 -0300

----------------------------------------------------------------------
 .../adhocquery/api/AdHocJsonInputParams.java    |  5 ++-
 .../fineract/adhocquery/data/AdHocData.java     | 47 ++++++++++++++------
 .../fineract/adhocquery/domain/AdHoc.java       | 36 ++++++++++++---
 .../adhocquery/domain/ReportRunFrequency.java   | 43 ++++++++++++++++++
 .../adhocquery/service/AdHocDataValidator.java  | 26 ++++++++++-
 .../service/AdHocReadPlatformServiceImpl.java   |  9 ++--
 .../core_db/V336__report-run-frequency.sql      | 22 +++++++++
 7 files changed, 164 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/fineract/blob/5cfea884/fineract-provider/src/main/java/org/apache/fineract/adhocquery/api/AdHocJsonInputParams.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/api/AdHocJsonInputParams.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/api/AdHocJsonInputParams.java
index 0cb3384..e8c1420 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/api/AdHocJsonInputParams.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/api/AdHocJsonInputParams.java
@@ -25,7 +25,10 @@ import java.util.Set;
  * Enum of all parameters passed in while creating/updating a AdHocQuery 
  ***/
 public enum AdHocJsonInputParams {
-    ID("id"), NAME("name"),QUERY("query"),TABLENAME("tableName"),TABLEFIELD("tableFields"), ISACTIVE("isActive"),EMAIL("email");
+    ID("id"), NAME("name"),QUERY("query"),TABLENAME("tableName"),TABLEFIELD("tableFields"), ISACTIVE("isActive"),
+    REPORT_RUN_FREQUENCY("reportRunFrequency"),
+    REPORT_RUN_EVERY("reportRunEvery"),
+    EMAIL("email");
 
     private final String value;
 

http://git-wip-us.apache.org/repos/asf/fineract/blob/5cfea884/fineract-provider/src/main/java/org/apache/fineract/adhocquery/data/AdHocData.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/data/AdHocData.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/data/AdHocData.java
index f0fd7a8..bd5421d 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/data/AdHocData.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/data/AdHocData.java
@@ -18,13 +18,13 @@
  */
 package org.apache.fineract.adhocquery.data;
 
-import java.util.Collection;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 
-import org.apache.fineract.organisation.office.data.OfficeData;
-import org.apache.fineract.useradministration.data.AppUserData;
-import org.apache.fineract.useradministration.data.RoleData;
+import org.apache.fineract.adhocquery.domain.ReportRunFrequency;
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
 import org.joda.time.DateTime;
-import org.joda.time.LocalDate;
 
 /**
  * Immutable data object represent note or case information AdHocData
@@ -32,8 +32,8 @@ import org.joda.time.LocalDate;
  */
 public class AdHocData {
 
-	
-    
+
+
 	@SuppressWarnings("unused")
     private final Long id;
     @SuppressWarnings("unused")
@@ -59,13 +59,16 @@ public class AdHocData {
 	@SuppressWarnings("unused")
 	private final String createdBy;
 	
-    
-	
+    private final List<EnumOptionData> reportRunFrequencies;
+
+    private final Long reportRunFrequency;
 
-    public AdHocData(final Long id, final String name,final String query, final String tableName,final String tableFields, 
-    		final boolean isActive, final DateTime createdOn, final Long createdById,final Long updatedById,
-    		final DateTime updatedOn,final String createdBy,final String email
-            ) {
+    private final Long reportRunEvery;
+
+    public AdHocData(final Long id, final String name, final String query, final String tableName, final String tableFields,
+                     final boolean isActive, final DateTime createdOn, final Long createdById, final Long updatedById,
+                     final DateTime updatedOn, final String createdBy, final String email,
+                     final List<EnumOptionData> reportRunFrequencies, final Long reportRunFrequency, final Long reportRunEvery) {
         this.id = id;
         this.name=name;
         this.query=query;
@@ -78,9 +81,16 @@ public class AdHocData {
         this.updatedOn=updatedOn;
         this.createdBy=createdBy;
         this.email=email;
+	    this.reportRunFrequencies = reportRunFrequencies;
+	    this.reportRunFrequency = reportRunFrequency;
+	    this.reportRunEvery = reportRunEvery;
     }
     public static AdHocData template() {
-        AdHocData adHocData = new AdHocData(null,null,null,null,null,false,null,null,null,null,null,null);
+	    List<EnumOptionData> reportRunFrequencies = Arrays.stream(ReportRunFrequency.values()).map(rrf -> new EnumOptionData(
+		    (long) rrf.getValue(), rrf.getCode(), rrf.getCode()
+	    )).collect(Collectors.toList());
+
+	    AdHocData adHocData = new AdHocData(null,null,null,null,null,false,null,null,null,null,null,null, reportRunFrequencies, null, null);
 		return adHocData;
     }
     public Long getId() {
@@ -119,4 +129,13 @@ public class AdHocData {
 	public String getCreatedBy() {
 		return this.createdBy;
 	}
+	public List<EnumOptionData> getReportRunFrequencies() {
+		return this.reportRunFrequencies;
+	}
+	public Long getReportRunFrequency() {
+		return this.reportRunFrequency;
+	}
+	public Long getReportRunEvery() {
+		return this.reportRunEvery;
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/fineract/blob/5cfea884/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/AdHoc.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/AdHoc.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/AdHoc.java
index be315ba..93fa73f 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/AdHoc.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/AdHoc.java
@@ -53,17 +53,24 @@ public class AdHoc extends AbstractAuditableCustom<AppUser, Long> {
    	
     @Column(name = "email", length = 500)
     private  String email;
-    
-   
+
+    @Column(name = "report_run_frequency_code")
+    private Long reportRunFrequency;
+
+    @Column(name = "report_run_every")
+    private Long reportRunEvery;
+
 	@Column(name = "IsActive", nullable = false)
     private boolean isActive = false;
    	
-    private AdHoc(final String name, final String query,final String tableName,final String tableFields ,final String email,final boolean isActive) {
+    private AdHoc(final String name, final String query,final String tableName,final String tableFields ,final String email, final Long reportRunFrequency, final Long reportRunEvery, final boolean isActive) {
         this.name = StringUtils.defaultIfEmpty(name, null);
         this.query=StringUtils.defaultIfEmpty(query,null);
         this.tableName=StringUtils.defaultIfEmpty(tableName,null);
         this.tableFields=StringUtils.defaultIfEmpty(tableFields,null);
         this.email=StringUtils.defaultIfEmpty(email,null);
+        this.reportRunFrequency = reportRunFrequency;
+        this.reportRunEvery = reportRunEvery;
         this.isActive = BooleanUtils.toBooleanDefaultIfNull(isActive, false);
        
     }
@@ -77,8 +84,10 @@ public class AdHoc extends AbstractAuditableCustom<AppUser, Long> {
         final String tableName = command.stringValueOfParameterNamed(AdHocJsonInputParams.TABLENAME.getValue());
         final String tableFields = command.stringValueOfParameterNamed(AdHocJsonInputParams.TABLEFIELD.getValue());
         final String email = command.stringValueOfParameterNamed(AdHocJsonInputParams.EMAIL.getValue());
+        final Long reportRunFrequency = command.longValueOfParameterNamed(AdHocJsonInputParams.REPORT_RUN_FREQUENCY.getValue());
+        final Long reportRunEvery = command.longValueOfParameterNamed(AdHocJsonInputParams.REPORT_RUN_EVERY.getValue());
         final boolean isActive = command.booleanPrimitiveValueOfParameterNamed(AdHocJsonInputParams.ISACTIVE.getValue());
-        return new AdHoc(name,query,tableName,tableFields ,email,isActive);
+        return new AdHoc(name,query,tableName,tableFields, email, reportRunFrequency, reportRunEvery, isActive);
     }
     
     public Map<String, Object> update(final JsonCommand command) {
@@ -116,6 +125,18 @@ public class AdHoc extends AbstractAuditableCustom<AppUser, Long> {
             actualChanges.put(email, newValue);
             this.email = newValue;
         }
+        final String reportRunFrequency = "reportRunFrequency";
+        if (command.isChangeInLongParameterNamed(reportRunFrequency, this.getReportRunFrequency())) {
+            final Long newValue = command.longValueOfParameterNamed(reportRunFrequency);
+            actualChanges.put(reportRunFrequency, newValue);
+            this.reportRunFrequency = newValue;
+        }
+        final String reportRunEvery = "reportRunEvery";
+        if (command.isChangeInLongParameterNamed(reportRunEvery, this.getReportRunEvery())) {
+            final Long newValue = command.longValueOfParameterNamed(reportRunEvery);
+            actualChanges.put(reportRunEvery, newValue);
+            this.reportRunEvery = newValue;
+        }
         final String paramisActive = "isActive";
         if (command.isChangeInBooleanParameterNamed(paramisActive, this.isActive)) {
         	final Boolean newValue = command.booleanObjectValueOfParameterNamed(paramisActive);
@@ -149,5 +170,10 @@ public class AdHoc extends AbstractAuditableCustom<AppUser, Long> {
     public void enableActive() {
     	this.isActive = false;
     }
-
+    public Long getReportRunFrequency() {
+        return this.reportRunFrequency;
+    }
+    public Long getReportRunEvery() {
+        return this.reportRunEvery;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/fineract/blob/5cfea884/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/ReportRunFrequency.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/ReportRunFrequency.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/ReportRunFrequency.java
new file mode 100644
index 0000000..78bd011
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/ReportRunFrequency.java
@@ -0,0 +1,43 @@
+/**
+ * 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.adhocquery.domain;
+
+public enum ReportRunFrequency {
+    DAILY(1, "reportRunFrequency.daily"),
+    WEEKLY(2, "reportRunFrequency.weekly"),
+    MONTHLY(3, "reportRunFrequency.monthly"),
+    YEARLY(4, "reportRunFrequency.yearly"),
+    CUSTOM(5, "reportRunFrequency.custom");
+
+    private final int value;
+    private final String code;
+
+    private ReportRunFrequency(final int value, final String code) {
+        this.value = value;
+        this.code = code;
+    }
+
+    public int getValue() {
+        return this.value;
+    }
+
+    public String getCode() {
+        return this.code;
+    }
+}

http://git-wip-us.apache.org/repos/asf/fineract/blob/5cfea884/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java
index 2cdd294..b96cc10 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java
@@ -27,6 +27,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.fineract.adhocquery.domain.ReportRunFrequency;
 import org.apache.fineract.infrastructure.core.data.ApiParameterError;
 import org.apache.fineract.infrastructure.core.data.DataValidatorBuilder;
 import org.apache.fineract.infrastructure.core.exception.InvalidJsonException;
@@ -44,7 +45,9 @@ public final class AdHocDataValidator {
     /**
      * The parameters supported for this command.
      */
-    private final Set<String> supportedParameters = new HashSet<>(Arrays.asList("name","query","tableName","tableFields","email","isActive"));
+    private final Set<String> supportedParameters = new HashSet<>(Arrays.asList(
+        "name","query","tableName","tableFields","email","isActive", "reportRunFrequency", "reportRunEvery"
+    ));
 
     private final FromJsonHelper fromApiJsonHelper;
 
@@ -78,6 +81,18 @@ public final class AdHocDataValidator {
 
         final String email = this.fromApiJsonHelper.extractStringNamed("email", element);
         baseDataValidator.reset().parameter("email").value(email).notBlank().notExceedingLengthOf(500);
+
+        final Long reportRunFrequencyCode = this.fromApiJsonHelper.extractLongNamed("reportRunFrequency", element);
+        if (reportRunFrequencyCode != null) {
+            baseDataValidator.reset().parameter("reportRunFrequency").value(reportRunFrequencyCode)
+                .inMinMaxRange(ReportRunFrequency.DAILY.getValue(), ReportRunFrequency.CUSTOM.getValue());
+        }
+
+        final Long reportRunEvery = this.fromApiJsonHelper.extractLongNamed("reportRunEvery", element);
+        if (reportRunEvery != null) {
+            baseDataValidator.reset().parameter("reportRunEvery").value(reportRunFrequencyCode).integerGreaterThanZero();
+        }
+
         throwExceptionIfValidationWarningsExist(dataValidationErrors);
     }
 
@@ -113,6 +128,15 @@ public final class AdHocDataValidator {
             final String email = this.fromApiJsonHelper.extractStringNamed("email", element);
             baseDataValidator.reset().parameter("email").value(email).notBlank().notExceedingLengthOf(500);
         }
+        if (this.fromApiJsonHelper.parameterExists("reportRunFrequency", element)) {
+            final Long reportRunFrequencyCode = this.fromApiJsonHelper.extractLongNamed("reportRunFrequency", element);
+            baseDataValidator.reset().parameter("reportRunFrequency").value(reportRunFrequencyCode)
+                .inMinMaxRange(ReportRunFrequency.DAILY.getValue(), ReportRunFrequency.CUSTOM.getValue());
+        }
+        if (this.fromApiJsonHelper.parameterExists("reportRunEvery", element)) {
+            final Long reportRunEvery = this.fromApiJsonHelper.extractLongNamed("reportRunEvery", element);
+            baseDataValidator.reset().parameter("reportRunEvery").value(reportRunEvery).integerGreaterThanZero();
+        }
         /*if (this.fromApiJsonHelper.parameterExists("isActive", element)) {
             final Integer isActive = this.fromApiJsonHelper.extractIntegerNamed("isActive", element, Locale.getDefault());
             baseDataValidator.reset().parameter("isActive").value(isActive).notNull().inMinMaxRange(1, 2);

http://git-wip-us.apache.org/repos/asf/fineract/blob/5cfea884/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocReadPlatformServiceImpl.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocReadPlatformServiceImpl.java
index eb1f633..2ea6cfd 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocReadPlatformServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocReadPlatformServiceImpl.java
@@ -88,13 +88,16 @@ public class AdHocReadPlatformServiceImpl implements AdHocReadPlatformService {
             final DateTime updatedOn=JdbcSupport.getDateTime(rs, "updatedOn");
             final String createdByUsername=rs.getString("createdBy");
             final String email=rs.getString("email");
-          
-            return new AdHocData(id,name,query, tableName,tableFields,isActive,createdDate,createdById,updatedById,updatedOn,createdByUsername,email);
+            final Long reportRunFrequency=JdbcSupport.getLong(rs, "report_run_frequency_code");
+            final Long reportRunEvery=JdbcSupport.getLong(rs, "report_run_every");
+
+            return new AdHocData(id,name,query, tableName,tableFields,isActive,createdDate,createdById,updatedById,updatedOn,createdByUsername,email, AdHocData.template().getReportRunFrequencies(), reportRunFrequency, reportRunEvery);
         }
 
         public String schema() {
             return " r.id as id, r.name as name, r.query as query, r.table_name as tableName,r.table_fields as tableField ,r.IsActive as isActive ,r.email as email ,"
-            		+" r.created_date as createdDate, r.createdby_id as createdById,cb.username as createdBy,r.lastmodifiedby_id as updatedById ,r.lastmodified_date as updatedOn "
+                    + " r.report_run_frequency_code, r.report_run_every, "
+            		+ " r.created_date as createdDate, r.createdby_id as createdById,cb.username as createdBy,r.lastmodifiedby_id as updatedById ,r.lastmodified_date as updatedOn "
                     + " from m_adhoc r left join m_appuser cb on cb.id=r.createdby_id left join m_appuser mb on mb.id=r.lastmodifiedby_id";
             		        
         }

http://git-wip-us.apache.org/repos/asf/fineract/blob/5cfea884/fineract-provider/src/main/resources/sql/migrations/core_db/V336__report-run-frequency.sql
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V336__report-run-frequency.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V336__report-run-frequency.sql
new file mode 100644
index 0000000..3f593c4
--- /dev/null
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V336__report-run-frequency.sql
@@ -0,0 +1,22 @@
+--
+-- 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.
+--
+
+ALTER TABLE m_adhoc ADD COLUMN report_run_frequency_code INT NULL DEFAULT NULL;
+ALTER TABLE m_adhoc ADD COLUMN report_run_every INT NULL DEFAULT NULL;
+ALTER TABLE m_adhoc ADD COLUMN last_run TIMESTAMP NULL DEFAULT NULL;
\ No newline at end of file


[6/6] fineract git commit: Renaming sql migration scripts

Posted by na...@apache.org.
Renaming sql migration scripts


Project: http://git-wip-us.apache.org/repos/asf/fineract/repo
Commit: http://git-wip-us.apache.org/repos/asf/fineract/commit/bf894732
Tree: http://git-wip-us.apache.org/repos/asf/fineract/tree/bf894732
Diff: http://git-wip-us.apache.org/repos/asf/fineract/diff/bf894732

Branch: refs/heads/develop
Commit: bf894732da1646456e82ce274d937471deb8a790
Parents: 4e97776
Author: Nazeer Hussain Shaik <na...@confluxtechnologies.com>
Authored: Mon Dec 11 15:56:37 2017 +0530
Committer: Nazeer Hussain Shaik <na...@confluxtechnologies.com>
Committed: Mon Dec 11 15:56:37 2017 +0530

----------------------------------------------------------------------
 .../core_db/V336__report-run-frequency.sql      | 22 --------------------
 .../core_db/V337__nullable-adhoc-email.sql      | 20 ------------------
 .../core_db/V339__report-run-frequency.sql      | 22 ++++++++++++++++++++
 .../core_db/V340__nullable-adhoc-email.sql      | 20 ++++++++++++++++++
 4 files changed, 42 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/fineract/blob/bf894732/fineract-provider/src/main/resources/sql/migrations/core_db/V336__report-run-frequency.sql
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V336__report-run-frequency.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V336__report-run-frequency.sql
deleted file mode 100644
index 3f593c4..0000000
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V336__report-run-frequency.sql
+++ /dev/null
@@ -1,22 +0,0 @@
---
--- 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.
---
-
-ALTER TABLE m_adhoc ADD COLUMN report_run_frequency_code INT NULL DEFAULT NULL;
-ALTER TABLE m_adhoc ADD COLUMN report_run_every INT NULL DEFAULT NULL;
-ALTER TABLE m_adhoc ADD COLUMN last_run TIMESTAMP NULL DEFAULT NULL;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/fineract/blob/bf894732/fineract-provider/src/main/resources/sql/migrations/core_db/V337__nullable-adhoc-email.sql
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V337__nullable-adhoc-email.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V337__nullable-adhoc-email.sql
deleted file mode 100644
index 0f7296f..0000000
--- a/fineract-provider/src/main/resources/sql/migrations/core_db/V337__nullable-adhoc-email.sql
+++ /dev/null
@@ -1,20 +0,0 @@
---
--- 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.
---
-
-ALTER TABLE m_adhoc MODIFY `email` VARCHAR(500) NULL DEFAULT NULL;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/fineract/blob/bf894732/fineract-provider/src/main/resources/sql/migrations/core_db/V339__report-run-frequency.sql
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V339__report-run-frequency.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V339__report-run-frequency.sql
new file mode 100644
index 0000000..3f593c4
--- /dev/null
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V339__report-run-frequency.sql
@@ -0,0 +1,22 @@
+--
+-- 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.
+--
+
+ALTER TABLE m_adhoc ADD COLUMN report_run_frequency_code INT NULL DEFAULT NULL;
+ALTER TABLE m_adhoc ADD COLUMN report_run_every INT NULL DEFAULT NULL;
+ALTER TABLE m_adhoc ADD COLUMN last_run TIMESTAMP NULL DEFAULT NULL;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/fineract/blob/bf894732/fineract-provider/src/main/resources/sql/migrations/core_db/V340__nullable-adhoc-email.sql
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V340__nullable-adhoc-email.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V340__nullable-adhoc-email.sql
new file mode 100644
index 0000000..0f7296f
--- /dev/null
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V340__nullable-adhoc-email.sql
@@ -0,0 +1,20 @@
+--
+-- 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.
+--
+
+ALTER TABLE m_adhoc MODIFY `email` VARCHAR(500) NULL DEFAULT NULL;
\ No newline at end of file


[4/6] fineract git commit: SQL injection validator fix

Posted by na...@apache.org.
SQL injection validator fix


Project: http://git-wip-us.apache.org/repos/asf/fineract/repo
Commit: http://git-wip-us.apache.org/repos/asf/fineract/commit/749ec055
Tree: http://git-wip-us.apache.org/repos/asf/fineract/tree/749ec055
Diff: http://git-wip-us.apache.org/repos/asf/fineract/diff/749ec055

Branch: refs/heads/develop
Commit: 749ec055e9755f75d93fad8bb2ab4b7d6966aa48
Parents: 87e0c59
Author: Konstantin Golub <ke...@runbox.com>
Authored: Tue Oct 17 08:23:18 2017 -0300
Committer: Konstantin Golub <ke...@runbox.com>
Committed: Tue Oct 17 08:23:18 2017 -0300

----------------------------------------------------------------------
 .../infrastructure/security/utils/SQLInjectionValidator.java   | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/fineract/blob/749ec055/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/utils/SQLInjectionValidator.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/utils/SQLInjectionValidator.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/utils/SQLInjectionValidator.java
index 60c2070..d03b2f4 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/utils/SQLInjectionValidator.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/utils/SQLInjectionValidator.java
@@ -30,7 +30,7 @@ public class SQLInjectionValidator {
 
 	private final static String[] COMMENTS = { "--", "({", "/*", "#" };
 
-	private final static String SQL_PATTERN = "[a-zA-Z_=,\\-'!><.?\"`% ()0-9]*";
+	private final static String SQL_PATTERN = "[a-zA-Z_=,\\-'!><.?\"`% ()0-9*\n\r]*";
 
 	public final static void validateSQLInput(final String sqlSearch) {
 		String lowerCaseSQL = sqlSearch.toLowerCase();
@@ -115,9 +115,9 @@ public class SQLInjectionValidator {
 		}
 	}
 	public final static void validateAdhocQuery(final String sqlSearch) {
-		String lowerCaseSQL = sqlSearch.toLowerCase();
+		String lowerCaseSQL = sqlSearch.toLowerCase().trim();
 		for (String ddl : DDL_COMMANDS) {
-			if (lowerCaseSQL.contains(ddl)) {
+			if (lowerCaseSQL.startsWith(ddl)) {
 				throw new SQLInjectionException();
 			}
 		}


[2/6] fineract git commit: Optional e-mauk field of the AdHoc page

Posted by na...@apache.org.
Optional e-mauk field of the AdHoc page


Project: http://git-wip-us.apache.org/repos/asf/fineract/repo
Commit: http://git-wip-us.apache.org/repos/asf/fineract/commit/f47e0fb2
Tree: http://git-wip-us.apache.org/repos/asf/fineract/tree/f47e0fb2
Diff: http://git-wip-us.apache.org/repos/asf/fineract/diff/f47e0fb2

Branch: refs/heads/develop
Commit: f47e0fb2fbc1badec862ba55f0d636bda46ddef5
Parents: 5cfea88
Author: Konstantin Golub <ke...@runbox.com>
Authored: Wed Oct 4 20:59:27 2017 -0300
Committer: Konstantin Golub <ke...@runbox.com>
Committed: Wed Oct 4 20:59:27 2017 -0300

----------------------------------------------------------------------
 .../adhocquery/service/AdHocDataValidator.java  |  4 ++--
 .../core_db/V337__nullable-adhoc-email.sql      | 20 ++++++++++++++++++++
 2 files changed, 22 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/fineract/blob/f47e0fb2/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java
index b96cc10..bb4434b 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java
@@ -80,7 +80,7 @@ public final class AdHocDataValidator {
         baseDataValidator.reset().parameter("tableFields").value(tableFields).notBlank().notExceedingLengthOf(1000);
 
         final String email = this.fromApiJsonHelper.extractStringNamed("email", element);
-        baseDataValidator.reset().parameter("email").value(email).notBlank().notExceedingLengthOf(500);
+        baseDataValidator.reset().parameter("email").value(email).ignoreIfNull().notExceedingLengthOf(500);
 
         final Long reportRunFrequencyCode = this.fromApiJsonHelper.extractLongNamed("reportRunFrequency", element);
         if (reportRunFrequencyCode != null) {
@@ -126,7 +126,7 @@ public final class AdHocDataValidator {
         }
         if (this.fromApiJsonHelper.parameterExists("email", element)) {
             final String email = this.fromApiJsonHelper.extractStringNamed("email", element);
-            baseDataValidator.reset().parameter("email").value(email).notBlank().notExceedingLengthOf(500);
+            baseDataValidator.reset().parameter("email").value(email).ignoreIfNull().notExceedingLengthOf(500);
         }
         if (this.fromApiJsonHelper.parameterExists("reportRunFrequency", element)) {
             final Long reportRunFrequencyCode = this.fromApiJsonHelper.extractLongNamed("reportRunFrequency", element);

http://git-wip-us.apache.org/repos/asf/fineract/blob/f47e0fb2/fineract-provider/src/main/resources/sql/migrations/core_db/V337__nullable-adhoc-email.sql
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/resources/sql/migrations/core_db/V337__nullable-adhoc-email.sql b/fineract-provider/src/main/resources/sql/migrations/core_db/V337__nullable-adhoc-email.sql
new file mode 100644
index 0000000..0f7296f
--- /dev/null
+++ b/fineract-provider/src/main/resources/sql/migrations/core_db/V337__nullable-adhoc-email.sql
@@ -0,0 +1,20 @@
+--
+-- 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.
+--
+
+ALTER TABLE m_adhoc MODIFY `email` VARCHAR(500) NULL DEFAULT NULL;
\ No newline at end of file


[3/6] fineract git commit: Conditional ad hoc job service

Posted by na...@apache.org.
Conditional ad hoc job service


Project: http://git-wip-us.apache.org/repos/asf/fineract/repo
Commit: http://git-wip-us.apache.org/repos/asf/fineract/commit/87e0c59f
Tree: http://git-wip-us.apache.org/repos/asf/fineract/tree/87e0c59f
Diff: http://git-wip-us.apache.org/repos/asf/fineract/diff/87e0c59f

Branch: refs/heads/develop
Commit: 87e0c59fb336e96ec7221749496b2c70cfd5a080
Parents: f47e0fb
Author: Konstantin Golub <ke...@runbox.com>
Authored: Thu Oct 5 11:28:18 2017 -0300
Committer: Konstantin Golub <ke...@runbox.com>
Committed: Thu Oct 5 11:28:18 2017 -0300

----------------------------------------------------------------------
 .../adhocquery/api/AdHocJsonInputParams.java    |  2 +-
 .../fineract/adhocquery/data/AdHocData.java     | 19 ++++--
 .../fineract/adhocquery/domain/AdHoc.java       |  4 +-
 .../adhocquery/domain/ReportRunFrequency.java   | 18 ++++-
 .../adhocquery/service/AdHocDataValidator.java  |  4 +-
 .../service/AdHocReadPlatformServiceImpl.java   |  5 +-
 .../AdHocScheduledJobRunnerServiceImpl.java     | 72 ++++++++++++++++----
 7 files changed, 96 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/fineract/blob/87e0c59f/fineract-provider/src/main/java/org/apache/fineract/adhocquery/api/AdHocJsonInputParams.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/api/AdHocJsonInputParams.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/api/AdHocJsonInputParams.java
index e8c1420..a797a0f 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/api/AdHocJsonInputParams.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/api/AdHocJsonInputParams.java
@@ -25,7 +25,7 @@ import java.util.Set;
  * Enum of all parameters passed in while creating/updating a AdHocQuery 
  ***/
 public enum AdHocJsonInputParams {
-    ID("id"), NAME("name"),QUERY("query"),TABLENAME("tableName"),TABLEFIELD("tableFields"), ISACTIVE("isActive"),
+    ID("id"), NAME("name"),QUERY("query"),TABLENAME("tableName"), TABLEFIELDS("tableFields"), ISACTIVE("isActive"),
     REPORT_RUN_FREQUENCY("reportRunFrequency"),
     REPORT_RUN_EVERY("reportRunEvery"),
     EMAIL("email");

http://git-wip-us.apache.org/repos/asf/fineract/blob/87e0c59f/fineract-provider/src/main/java/org/apache/fineract/adhocquery/data/AdHocData.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/data/AdHocData.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/data/AdHocData.java
index bd5421d..81cfc91 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/data/AdHocData.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/data/AdHocData.java
@@ -18,14 +18,14 @@
  */
 package org.apache.fineract.adhocquery.data;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
 import org.apache.fineract.adhocquery.domain.ReportRunFrequency;
 import org.apache.fineract.infrastructure.core.data.EnumOptionData;
 import org.joda.time.DateTime;
 
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * Immutable data object represent note or case information AdHocData
  * 
@@ -65,10 +65,13 @@ public class AdHocData {
 
     private final Long reportRunEvery;
 
+    private final DateTime lastRun;
+
     public AdHocData(final Long id, final String name, final String query, final String tableName, final String tableFields,
                      final boolean isActive, final DateTime createdOn, final Long createdById, final Long updatedById,
                      final DateTime updatedOn, final String createdBy, final String email,
-                     final List<EnumOptionData> reportRunFrequencies, final Long reportRunFrequency, final Long reportRunEvery) {
+                     final List<EnumOptionData> reportRunFrequencies, final Long reportRunFrequency, final Long reportRunEvery,
+                     final DateTime lastRun) {
         this.id = id;
         this.name=name;
         this.query=query;
@@ -84,13 +87,14 @@ public class AdHocData {
 	    this.reportRunFrequencies = reportRunFrequencies;
 	    this.reportRunFrequency = reportRunFrequency;
 	    this.reportRunEvery = reportRunEvery;
+	    this.lastRun = lastRun;
     }
     public static AdHocData template() {
 	    List<EnumOptionData> reportRunFrequencies = Arrays.stream(ReportRunFrequency.values()).map(rrf -> new EnumOptionData(
 		    (long) rrf.getValue(), rrf.getCode(), rrf.getCode()
 	    )).collect(Collectors.toList());
 
-	    AdHocData adHocData = new AdHocData(null,null,null,null,null,false,null,null,null,null,null,null, reportRunFrequencies, null, null);
+	    AdHocData adHocData = new AdHocData(null,null,null,null,null,false,null,null,null,null,null,null, reportRunFrequencies, null, null, null);
 		return adHocData;
     }
     public Long getId() {
@@ -138,4 +142,7 @@ public class AdHocData {
 	public Long getReportRunEvery() {
 		return this.reportRunEvery;
 	}
+	public DateTime getLastRun() {
+		return this.lastRun;
+	}
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/fineract/blob/87e0c59f/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/AdHoc.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/AdHoc.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/AdHoc.java
index 93fa73f..54f98f3 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/AdHoc.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/AdHoc.java
@@ -82,7 +82,7 @@ public class AdHoc extends AbstractAuditableCustom<AppUser, Long> {
         SQLInjectionValidator.validateAdhocQuery(commandQuery);
         final String query = commandQuery;
         final String tableName = command.stringValueOfParameterNamed(AdHocJsonInputParams.TABLENAME.getValue());
-        final String tableFields = command.stringValueOfParameterNamed(AdHocJsonInputParams.TABLEFIELD.getValue());
+        final String tableFields = command.stringValueOfParameterNamed(AdHocJsonInputParams.TABLEFIELDS.getValue());
         final String email = command.stringValueOfParameterNamed(AdHocJsonInputParams.EMAIL.getValue());
         final Long reportRunFrequency = command.longValueOfParameterNamed(AdHocJsonInputParams.REPORT_RUN_FREQUENCY.getValue());
         final Long reportRunEvery = command.longValueOfParameterNamed(AdHocJsonInputParams.REPORT_RUN_EVERY.getValue());
@@ -113,7 +113,7 @@ public class AdHoc extends AbstractAuditableCustom<AppUser, Long> {
             actualChanges.put(tableName, newValue);
             this.tableName = newValue;
         }
-        final String tableField = "tableField";
+        final String tableField = "tableFields";
         if (command.isChangeInStringParameterNamed(tableField, this.tableFields)) {
             final String newValue = command.stringValueOfParameterNamed(tableField);
             actualChanges.put(tableField, newValue);

http://git-wip-us.apache.org/repos/asf/fineract/blob/87e0c59f/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/ReportRunFrequency.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/ReportRunFrequency.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/ReportRunFrequency.java
index 78bd011..fc02d4b 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/ReportRunFrequency.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/domain/ReportRunFrequency.java
@@ -18,6 +18,10 @@
  */
 package org.apache.fineract.adhocquery.domain;
 
+import java.util.Arrays;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 public enum ReportRunFrequency {
     DAILY(1, "reportRunFrequency.daily"),
     WEEKLY(2, "reportRunFrequency.weekly"),
@@ -25,19 +29,27 @@ public enum ReportRunFrequency {
     YEARLY(4, "reportRunFrequency.yearly"),
     CUSTOM(5, "reportRunFrequency.custom");
 
-    private final int value;
+    private static final Map<Long, ReportRunFrequency> MAP = Arrays.stream(ReportRunFrequency.values()).collect(Collectors.toMap(
+        ReportRunFrequency::getValue, e -> e
+    ));
+
+    private final long value;
     private final String code;
 
-    private ReportRunFrequency(final int value, final String code) {
+    private ReportRunFrequency(final long value, final String code) {
         this.value = value;
         this.code = code;
     }
 
-    public int getValue() {
+    public long getValue() {
         return this.value;
     }
 
     public String getCode() {
         return this.code;
     }
+
+    public static ReportRunFrequency fromId(final long id) {
+        return ReportRunFrequency.MAP.get(id);
+    }
 }

http://git-wip-us.apache.org/repos/asf/fineract/blob/87e0c59f/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java
index bb4434b..9cb13e8 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocDataValidator.java
@@ -85,7 +85,7 @@ public final class AdHocDataValidator {
         final Long reportRunFrequencyCode = this.fromApiJsonHelper.extractLongNamed("reportRunFrequency", element);
         if (reportRunFrequencyCode != null) {
             baseDataValidator.reset().parameter("reportRunFrequency").value(reportRunFrequencyCode)
-                .inMinMaxRange(ReportRunFrequency.DAILY.getValue(), ReportRunFrequency.CUSTOM.getValue());
+                .inMinMaxRange((int) ReportRunFrequency.DAILY.getValue(), (int) ReportRunFrequency.CUSTOM.getValue());
         }
 
         final Long reportRunEvery = this.fromApiJsonHelper.extractLongNamed("reportRunEvery", element);
@@ -131,7 +131,7 @@ public final class AdHocDataValidator {
         if (this.fromApiJsonHelper.parameterExists("reportRunFrequency", element)) {
             final Long reportRunFrequencyCode = this.fromApiJsonHelper.extractLongNamed("reportRunFrequency", element);
             baseDataValidator.reset().parameter("reportRunFrequency").value(reportRunFrequencyCode)
-                .inMinMaxRange(ReportRunFrequency.DAILY.getValue(), ReportRunFrequency.CUSTOM.getValue());
+                .inMinMaxRange((int) ReportRunFrequency.DAILY.getValue(), (int) ReportRunFrequency.CUSTOM.getValue());
         }
         if (this.fromApiJsonHelper.parameterExists("reportRunEvery", element)) {
             final Long reportRunEvery = this.fromApiJsonHelper.extractLongNamed("reportRunEvery", element);

http://git-wip-us.apache.org/repos/asf/fineract/blob/87e0c59f/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocReadPlatformServiceImpl.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocReadPlatformServiceImpl.java
index 2ea6cfd..c5c7a0a 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocReadPlatformServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocReadPlatformServiceImpl.java
@@ -90,13 +90,14 @@ public class AdHocReadPlatformServiceImpl implements AdHocReadPlatformService {
             final String email=rs.getString("email");
             final Long reportRunFrequency=JdbcSupport.getLong(rs, "report_run_frequency_code");
             final Long reportRunEvery=JdbcSupport.getLong(rs, "report_run_every");
+            final DateTime lastRun = JdbcSupport.getDateTime(rs, "last_run");
 
-            return new AdHocData(id,name,query, tableName,tableFields,isActive,createdDate,createdById,updatedById,updatedOn,createdByUsername,email, AdHocData.template().getReportRunFrequencies(), reportRunFrequency, reportRunEvery);
+            return new AdHocData(id,name,query, tableName,tableFields,isActive,createdDate,createdById,updatedById,updatedOn,createdByUsername,email, AdHocData.template().getReportRunFrequencies(), reportRunFrequency, reportRunEvery, lastRun);
         }
 
         public String schema() {
             return " r.id as id, r.name as name, r.query as query, r.table_name as tableName,r.table_fields as tableField ,r.IsActive as isActive ,r.email as email ,"
-                    + " r.report_run_frequency_code, r.report_run_every, "
+                    + " r.report_run_frequency_code, r.report_run_every, r.last_run, "
             		+ " r.created_date as createdDate, r.createdby_id as createdById,cb.username as createdBy,r.lastmodifiedby_id as updatedById ,r.lastmodified_date as updatedOn "
                     + " from m_adhoc r left join m_appuser cb on cb.id=r.createdby_id left join m_appuser mb on mb.id=r.lastmodifiedby_id";
             		        

http://git-wip-us.apache.org/repos/asf/fineract/blob/87e0c59f/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocScheduledJobRunnerServiceImpl.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocScheduledJobRunnerServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocScheduledJobRunnerServiceImpl.java
index d10cddd..c92121c 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocScheduledJobRunnerServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/adhocquery/service/AdHocScheduledJobRunnerServiceImpl.java
@@ -18,13 +18,17 @@
  */
 package org.apache.fineract.adhocquery.service;
 
-import java.util.Collection;
-
 import org.apache.fineract.adhocquery.data.AdHocData;
+import org.apache.fineract.adhocquery.domain.ReportRunFrequency;
 import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
 import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
 import org.apache.fineract.infrastructure.jobs.annotation.CronTarget;
 import org.apache.fineract.infrastructure.jobs.service.JobName;
+import org.joda.time.DateTime;
+import org.joda.time.Days;
+import org.joda.time.LocalDate;
+import org.joda.time.Months;
+import org.joda.time.Years;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,6 +36,9 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Collection;
+import java.util.Date;
+
 @Service(value = "adHocScheduledJobRunnerService")
 public class AdHocScheduledJobRunnerServiceImpl implements AdHocScheduledJobRunnerService {
 
@@ -47,6 +54,7 @@ public class AdHocScheduledJobRunnerServiceImpl implements AdHocScheduledJobRunn
         this.adHocReadPlatformService = adHocReadPlatformService;
        
     }
+
     @Transactional
     @Override
     @CronTarget(jobName = JobName.GENERATE_ADHOCCLIENT_SCEHDULE)
@@ -54,16 +62,56 @@ public class AdHocScheduledJobRunnerServiceImpl implements AdHocScheduledJobRunn
     	final Collection<AdHocData> adhocs = this.adHocReadPlatformService.retrieveAllActiveAdHocQuery();
         if(adhocs.size()>0){
         	adhocs.forEach(adhoc->{
-            	//jdbcTemplate.execute("truncate table "+adhoc.getTableName());
-            	final StringBuilder insertSqlBuilder = new StringBuilder(900);
-                insertSqlBuilder
-                        .append("INSERT INTO ")
-                        .append(adhoc.getTableName()+"(")
-                		.append(adhoc.getTableFields()+") ")
-                		.append(adhoc.getQuery());
-                if (insertSqlBuilder.length() > 0) {
-                	final int result = this.jdbcTemplate.update(insertSqlBuilder.toString());
-                	logger.info(ThreadLocalContextUtil.getTenant().getName() + ": Results affected by inserted: " + result);
+        	    boolean run = true;
+                LocalDate next = null;
+        	    if (adhoc.getReportRunFrequency() != null) {
+                    if (adhoc.getLastRun() != null) {
+                        LocalDate start = adhoc.getLastRun().toLocalDate();
+                        LocalDate end = new DateTime().toLocalDate();
+                        switch (ReportRunFrequency.fromId(adhoc.getReportRunFrequency())) {
+                            case DAILY:
+                                next = start.plusDays(1);
+                                run = Days.daysBetween(start, end).getDays() >= 1;
+                                break;
+                            case WEEKLY:
+                                next = start.plusDays(7);
+                                run = Days.daysBetween(start, end).getDays() >= 7;
+                                break;
+                            case MONTHLY:
+                                next = start.plusMonths(1);
+                                run = Months.monthsBetween(start, end).getMonths() >= 1;
+                                break;
+                            case YEARLY:
+                                next = start.plusYears(1);
+                                run = Years.yearsBetween(start, end).getYears() >= 1;
+                                break;
+                            case CUSTOM:
+                                next = start.plusDays((int) (long) adhoc.getReportRunEvery());
+                                run = Days.daysBetween(start, end).getDays() >= adhoc.getReportRunEvery();
+                                break;
+                            default:
+                                throw new IllegalStateException();
+                        }
+
+                    }
+                }
+
+                if (run) {
+                    //jdbcTemplate.execute("truncate table "+adhoc.getTableName());
+                    final StringBuilder insertSqlBuilder = new StringBuilder(900);
+                    insertSqlBuilder
+                            .append("INSERT INTO ")
+                            .append(adhoc.getTableName()+"(")
+                            .append(adhoc.getTableFields()+") ")
+                            .append(adhoc.getQuery());
+                    if (insertSqlBuilder.length() > 0) {
+                        final int result = this.jdbcTemplate.update(insertSqlBuilder.toString());
+                        logger.info(ThreadLocalContextUtil.getTenant().getName() + ": Results affected by inserted: " + result);
+
+                        this.jdbcTemplate.update("UPDATE m_adhoc SET last_run=? WHERE id=?", new Date(), adhoc.getId());
+                    }
+                } else {
+                    logger.info(ThreadLocalContextUtil.getTenant().getName() + ": Skipping execution of " + adhoc.getName() + ", scheduled for execution on " + next);
                 }
             });	
         }else{


[5/6] fineract git commit: Merge branch 'PR432' into develop

Posted by na...@apache.org.
Merge branch 'PR432' into develop


Project: http://git-wip-us.apache.org/repos/asf/fineract/repo
Commit: http://git-wip-us.apache.org/repos/asf/fineract/commit/4e97776e
Tree: http://git-wip-us.apache.org/repos/asf/fineract/tree/4e97776e
Diff: http://git-wip-us.apache.org/repos/asf/fineract/diff/4e97776e

Branch: refs/heads/develop
Commit: 4e97776e6246a7fafd0cb85b477f3e3256faa304
Parents: 504f679 749ec05
Author: Nazeer Hussain Shaik <na...@confluxtechnologies.com>
Authored: Mon Dec 11 15:30:14 2017 +0530
Committer: Nazeer Hussain Shaik <na...@confluxtechnologies.com>
Committed: Mon Dec 11 15:30:14 2017 +0530

----------------------------------------------------------------------
 .../adhocquery/api/AdHocJsonInputParams.java    |  5 +-
 .../fineract/adhocquery/data/AdHocData.java     | 56 +++++++++++----
 .../fineract/adhocquery/domain/AdHoc.java       | 40 +++++++++--
 .../adhocquery/domain/ReportRunFrequency.java   | 55 +++++++++++++++
 .../adhocquery/service/AdHocDataValidator.java  | 30 +++++++-
 .../service/AdHocReadPlatformServiceImpl.java   | 10 ++-
 .../AdHocScheduledJobRunnerServiceImpl.java     | 72 ++++++++++++++++----
 .../security/utils/SQLInjectionValidator.java   |  6 +-
 .../core_db/V336__report-run-frequency.sql      | 22 ++++++
 .../core_db/V337__nullable-adhoc-email.sql      | 20 ++++++
 10 files changed, 272 insertions(+), 44 deletions(-)
----------------------------------------------------------------------