You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by ra...@apache.org on 2016/11/14 14:06:13 UTC

[11/14] incubator-fineract git commit: Addressing SMS Review Comments

Addressing SMS Review Comments


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

Branch: refs/heads/develop
Commit: 2d1f6ab39137094af30aaf26a1766b8691ca09e0
Parents: 911cab8
Author: Nazeer Hussain Shaik <na...@confluxtechnologies.com>
Authored: Mon Nov 14 17:50:37 2016 +0530
Committer: Nazeer Hussain Shaik <na...@confluxtechnologies.com>
Committed: Mon Nov 14 17:50:37 2016 +0530

----------------------------------------------------------------------
 api-docs/apiLive.htm                            | 156 ++++++++-
 .../commands/service/CommandWrapperBuilder.java |  12 +-
 .../sms/constants/SmsCampaignConstants.java     |  11 -
 .../sms/constants/SmsCampaignEnumerations.java  |  10 +-
 .../sms/data/CampaignTriggerWithSubTypes.java   | 298 -----------------
 .../sms/data/TriggerTypeWithSubTypesData.java   |  43 ---
 .../sms/domain/SmsCampaignRepository.java       |   5 +
 .../service/SmsCampaignDomainServiceImpl.java   | 332 ++++++++-----------
 .../SmsCampaignDropdownReadPlatformService.java |   3 -
 ...CampaignDropdownReadPlatformServiceImpl.java |  15 +-
 .../SmsCampaignWritePlatformServiceJpaImpl.java |  15 +-
 .../SmsMessageScheduledJobServiceImpl.java      |   2 +-
 12 files changed, 327 insertions(+), 575 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/2d1f6ab3/api-docs/apiLive.htm
----------------------------------------------------------------------
diff --git a/api-docs/apiLive.htm b/api-docs/apiLive.htm
index c2a06be..467d6c5 100644
--- a/api-docs/apiLive.htm
+++ b/api-docs/apiLive.htm
@@ -21159,12 +21159,15 @@ Request Body:
 <a id="smscampaigns_retrieve" name="smscampaigns_retrieve" class="old-syle-anchor">&nbsp;</a>
     <div class="method-section">
         <div class="method-description">
-            <h4>Retrieve a Share Product</h4>
+            <h4>Retrieve a SMS Campaign</h4>
             <p>Example Requests: </p>
             <div class=apiClick>smscampaigns/1</div>
             <br><br>
             <div class=apiClick>smscampaigns/1?template=true</div>
+			<br><br>
+			<div class=apiClick>smscampaigns/template</div>
         </div>
+
         <div class="method-example">
 			<code class="method-declaration">GET https://Domain Name/api/v1/smscampaigns/1</code>
 			<code class="method-response">
@@ -21197,7 +21200,150 @@ Request Body:
 		"recurrenceStartDate":"22 Jan 2016",
 		"recurrence": "YEARLY"			
 }
-			</code>
+
+			
+	<B>smscampaigns/1?template=true</B>
+
+	{
+		"id": 1,
+		"campaignName": "Savings Deposit Campaign"
+		"campaignType": "SMS",
+		"triggerType": 3,
+		"providerId": 2,
+		"runReportId": 180,
+		"reportName" : "Savings Deposit",
+		"paramValue": "{"officeId":1,"loanOfficerId":-1,"transactionId":1,"reportName":"Savings Deposit"}",
+		"message": "Hello {fullName} your account is credited with {depositAmount} on {transactionDate}",
+		"status" : { "id":"","code":"","value":""}	
+		
+		"smsProviderOptions": [{
+		"id": 1,
+		"tenantId": "1",
+		"phoneNo": "+XXXXXXXXXX",
+		"providerName": "Twilio SMS Provider",
+		"providerDescription": "Twilio, just for testing"
+		}],
+		"businessRulesOptions": [
+			{
+			"reportId": 166,
+			"reportName": "Active Clients",
+			"reportType": "SMS",
+			"reportSubType": "NonTriggered",
+			"reportDescription": "All clients with the status \u2018Active\u2019",
+			"reportParamName": {
+				"Office": "OfficeIdSelectOne",
+				"Loan Officer": "loanOfficerIdSelectAll"
+			}
+			}
+		],
+		"triggerTypeOptions": [
+			{"id": 1,"code": "triggerType.direct", "value": "Direct"},
+			{"id": 2, "code": "triggerType.schedule","value": "Scheduled"},
+			{"id": 3,"code": "triggerType.triggered","value": "Triggered"}
+			],
+		"months": [
+		{ "id": 1, "code": "JANUARY", "value": "JANUARY" },
+		{ "id": 2, "code": "FEBRUARY", "value": "FEBRUARY" },
+		{ "id": 3, "code": "MARCH", "value": "MARCH" },
+		{ "id": 4, "code": "APRIL", "value": "APRIL" },
+		{ "id": 5, "code": "MAY", "value": "MAY" },
+		{ "id": 6, "code": "JUNE", "value": "JUNE" },
+		{ "id": 7, "code": "JULY", "value": "JULY" },
+		{ "id": 8, "code": "AUGUST", "value": "AUGUST" },
+		{ "id": 9, "code": "SEPTEMBER", "value": "SEPTEMBER"},
+		{ "id": 10, "code": "OCTOBER", "value": "OCTOBER"},
+		{ "id": 11, "code": "NOVEMBER", "value": "NOVEMBER" }
+	],
+	"weekDays": [
+		{ "id": 1, "code": "calendarWeekDaysType.monday", "value": "MO" },
+		{ "id": 2, "code": "calendarWeekDaysType.tuesday", "value": "TU" },
+		{ "id": 3, "code": "calendarWeekDaysType.wednesday", "value": "WE" },
+		{ "id": 4, "code": "calendarWeekDaysType.thursday", "value": "TH"},
+		{ "id": 5, "code": "calendarWeekDaysType.friday", "value": "FR" },
+		{ "id": 6, "code": "calendarWeekDaysType.saturday", "value": "SA" },
+		{ "id": 7, "code": "calendarWeekDaysType.sunday", "value": "SU" }
+	],
+	"frequencyTypeOptions": [
+		{ "id": 1, "code": "calendarFrequencyType.daily", "value": "DAILY" },
+		{ "id": 2, "code": "calendarFrequencyType.weekly", "value": "WEEKLY"},
+		{ "id": 3, "code": "calendarFrequencyType.monthly", "value": "MONTHLY"},
+		{ "id": 4, "code": "calendarFrequencyType.yearly", "value": "YEARLY" }
+	],
+	"periodFrequencyOptions": [
+		{ "id": 0, "code": "periodFrequencyType.days", "value": "DAYS" },
+		{ "id": 1, "code": "periodFrequencyType.weeks", "value": "WEEKS" },
+		{ "id": 2, "code": "periodFrequencyType.months", "value": "MONTHS" },
+		{ "id": 3, "code": "periodFrequencyType.years", "value": "YEARS" }
+	]
+}
+
+<B>smscampaigns/template</B>
+
+	{
+		"smsProviderOptions": [{
+		"id": 1,
+		"tenantId": "1",
+		"phoneNo": "+XXXXXXXXXX",
+		"providerName": "Twilio SMS Provider",
+		"providerDescription": "Twilio, just for testing"
+		}],
+		"businessRulesOptions": [
+			{
+			"reportId": 166,
+			"reportName": "Active Clients",
+			"reportType": "SMS",
+			"reportSubType": "NonTriggered",
+			"reportDescription": "All clients with the status \u2018Active\u2019",
+			"reportParamName": {
+				"Office": "OfficeIdSelectOne",
+				"Loan Officer": "loanOfficerIdSelectAll"
+			}
+			}
+		],
+		"triggerTypeOptions": [
+			{"id": 1,"code": "triggerType.direct", "value": "Direct"},
+			{"id": 2, "code": "triggerType.schedule","value": "Scheduled"},
+			{"id": 3,"code": "triggerType.triggered","value": "Triggered"}
+			],
+		"months": [
+		{ "id": 1, "code": "JANUARY", "value": "JANUARY" },
+		{ "id": 2, "code": "FEBRUARY", "value": "FEBRUARY" },
+		{ "id": 3, "code": "MARCH", "value": "MARCH" },
+		{ "id": 4, "code": "APRIL", "value": "APRIL" },
+		{ "id": 5, "code": "MAY", "value": "MAY" },
+		{ "id": 6, "code": "JUNE", "value": "JUNE" },
+		{ "id": 7, "code": "JULY", "value": "JULY" },
+		{ "id": 8, "code": "AUGUST", "value": "AUGUST" },
+		{ "id": 9, "code": "SEPTEMBER", "value": "SEPTEMBER"},
+		{ "id": 10, "code": "OCTOBER", "value": "OCTOBER"},
+		{ "id": 11, "code": "NOVEMBER", "value": "NOVEMBER" }
+	],
+	"weekDays": [
+		{ "id": 1, "code": "calendarWeekDaysType.monday", "value": "MO" },
+		{ "id": 2, "code": "calendarWeekDaysType.tuesday", "value": "TU" },
+		{ "id": 3, "code": "calendarWeekDaysType.wednesday", "value": "WE" },
+		{ "id": 4, "code": "calendarWeekDaysType.thursday", "value": "TH"},
+		{ "id": 5, "code": "calendarWeekDaysType.friday", "value": "FR" },
+		{ "id": 6, "code": "calendarWeekDaysType.saturday", "value": "SA" },
+		{ "id": 7, "code": "calendarWeekDaysType.sunday", "value": "SU" }
+	],
+	"frequencyTypeOptions": [
+		{ "id": 1, "code": "calendarFrequencyType.daily", "value": "DAILY" },
+		{ "id": 2, "code": "calendarFrequencyType.weekly", "value": "WEEKLY"},
+		{ "id": 3, "code": "calendarFrequencyType.monthly", "value": "MONTHLY"},
+		{ "id": 4, "code": "calendarFrequencyType.yearly", "value": "YEARLY" }
+	],
+	"periodFrequencyOptions": [
+		{ "id": 0, "code": "periodFrequencyType.days", "value": "DAYS" },
+		{ "id": 1, "code": "periodFrequencyType.weeks", "value": "WEEKS" },
+		{ "id": 2, "code": "periodFrequencyType.months", "value": "MONTHS" },
+		{ "id": 3, "code": "periodFrequencyType.years", "value": "YEARS" }
+	]
+}
+
+</code>
+			
+			
         </div>
 </div>
 
@@ -21279,7 +21425,7 @@ Request Body:
     "status": {
       "id": 300,
       "code": "smsCampaignStatus.active",
-      "value": "Activated",
+      "value": "active",
     },
     "locale": "en",
     "dateFormat": "dd MMMM yyyy",
@@ -21314,7 +21460,7 @@ Request Body:
     "status": {
       "id": 600,
       "code": "smsCampaignStatus.closed",
-      "value": "Activated",
+      "value": "closed",
     },
     "locale": "en",
     "dateFormat": "dd MMMM yyyy",
@@ -21350,7 +21496,7 @@ Request Body:
     "status": {
       "id": 300,
       "code": "smsCampaignStatus.active",
-      "value": "Activated",
+      "value": "active",
     },
     "locale": "en",
     "dateFormat": "dd MMMM yyyy",

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/2d1f6ab3/fineract-provider/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java b/fineract-provider/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java
index ed92a38..0cdc7e2 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/commands/service/CommandWrapperBuilder.java
@@ -2808,7 +2808,7 @@ public class CommandWrapperBuilder {
         this.actionName = "CREATE";
         this.entityName = "SMSCAMPAIGN";
         this.entityId = null;
-        this.href = "/smscampaign";
+        this.href = "/smscampaigns";
         return this;
     }
     
@@ -2816,7 +2816,7 @@ public class CommandWrapperBuilder {
         this.actionName = "UPDATE";
         this.entityName = "SMSCAMPAIGN";
         this.entityId = resourceId;
-        this.href = "/smscampaign/"+resourceId;
+        this.href = "/smscampaigns/"+resourceId;
         return this;
     }
     
@@ -2824,7 +2824,7 @@ public class CommandWrapperBuilder {
         this.actionName = "ACTIVATE";
         this.entityName = "SMSCAMPAIGN";
         this.entityId = resourceId;
-        this.href = "/smscampaign/"+resourceId + "?command=activate";
+        this.href = "/smscampaigns/"+resourceId + "?command=activate";
         return this;
     }
 
@@ -2832,14 +2832,14 @@ public class CommandWrapperBuilder {
         this.actionName = "CLOSE";
         this.entityName = "SMSCAMPAIGN";
         this.entityId = resourceId;
-        this.href = "/smscampaign/"+resourceId + "?command=close";
+        this.href = "/smscampaigns/"+resourceId + "?command=close";
         return this;
     }
     public CommandWrapperBuilder reactivateSmsCampaign(final Long resourceId) {
         this.actionName = "REACTIVATE";
         this.entityName = "SMSCAMPAIGN";
         this.entityId = resourceId;
-        this.href = "/smscampaign/"+resourceId + "?command=reactivate";
+        this.href = "/smscampaigns/"+resourceId + "?command=reactivate";
         return this;
     }
     
@@ -2847,7 +2847,7 @@ public class CommandWrapperBuilder {
         this.actionName = "DELETE";
         this.entityName = "SMSCAMPAIGN";
         this.entityId = resourceId;
-        this.href = "/smscampaign/"+resourceId;
+        this.href = "/smscampaigns/"+resourceId;
         return this;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/2d1f6ab3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignConstants.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignConstants.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignConstants.java
index 104f4c7..964beda 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignConstants.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignConstants.java
@@ -20,8 +20,6 @@ package org.apache.fineract.infrastructure.campaigns.sms.constants;
 
 public interface SmsCampaignConstants {
 
-    String SMS_CAMPAIGN_NAME = "sms";
-
     String RESOURCE_NAME = "SMSCAMPAIGN";
 
     String SMS_BRIDGE = "sms_bridge";
@@ -31,13 +29,4 @@ public interface SmsCampaignConstants {
     String FINERACT_PLATFORM_TENANT_ID = "Fineract-Platform-TenantId";
 
     String FINERACT_TENANT_APP_KEY = "Fineract-Tenant-App-Key";
-    
-    //Supported Triggered Campaigns
-    
-    String LOAN_REJECT = "Loan Rejected" ;
-    
-    String LOAN_APPROVED = "Loan Approved" ;
-    
-    String LOAN_REPAYMENT = "Loan Repayment" ;
-    
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/2d1f6ab3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignEnumerations.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignEnumerations.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignEnumerations.java
index 16ae3cd..99de55e 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignEnumerations.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignEnumerations.java
@@ -73,7 +73,7 @@ public class SmsCampaignEnumerations {
     public static List<EnumOptionData> calendarMonthType() {
         final List<EnumOptionData> optionDatas = new ArrayList<>();
         for (final Month monthType : Month.values()) {
-            if (Month.DECEMBER.compareTo(monthType) != 0) {
+            if (Month.DECEMBER.compareTo(monthType) != 0) { //We are removing December because we are adding yearly frequency
                 optionDatas.add(calendarMonthType(monthType));
             }
         }
@@ -83,9 +83,11 @@ public class SmsCampaignEnumerations {
     public static List<EnumOptionData> calendarPeriodFrequencyTypes(final PeriodFrequencyType[] periodFrequencyTypes) {
         final List<EnumOptionData> optionDatas = new ArrayList<>();
         for (final PeriodFrequencyType periodFrequencyType : periodFrequencyTypes) {
-            final EnumOptionData optionData = new EnumOptionData(periodFrequencyType.getValue().longValue(), periodFrequencyType.getCode(),
-                    periodFrequencyType.toString());
-            optionDatas.add(optionData);
+        	if(!periodFrequencyType.getValue().equals(PeriodFrequencyType.INVALID.getValue())) {
+        		final EnumOptionData optionData = new EnumOptionData(periodFrequencyType.getValue().longValue(), periodFrequencyType.getCode(),
+                        periodFrequencyType.toString());
+                optionDatas.add(optionData);	
+        	}
         }
         return optionDatas;
     }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/2d1f6ab3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignTriggerWithSubTypes.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignTriggerWithSubTypes.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignTriggerWithSubTypes.java
deleted file mode 100644
index c23771f..0000000
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignTriggerWithSubTypes.java
+++ /dev/null
@@ -1,298 +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.
- */
-package org.apache.fineract.infrastructure.campaigns.sms.data;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.fineract.infrastructure.core.data.EnumOptionData;
-
-public final class CampaignTriggerWithSubTypes {
-
-    public enum ActualCampaignTriggerType {
-        INVALID(0, "campaignTriggerType.invalid"), //
-        LOAN(1, "campaignTriggerType.loan"), //
-        SAVING(2, "campaignTriggerType.saving"), //
-        CLIENT(3, "campaignTriggerType.client");
-
-        private Integer value;
-        private String code;
-
-        private ActualCampaignTriggerType(Integer value, String code) {
-            this.value = value;
-            this.code = code;
-        }
-
-        public static ActualCampaignTriggerType fromInt(final Integer typeValue) {
-            ActualCampaignTriggerType type = ActualCampaignTriggerType.INVALID;
-            switch (typeValue) {
-                case 1:
-                    type = LOAN;
-                break;
-                case 2:
-                    type = SAVING;
-                break;
-                case 3:
-                    type = CLIENT;
-                break;
-            }
-            return type;
-        }
-
-        public Integer getValue() {
-            return this.value;
-        }
-
-        public String getCode() {
-            return this.code;
-        }
-
-        public static EnumOptionData toEnumOptionData(final ActualCampaignTriggerType triggerType) {
-            final EnumOptionData optionData = new EnumOptionData(new Long(triggerType.getValue()), triggerType.getCode(), triggerType.name());
-            return optionData;
-        }
-
-        public static EnumOptionData toEnumOptionData(final Integer triggerTypeValue) {
-            ActualCampaignTriggerType actualCampaignTriggerType = ActualCampaignTriggerType.fromInt(triggerTypeValue);
-            final EnumOptionData optionData = new EnumOptionData(new Long(actualCampaignTriggerType.getValue()),
-                    actualCampaignTriggerType.getCode(), actualCampaignTriggerType.name());
-            return optionData;
-        }
-
-        public boolean isInvalid() {
-            return this.value.equals(ActualCampaignTriggerType.INVALID.getValue());
-        }
-    }
-
-    public enum CampaignTriggerSubType {
-        INVALID(0, ActualCampaignTriggerType.INVALID, "campaignTriggerSubType.invalid"), //
-
-        DISBURSE(101, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.disburse"), //
-        REPAYMENT(102, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.repayment"), //
-        UNDO_DISBURSAL(103, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.undodisbursal"), //
-        WRITE_OFF(104, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.writeoff"), //
-        ADJUST(105, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.adjust"), //
-        UNDO_WRITE_OFF(106, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.undowriteoff"), //
-        FORECLOSURE(107, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.foreclosure"), //
-        APPROVED(108, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.approved"), //
-        WAIVE_INTEREST(109, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.waive.interest"), //
-        CLOSE(110, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.close"), //
-        CLOSE_AS_RESCHEDULE(111, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.close.as.rescheduled"), //
-        ADD_CHARGE(112, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.add.charge"), //
-        UPDATE_CHARGE(113, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.update.charge"), //
-        WAIVE_CHARGE(114, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.waive.charge"), //
-        DELETE_CHARGE(115, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.delete.charge"), //
-        CHARGE_PAYMENT(116, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.charge.payment"), //
-        INITIATE_TRANSFER(117, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.initiate.transfer"), //
-        ACCEPT_TRANSFER(118, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.accept.transfer"), //
-        WITHDRAW_TRANSFER(119, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.withdraw.transfer"), //
-        REJECT_TRANSFER(120, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.reject.transfer"), //
-        REASSIGN_OFFICER(121, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.reassign.officer"), //
-        REMOVE_OFFICER(122, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.reassign.officer"), //
-        APPLY_OVERDUE_CHARGE(123, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.reassign.officer"), //
-        INTEREST_RECALCULATION(124, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.reassign.officer"), //
-        REFUND(125, ActualCampaignTriggerType.LOAN, "campaignTriggerSubType.reassign.officer"), //
-
-        SAVINGS_DEPOSIT(201, ActualCampaignTriggerType.SAVING, "campaignTriggerSubType.deposit"), //
-        SAVINGS_WITHDRAWAL(202, ActualCampaignTriggerType.SAVING, "campaignTriggerSubType.withdrawal"), //
-        SAVINGS_ACTIVATE(203, ActualCampaignTriggerType.SAVING, "campaignTriggerSubType.savings.activate"), //
-        SAVINGS_ADJUST_TRANSACTION(204, ActualCampaignTriggerType.SAVING, "campaignTriggerSubType.savings.adjust"), //
-        SAVINGS_APPLY_ANNUAL_FEE(205, ActualCampaignTriggerType.SAVING, "campaignTriggerSubType.savings.apply.annual.fee"), //
-        SAVINGS_CALCULATE_INTEREST(206, ActualCampaignTriggerType.SAVING, "campaignTriggerSubType.savings.calclulate.interest"), //
-        SAVINGS_CLOSE(207, ActualCampaignTriggerType.SAVING, "campaignTriggerSubType.savings.close"), //
-        SAVINGS_POST_INTEREST(208, ActualCampaignTriggerType.SAVING, "campaignTriggerSubType.savings.post"), //
-        SAVINGS_REJECT(209, ActualCampaignTriggerType.SAVING, "campaignTriggerSubType.savings.reject"), //
-        SAVINGS_UNDO(210, ActualCampaignTriggerType.SAVING, "campaignTriggerSubType.savings.undo"), //
-        SAVINGS_ADD_CHARGE(211, ActualCampaignTriggerType.SAVING, "campaignTriggerSubType.savings.add.charge"), //
-        SAVINGS_WAIVE_CHARGE(212, ActualCampaignTriggerType.SAVING, "campaignTriggerSubType.savings.waive.charge"), //
-        SAVINGS_PAY_CHARGE(213, ActualCampaignTriggerType.SAVING, "campaignTriggerSubType.savings.pay.charge"), //
-
-        CLIENTS_ACTIVATE(301, ActualCampaignTriggerType.CLIENT, "campaignTriggerSubType.activate"), //
-        CLIENTS_CLOSE(302, ActualCampaignTriggerType.CLIENT, "campaignTriggerSubType.close"), //
-        CLIENTS_ACCEPT_TRANSFER(303, ActualCampaignTriggerType.CLIENT, "campaignTriggerSubType.accept.transfer"), //
-        CLIENTS_ASSIGN_STAFF(304, ActualCampaignTriggerType.CLIENT, "campaignTriggerSubType.assign.staff"), //
-        CLIENTS_CREATE(305, ActualCampaignTriggerType.CLIENT, "campaignTriggerSubType.create"), //
-        CLIENTS_DELETE(306, ActualCampaignTriggerType.CLIENT, "campaignTriggerSubType.delete"), //
-        CLIENTS_PROPOSE_TRANSFER(307, ActualCampaignTriggerType.CLIENT, "campaignTriggerSubType.propose.transfer"), //
-        CLIENTS_REACTIVATE(308, ActualCampaignTriggerType.CLIENT, "campaignTriggerSubType.reactivate"), //
-        CLIENTS_REJECT(309, ActualCampaignTriggerType.CLIENT, "campaignTriggerSubType.reject"), //
-        CLIENTS_REJECT_TRANSFER(310, ActualCampaignTriggerType.CLIENT, "campaignTriggerSubType.reject.transfer"), //
-        CLIENTS_WITHDRAW(311, ActualCampaignTriggerType.CLIENT, "campaignTriggerSubType.withdraw"), //
-        CLIENTS_WITHDRAW_TRANSFER(312, ActualCampaignTriggerType.CLIENT, "campaignTriggerSubType.withdraw.transfer");
-
-        private Integer id;
-        private ActualCampaignTriggerType type;
-        private String code;
-
-        private CampaignTriggerSubType(Integer id, ActualCampaignTriggerType type, String code) {
-            this.id = id;
-            this.type = type;
-            this.code = code;
-        }
-
-        public static CampaignTriggerSubType fromInt(final Integer subTypeValue) {
-            CampaignTriggerSubType subType = CampaignTriggerSubType.INVALID;
-            switch (subTypeValue) {
-                case 101:
-                    subType = DISBURSE;
-                break;
-                case 102:
-                    subType = REPAYMENT;
-                break;
-                case 103:
-                    subType = ADJUST;
-                break;
-                case 104:
-                    subType = UNDO_DISBURSAL;
-                break;
-                case 105:
-                    subType = WRITE_OFF;
-                break;
-                case 106:
-                    subType = UNDO_WRITE_OFF;
-                break;
-
-                case 201:
-                    subType = SAVINGS_DEPOSIT;
-                break;
-                case 202:
-                    subType = SAVINGS_WITHDRAWAL;
-                break;
-                case 203:
-                    subType = SAVINGS_ACTIVATE;
-                break;
-                case 204:
-                    subType = SAVINGS_ADJUST_TRANSACTION;
-                break;
-                case 205:
-                    subType = SAVINGS_APPLY_ANNUAL_FEE;
-                break;
-                case 206:
-                    subType = SAVINGS_CALCULATE_INTEREST;
-                break;
-                case 207:
-                    subType = SAVINGS_CLOSE;
-                break;
-                case 208:
-                    subType = SAVINGS_POST_INTEREST;
-                break;
-                case 209:
-                    subType = SAVINGS_REJECT;
-                break;
-                case 210:
-                    subType = SAVINGS_UNDO;
-                break;
-                case 211:
-                    subType = SAVINGS_ADD_CHARGE;
-                break;
-                case 212:
-                    subType = SAVINGS_WAIVE_CHARGE;
-                break;
-                case 213:
-                    subType = SAVINGS_PAY_CHARGE;
-                break;
-
-                case 301:
-                    subType = CLIENTS_ACTIVATE;
-                break;
-                case 302:
-                    subType = CLIENTS_CLOSE;
-                break;
-                case 303:
-                    subType = CLIENTS_ACCEPT_TRANSFER;
-                break;
-                case 304:
-                    subType = CLIENTS_ASSIGN_STAFF;
-                break;
-                case 305:
-                    subType = CLIENTS_CREATE;
-                break;
-                case 306:
-                    subType = CLIENTS_DELETE;
-                break;
-                case 307:
-                    subType = CLIENTS_PROPOSE_TRANSFER;
-                break;
-                case 308:
-                    subType = CLIENTS_REACTIVATE;
-                break;
-                case 309:
-                    subType = CLIENTS_REJECT;
-                break;
-                case 310:
-                    subType = CLIENTS_REJECT_TRANSFER;
-                break;
-                case 311:
-                    subType = CLIENTS_WITHDRAW;
-                break;
-                case 312:
-                    subType = CLIENTS_WITHDRAW_TRANSFER;
-                break;
-            }
-            return subType;
-        }
-
-        public Integer getId() {
-            return this.id;
-        }
-
-        public ActualCampaignTriggerType getType() {
-            return this.type;
-        }
-
-        public String getCode() {
-            return this.code;
-        }
-
-        public static EnumOptionData toEnumOptionData(final Integer triggerSubType) {
-            CampaignTriggerSubType subTypeEnum = CampaignTriggerSubType.fromInt(triggerSubType);
-            final EnumOptionData optionData = new EnumOptionData(new Long(subTypeEnum.getId()), subTypeEnum.getCode(), subTypeEnum.name());
-            return optionData;
-        }
-    }
-
-    public static List<EnumOptionData> addTypeSubTypeMapping(ActualCampaignTriggerType type) {
-        List<EnumOptionData> subTypeList = new ArrayList<>();
-        EnumOptionData optionData = null;
-        for (CampaignTriggerSubType subType : CampaignTriggerSubType.values()) {
-            if (subType.getType().equals(type)) {
-                optionData = new EnumOptionData(subType.getId().longValue(), subType.getCode(), subType.name());
-                subTypeList.add(optionData);
-            }
-        }
-        return subTypeList;
-    }
-
-    public static Collection<TriggerTypeWithSubTypesData> getTriggerTypeAndSubTypes() {
-        final Collection<TriggerTypeWithSubTypesData> typesList = new ArrayList<>();
-        EnumOptionData actualTriggerType = null;
-        for (ActualCampaignTriggerType triggerType : ActualCampaignTriggerType.values()) {
-            if (triggerType.isInvalid()) {
-                continue;
-            }
-            List<EnumOptionData> subTypeList = addTypeSubTypeMapping(triggerType);
-            actualTriggerType = ActualCampaignTriggerType.toEnumOptionData(triggerType);
-            TriggerTypeWithSubTypesData triggerTypeWithSubTypesData = new TriggerTypeWithSubTypesData(actualTriggerType, subTypeList);
-            typesList.add(triggerTypeWithSubTypesData);
-        }
-        return typesList;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/2d1f6ab3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/TriggerTypeWithSubTypesData.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/TriggerTypeWithSubTypesData.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/TriggerTypeWithSubTypesData.java
deleted file mode 100644
index b6e9c3c..0000000
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/TriggerTypeWithSubTypesData.java
+++ /dev/null
@@ -1,43 +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.
- */
-package org.apache.fineract.infrastructure.campaigns.sms.data;
-
-import java.util.List;
-
-import org.apache.fineract.infrastructure.core.data.EnumOptionData;
-
-public class TriggerTypeWithSubTypesData {
-
-    private final EnumOptionData actualTriggerType;
-    private final List<EnumOptionData> triggerSubTypes;
-
-    public TriggerTypeWithSubTypesData(final EnumOptionData actualTriggerType, List<EnumOptionData> triggerSubTypes) {
-        this.actualTriggerType = actualTriggerType;
-        this.triggerSubTypes = triggerSubTypes;
-    }
-
-    public EnumOptionData getActualTriggerType() {
-        return this.actualTriggerType;
-    }
-
-    public List<EnumOptionData> getTriggerSubTypes() {
-        return this.triggerSubTypes;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/2d1f6ab3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaignRepository.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaignRepository.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaignRepository.java
index 436f9ed..bc3bb7d 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaignRepository.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaignRepository.java
@@ -23,6 +23,8 @@ import java.util.List;
 
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 
 public interface SmsCampaignRepository extends JpaRepository<SmsCampaign, Long>, JpaSpecificationExecutor<SmsCampaign> {
 
@@ -32,4 +34,7 @@ public interface SmsCampaignRepository extends JpaRepository<SmsCampaign, Long>,
             final Integer status);
 
     Collection<SmsCampaign> findByTriggerType(final Integer triggerType) ;
+    
+    @Query("SELECT campaign FROM SmsCampaign campaign WHERE campaign.paramValue LIKE :reportPattern AND campaign.triggerType=:triggerType AND campaign.status=300")
+    List<SmsCampaign> findActiveSmsCampaigns(@Param("reportPattern") final String reportPattern, @Param("triggerType") final Integer triggerType) ;
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/2d1f6ab3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDomainServiceImpl.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDomainServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDomainServiceImpl.java
index 00926c4..42d7b8b 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDomainServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDomainServiceImpl.java
@@ -25,6 +25,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -65,6 +66,8 @@ public class SmsCampaignDomainServiceImpl implements SmsCampaignDomainService {
 
 	private static final Logger logger = LoggerFactory.getLogger(SmsCampaignDomainServiceImpl.class);
 	
+	//private final static int POOL_SIZE = 5 ;
+	
     private final SmsCampaignRepository smsCampaignRepository;
     private final SmsMessageRepository smsMessageRepository;
     private final OfficeRepository officeRepository;
@@ -100,216 +103,192 @@ public class SmsCampaignDomainServiceImpl implements SmsCampaignDomainService {
         this.businessEventNotifierService.addBusinessEventPostListners(BUSINESS_EVENTS.SAVINGS_REJECT, new SavingsAccountRejectedListener());
         this.businessEventNotifierService.addBusinessEventPostListners(BUSINESS_EVENTS.SAVINGS_DEPOSIT, new SavingsAccountTransactionListener(true));
         this.businessEventNotifierService.addBusinessEventPostListners(BUSINESS_EVENTS.SAVINGS_WITHDRAWAL, new SavingsAccountTransactionListener(false));
-        
-        
     }
 
-    private void notifyRejectedLoanOwner(Loan loan) {
-        ArrayList<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("loan rejected");
-        if(smsCampaigns.size()>0){
-            for (SmsCampaign campaign:smsCampaigns){
-                if(campaign.isActive()) {
-                    this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(loan, campaign);
-                }
-            }
-        }
-    }
+	private void notifyRejectedLoanOwner(Loan loan) {
+		List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("Loan Rejected");
+		if (smsCampaigns.size() > 0) {
+			for (SmsCampaign campaign : smsCampaigns) {
+				if (campaign.isActive()) {
+					SmsCampaignDomainServiceImpl.this.smsCampaignWritePlatformCommandHandler
+							.insertDirectCampaignIntoSmsOutboundTable(loan, campaign);
+				}
+			}
+		}
+	}
 
     private void notifyAcceptedLoanOwner(Loan loan) {
-        ArrayList<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("loan approved");
-
+        List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("Loan Approved");
         if(smsCampaigns.size()>0){
             for (SmsCampaign campaign:smsCampaigns){
-                if(campaign.isActive()) {
-                    this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(loan, campaign);
-                }
+            	this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(loan, campaign);
             }
         }
     }
 
     private void notifyClientActivated(final Client client) {
-    	 ArrayList<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("client activated");
+    	 List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("Client Activated");
     	 if(smsCampaigns.size()>0){
              for (SmsCampaign campaign:smsCampaigns){
-                 if(campaign.isActive()) {
-                     this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(client, campaign);
-                 }
+            	 this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(client, campaign);
              }
          }
     	 
     }
     
     private void notifyClientRejected(final Client client) {
-   	 ArrayList<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("client rejected");
+   	 List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("Client Rejected");
    	 if(smsCampaigns.size()>0){
             for (SmsCampaign campaign:smsCampaigns){
-                if(campaign.isActive()) {
-                    this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(client, campaign);
-                }
+            	this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(client, campaign);
             }
         }
    	 
    }
     
 	private void notifySavingsAccountActivated(final SavingsAccount savingsAccount) {
-		ArrayList<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("savings activated");
+		List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("Savings Activated");
 		if (smsCampaigns.size() > 0) {
 			for (SmsCampaign campaign : smsCampaigns) {
-				if (campaign.isActive()) {
-					this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(savingsAccount,
+				this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(savingsAccount,
 							campaign);
-				}
 			}
 		}
 
 	}
 
 	private void notifySavingsAccountRejected(final SavingsAccount savingsAccount) {
-		ArrayList<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("savings rejected");
+		List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("Savings Rejected");
 		if (smsCampaigns.size() > 0) {
 			for (SmsCampaign campaign : smsCampaigns) {
-				if (campaign.isActive()) {
-					this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(savingsAccount,
+				this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(savingsAccount,
 							campaign);
-				}
 			}
 		}
 
 	}
 	
 	private void sendSmsForLoanRepayment(LoanTransaction loanTransaction) {
-		ArrayList<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("loan repayment");
+		List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("Loan Repayment");
 		if (smsCampaigns.size() > 0) {
 			for (SmsCampaign smsCampaign : smsCampaigns) {
-				if (smsCampaign.isActive()) {
-					try {
-						Loan loan = loanTransaction.getLoan();
-						final Set<Client> groupClients = new HashSet<>();
-						if (loan.hasInvalidLoanType()) {
-							throw new InvalidLoanTypeException("Loan Type cannot be Invalid for the Triggered Sms Campaign");
-						}
-						if (loan.isGroupLoan()) {
-							Group group = this.groupRepository.findOne(loan.getGroupId());
-							groupClients.addAll(group.getClientMembers());
-						} else {
-							groupClients.add(loan.client());
-						}
-						HashMap<String, String> campaignParams = new ObjectMapper()
-								.readValue(smsCampaign.getParamValue(), new TypeReference<HashMap<String, String>>() {
-								});
-
-						if (groupClients.size() > 0) {
-							for (Client client : groupClients) {
-								HashMap<String, Object> smsParams = processRepaymentDataForSms(loanTransaction, client);
-								for (String key : campaignParams.keySet()) {
-									String value = campaignParams.get(key);
-									String spvalue = null;
-									boolean spkeycheck = smsParams.containsKey(key);
-									if (spkeycheck) {
-										spvalue = smsParams.get(key).toString();
-									}
-									if (spkeycheck && !(value.equals("-1") || spvalue.equals(value))) {
-										if (key.equals("officeId")) {
-											Office campaignOffice = this.officeRepository.findOne(Long.valueOf(value));
-											if (campaignOffice
-													.doesNotHaveAnOfficeInHierarchyWithId(client.getOffice().getId())) {
-												throw new RuntimeException();
-											}
-										} else {
+				try {
+					Loan loan = loanTransaction.getLoan();
+					final Set<Client> groupClients = new HashSet<>();
+					if (loan.hasInvalidLoanType()) {
+						throw new InvalidLoanTypeException(
+								"Loan Type cannot be Invalid for the Triggered Sms Campaign");
+					}
+					if (loan.isGroupLoan()) {
+						Group group = this.groupRepository.findOne(loan.getGroupId());
+						groupClients.addAll(group.getClientMembers());
+					} else {
+						groupClients.add(loan.client());
+					}
+					HashMap<String, String> campaignParams = new ObjectMapper().readValue(smsCampaign.getParamValue(),
+							new TypeReference<HashMap<String, String>>() {
+							});
+
+					if (groupClients.size() > 0) {
+						for (Client client : groupClients) {
+							HashMap<String, Object> smsParams = processRepaymentDataForSms(loanTransaction, client);
+							for (String key : campaignParams.keySet()) {
+								String value = campaignParams.get(key);
+								String spvalue = null;
+								boolean spkeycheck = smsParams.containsKey(key);
+								if (spkeycheck) {
+									spvalue = smsParams.get(key).toString();
+								}
+								if (spkeycheck && !(value.equals("-1") || spvalue.equals(value))) {
+									if (key.equals("officeId")) {
+										Office campaignOffice = this.officeRepository.findOne(Long.valueOf(value));
+										if (campaignOffice
+												.doesNotHaveAnOfficeInHierarchyWithId(client.getOffice().getId())) {
 											throw new RuntimeException();
 										}
+									} else {
+										throw new RuntimeException();
 									}
 								}
-								String message = this.smsCampaignWritePlatformCommandHandler.compileSmsTemplate(
-										smsCampaign.getMessage(), smsCampaign.getCampaignName(), smsParams);
-								Object mobileNo = smsParams.get("mobileNo");
-								if (mobileNo != null) {
-									SmsMessage smsMessage = SmsMessage.pendingSms(null, null, client, null, message,
-											mobileNo.toString(), smsCampaign);
-									this.smsMessageRepository.save(smsMessage);
-									Collection<SmsMessage> messages = new ArrayList<>();
-									messages.add(smsMessage);
-									Map<SmsCampaign, Collection<SmsMessage>> smsDataMap = new HashMap<>();
-									smsDataMap.put(smsCampaign, messages);
-									this.smsMessageScheduledJobService.sendTriggeredMessages(smsDataMap);
-								}
+							}
+							String message = this.smsCampaignWritePlatformCommandHandler.compileSmsTemplate(
+									smsCampaign.getMessage(), smsCampaign.getCampaignName(), smsParams);
+							Object mobileNo = smsParams.get("mobileNo");
+							if (mobileNo != null) {
+								SmsMessage smsMessage = SmsMessage.pendingSms(null, null, client, null, message,
+										mobileNo.toString(), smsCampaign);
+								this.smsMessageRepository.save(smsMessage);
+								Collection<SmsMessage> messages = new ArrayList<>();
+								messages.add(smsMessage);
+								Map<SmsCampaign, Collection<SmsMessage>> smsDataMap = new HashMap<>();
+								smsDataMap.put(smsCampaign, messages);
+								this.smsMessageScheduledJobService.sendTriggeredMessages(smsDataMap);
 							}
 						}
-					} catch (final IOException e) {
-						logger.error("smsParams does not contain the key: " + e.getMessage());
-					} catch (final RuntimeException e) {
-						logger.debug("Client Office Id and SMS Campaign Office id doesn't match");
 					}
+				} catch (final IOException e) {
+					logger.error("smsParams does not contain the key: " + e.getMessage());
+				} catch (final RuntimeException e) {
+					logger.debug("Client Office Id and SMS Campaign Office id doesn't match");
 				}
 			}
 		}
 	}
 
 	private void sendSmsForSavingsTransaction(final SavingsAccountTransaction savingsTransaction, boolean isDeposit) {
-		String campaignName = isDeposit ? "savings deposit" : "savings withdrawal";
-		ArrayList<SmsCampaign> smsCampaigns = retrieveSmsCampaigns(campaignName);
+		String campaignName = isDeposit ? "Savings Deposit" : "Savings Withdrawal";
+		List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns(campaignName);
 		if (smsCampaigns.size() > 0) {
 			for (SmsCampaign smsCampaign : smsCampaigns) {
-				if (smsCampaign.isActive()) {
-					try {
-						final SavingsAccount savingsAccount = savingsTransaction.getSavingsAccount();
-						final Client client = savingsAccount.getClient();
-						HashMap<String, String> campaignParams = new ObjectMapper()
-								.readValue(smsCampaign.getParamValue(), new TypeReference<HashMap<String, String>>() {
-								});
-						HashMap<String, Object> smsParams = processSavingsTransactionDataForSms(savingsTransaction,
-								client);
-						for (String key : campaignParams.keySet()) {
-							String value = campaignParams.get(key);
-							String spvalue = null;
-							boolean spkeycheck = smsParams.containsKey(key);
-							if (spkeycheck) {
-								spvalue = smsParams.get(key).toString();
-							}
-							if (spkeycheck && !(value.equals("-1") || spvalue.equals(value))) {
-								if (key.equals("officeId")) {
-									Office campaignOffice = this.officeRepository.findOne(Long.valueOf(value));
-									if (campaignOffice
-											.doesNotHaveAnOfficeInHierarchyWithId(client.getOffice().getId())) {
-										throw new RuntimeException();
-									}
-								} else {
+				try {
+					final SavingsAccount savingsAccount = savingsTransaction.getSavingsAccount();
+					final Client client = savingsAccount.getClient();
+					HashMap<String, String> campaignParams = new ObjectMapper().readValue(smsCampaign.getParamValue(),
+							new TypeReference<HashMap<String, String>>() {
+							});
+					HashMap<String, Object> smsParams = processSavingsTransactionDataForSms(savingsTransaction, client);
+					for (String key : campaignParams.keySet()) {
+						String value = campaignParams.get(key);
+						String spvalue = null;
+						boolean spkeycheck = smsParams.containsKey(key);
+						if (spkeycheck) {
+							spvalue = smsParams.get(key).toString();
+						}
+						if (spkeycheck && !(value.equals("-1") || spvalue.equals(value))) {
+							if (key.equals("officeId")) {
+								Office campaignOffice = this.officeRepository.findOne(Long.valueOf(value));
+								if (campaignOffice.doesNotHaveAnOfficeInHierarchyWithId(client.getOffice().getId())) {
 									throw new RuntimeException();
 								}
+							} else {
+								throw new RuntimeException();
 							}
 						}
-						String message = this.smsCampaignWritePlatformCommandHandler
-								.compileSmsTemplate(smsCampaign.getMessage(), smsCampaign.getCampaignName(), smsParams);
-						Object mobileNo = smsParams.get("mobileNo");
-						if (mobileNo != null) {
-							SmsMessage smsMessage = SmsMessage.pendingSms(null, null, client, null, message,
-									mobileNo.toString(), smsCampaign);
-							this.smsMessageRepository.save(smsMessage);
-							Collection<SmsMessage> messages = new ArrayList<>();
-							messages.add(smsMessage);
-							Map<SmsCampaign, Collection<SmsMessage>> smsDataMap = new HashMap<>();
-							smsDataMap.put(smsCampaign, messages);
-							this.smsMessageScheduledJobService.sendTriggeredMessages(smsDataMap);
-						}
-					} catch (final IOException e) {
-						logger.error("smsParams does not contain the key: " + e.getMessage());
-					} catch (final RuntimeException e) {
-						logger.debug("Client Office Id and SMS Campaign Office id doesn't match");
 					}
+					String message = this.smsCampaignWritePlatformCommandHandler
+							.compileSmsTemplate(smsCampaign.getMessage(), smsCampaign.getCampaignName(), smsParams);
+					Object mobileNo = smsParams.get("mobileNo");
+					if (mobileNo != null) {
+						SmsMessage smsMessage = SmsMessage.pendingSms(null, null, client, null, message,
+								mobileNo.toString(), smsCampaign);
+						this.smsMessageRepository.save(smsMessage);
+						Collection<SmsMessage> messages = new ArrayList<>();
+						messages.add(smsMessage);
+						Map<SmsCampaign, Collection<SmsMessage>> smsDataMap = new HashMap<>();
+						smsDataMap.put(smsCampaign, messages);
+						this.smsMessageScheduledJobService.sendTriggeredMessages(smsDataMap);
+					}
+				} catch (final IOException e) {
+					logger.error("smsParams does not contain the key: " + e.getMessage());
+				} catch (final RuntimeException e) {
+					logger.debug("Client Office Id and SMS Campaign Office id doesn't match");
 				}
 			}
 		}
 	}
     
-    private ArrayList<SmsCampaign> retrieveSmsCampaigns(String paramValue){
-        Collection<SmsCampaign> initialSmsCampaignList = smsCampaignRepository.findByTriggerType(SmsCampaignTriggerType.TRIGGERED.getValue());
-        ArrayList<SmsCampaign> smsCampaigns = new ArrayList<>();
-
-        for(SmsCampaign campaign : initialSmsCampaignList){
-            if(campaign.getParamValue().toLowerCase().contains(paramValue)){
-                smsCampaigns.add(campaign);
-            }
-        }
+    private List<SmsCampaign> retrieveSmsCampaigns(String paramValue){
+        List<SmsCampaign> smsCampaigns = smsCampaignRepository.findActiveSmsCampaigns("%"+paramValue+"%", SmsCampaignTriggerType.TRIGGERED.getValue());
         return smsCampaigns;
     }
 
@@ -396,12 +375,15 @@ public class SmsCampaignDomainServiceImpl implements SmsCampaignDomainService {
         return smsParams;
     }
     
-    private class SendSmsOnLoanApproved implements BusinessEventListner{
-
-        @Override
-        public void businessEventToBeExecuted(Map<BusinessEventNotificationConstants.BUSINESS_ENTITY, Object> businessEventEntity) {
+    private abstract class SmsBusinessEventAdapter implements BusinessEventListner {
 
-        }
+		@Override
+		public void businessEventToBeExecuted(Map<BUSINESS_ENTITY, Object> businessEventEntity) {
+			//Nothing to do
+		}
+    }
+    
+    private class SendSmsOnLoanApproved extends SmsBusinessEventAdapter{
 
         @Override
         public void businessEventWasExecuted(Map<BusinessEventNotificationConstants.BUSINESS_ENTITY, Object> businessEventEntity) {
@@ -413,12 +395,7 @@ public class SmsCampaignDomainServiceImpl implements SmsCampaignDomainService {
         }
     }
 
-    private class SendSmsOnLoanRejected implements BusinessEventListner{
-
-        @Override
-        public void businessEventToBeExecuted(Map<BusinessEventNotificationConstants.BUSINESS_ENTITY, Object> businessEventEntity) {
-
-        }
+    private class SendSmsOnLoanRejected extends SmsBusinessEventAdapter{
 
         @Override
         public void businessEventWasExecuted(Map<BusinessEventNotificationConstants.BUSINESS_ENTITY, Object> businessEventEntity) {
@@ -430,12 +407,7 @@ public class SmsCampaignDomainServiceImpl implements SmsCampaignDomainService {
         }
     }
 
-    private class SendSmsOnLoanRepayment implements BusinessEventListner{
-
-        @Override
-        public void businessEventToBeExecuted(Map<BusinessEventNotificationConstants.BUSINESS_ENTITY, Object> businessEventEntity) {
-
-        }
+    private class SendSmsOnLoanRepayment extends SmsBusinessEventAdapter{
 
         @Override
         public void businessEventWasExecuted(Map<BusinessEventNotificationConstants.BUSINESS_ENTITY, Object> businessEventEntity) {
@@ -447,12 +419,7 @@ public class SmsCampaignDomainServiceImpl implements SmsCampaignDomainService {
         }
     }
     
-    private class ClientActivatedListener implements BusinessEventListner {
-
-		@Override
-		public void businessEventToBeExecuted(Map<BUSINESS_ENTITY, Object> businessEventEntity) {
-			
-		}
+    private class ClientActivatedListener extends SmsBusinessEventAdapter {
 
 		@Override
 		public void businessEventWasExecuted(Map<BUSINESS_ENTITY, Object> businessEventEntity) {
@@ -463,12 +430,7 @@ public class SmsCampaignDomainServiceImpl implements SmsCampaignDomainService {
 		}
     }
     
-    private class ClientRejectedListener implements BusinessEventListner {
-
-		@Override
-		public void businessEventToBeExecuted(Map<BUSINESS_ENTITY, Object> businessEventEntity) {
-			
-		}
+    private class ClientRejectedListener extends SmsBusinessEventAdapter {
 
 		@Override
 		public void businessEventWasExecuted(Map<BUSINESS_ENTITY, Object> businessEventEntity) {
@@ -480,12 +442,7 @@ public class SmsCampaignDomainServiceImpl implements SmsCampaignDomainService {
 		}
     }
     
-    private class SavingsAccountActivatedListener implements BusinessEventListner {
-
-		@Override
-		public void businessEventToBeExecuted(Map<BUSINESS_ENTITY, Object> businessEventEntity) {
-			
-		}
+    private class SavingsAccountActivatedListener extends SmsBusinessEventAdapter{
 
 		@Override
 		public void businessEventWasExecuted(Map<BUSINESS_ENTITY, Object> businessEventEntity) {
@@ -497,12 +454,7 @@ public class SmsCampaignDomainServiceImpl implements SmsCampaignDomainService {
 		}
     }
     
-    private class SavingsAccountRejectedListener implements BusinessEventListner {
-
-		@Override
-		public void businessEventToBeExecuted(Map<BUSINESS_ENTITY, Object> businessEventEntity) {
-			
-		}
+    private class SavingsAccountRejectedListener extends SmsBusinessEventAdapter {
 
 		@Override
 		public void businessEventWasExecuted(Map<BUSINESS_ENTITY, Object> businessEventEntity) {
@@ -513,18 +465,13 @@ public class SmsCampaignDomainServiceImpl implements SmsCampaignDomainService {
 		}
     }
     
-    private class SavingsAccountTransactionListener implements BusinessEventListner {
+    private class SavingsAccountTransactionListener extends SmsBusinessEventAdapter {
 
     	final boolean isDeposit ;
     	
     	public SavingsAccountTransactionListener(final boolean isDeposit) {
 			this.isDeposit = isDeposit ;
 		}
-		@Override
-		public void businessEventToBeExecuted(Map<BUSINESS_ENTITY, Object> businessEventEntity) {
-			// TODO Auto-generated method stub
-			
-		}
 
 		@Override
 		public void businessEventWasExecuted(Map<BUSINESS_ENTITY, Object> businessEventEntity) {
@@ -534,4 +481,19 @@ public class SmsCampaignDomainServiceImpl implements SmsCampaignDomainService {
 			}
 		}
     }
+    
+    /*private abstract class Task implements Runnable {
+    	
+    	protected final FineractPlatformTenant tenant;
+    	
+    	protected final String reportName ;
+    	
+    	private final Object entity ;
+    	
+    	public Task(final FineractPlatformTenant tenant, final String reportName, final Object entity) {
+            this.tenant = tenant;
+            this.reportName = reportName ;
+            this.entity = entity ;
+    	}
+    }*/
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/2d1f6ab3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDropdownReadPlatformService.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDropdownReadPlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDropdownReadPlatformService.java
index bb9814c..2da3a59 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDropdownReadPlatformService.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDropdownReadPlatformService.java
@@ -21,7 +21,6 @@ package org.apache.fineract.infrastructure.campaigns.sms.service;
 import java.util.Collection;
 
 import org.apache.fineract.infrastructure.campaigns.sms.data.SmsProviderData;
-import org.apache.fineract.infrastructure.campaigns.sms.data.TriggerTypeWithSubTypesData;
 import org.apache.fineract.infrastructure.core.data.EnumOptionData;
 
 public interface SmsCampaignDropdownReadPlatformService {
@@ -38,6 +37,4 @@ public interface SmsCampaignDropdownReadPlatformService {
 
     Collection<EnumOptionData> retrivePeriodFrequencyTypes();
 
-    Collection<TriggerTypeWithSubTypesData> getTriggerTypeAndSubTypes();
-    
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/2d1f6ab3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDropdownReadPlatformServiceImpl.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDropdownReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDropdownReadPlatformServiceImpl.java
index 44c92b9..d974d7a 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDropdownReadPlatformServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignDropdownReadPlatformServiceImpl.java
@@ -27,12 +27,9 @@ import java.util.Map;
 
 import org.apache.fineract.infrastructure.campaigns.constants.CampaignType;
 import org.apache.fineract.infrastructure.campaigns.helper.SmsConfigUtils;
-import org.apache.fineract.infrastructure.campaigns.sms.constants.SmsCampaignConstants;
 import org.apache.fineract.infrastructure.campaigns.sms.constants.SmsCampaignEnumerations;
 import org.apache.fineract.infrastructure.campaigns.sms.constants.SmsCampaignTriggerType;
-import org.apache.fineract.infrastructure.campaigns.sms.data.CampaignTriggerWithSubTypes;
 import org.apache.fineract.infrastructure.campaigns.sms.data.SmsProviderData;
-import org.apache.fineract.infrastructure.campaigns.sms.data.TriggerTypeWithSubTypesData;
 import org.apache.fineract.infrastructure.campaigns.sms.exception.ConnectionFailureException;
 import org.apache.fineract.infrastructure.core.data.EnumOptionData;
 import org.apache.fineract.portfolio.calendar.domain.CalendarWeekDaysType;
@@ -74,19 +71,20 @@ public class SmsCampaignDropdownReadPlatformServiceImpl implements SmsCampaignDr
     @Override
     public Collection<SmsProviderData> retrieveSmsProviders() {
         Collection<SmsProviderData> smsProviderOptions = new ArrayList<>();
+        String hostName = "" ;
         try {
             Map<String, Object> hostConfig = this.smsConfigUtils.getMessageGateWayRequestURI("smsbridges", null);
             URI uri = (URI) hostConfig.get("uri");
+            hostName = uri.getHost() ;
             HttpEntity<?> entity = (HttpEntity<?>) hostConfig.get("entity");
             ResponseEntity<Collection<SmsProviderData>> responseOne = restTemplate.exchange(uri, HttpMethod.GET, entity,
                     new ParameterizedTypeReference<Collection<SmsProviderData>>() {});
             smsProviderOptions = responseOne.getBody();
             if (!responseOne.getStatusCode().equals(HttpStatus.OK)) {
-                System.out.println(responseOne.getStatusCode().name());
-                throw new ConnectionFailureException(SmsCampaignConstants.SMS_BRIDGE);
+                throw new ConnectionFailureException(hostName);
             }
         } catch (Exception e) {
-            e.getStackTrace();
+        	 throw new ConnectionFailureException(hostName);
         }
         return smsProviderOptions;
     }
@@ -117,9 +115,4 @@ public class SmsCampaignDropdownReadPlatformServiceImpl implements SmsCampaignDr
                 .calendarPeriodFrequencyTypes(PeriodFrequencyType.values());
         return periodFrequencyTypes;
     }
-
-    @Override
-    public Collection<TriggerTypeWithSubTypesData> getTriggerTypeAndSubTypes() {
-        return CampaignTriggerWithSubTypes.getTriggerTypeAndSubTypes();
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/2d1f6ab3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignWritePlatformServiceJpaImpl.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignWritePlatformServiceJpaImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignWritePlatformServiceJpaImpl.java
index c4d47e8..477b534 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignWritePlatformServiceJpaImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignWritePlatformServiceJpaImpl.java
@@ -234,8 +234,7 @@ public class SmsCampaignWritePlatformServiceJpaImpl implements SmsCampaignWriteP
                 }
             }
         } catch (final IOException e) {
-            // TODO throw something here
-            System.out.println(e.getMessage());
+        	logger.error(e.getMessage());
         }
 
     }
@@ -291,9 +290,9 @@ public class SmsCampaignWritePlatformServiceJpaImpl implements SmsCampaignWriteP
                 }
             }
         } catch (final IOException e) {
-            System.out.println("IOException: " + e.getMessage());
+        	logger.error(e.getMessage()) ;
         } catch (final RuntimeException e) {
-            System.out.println("RuntimeException: " + e.getMessage());
+        	logger.error(e.getMessage()) ;
         }
     }
 
@@ -332,9 +331,9 @@ public class SmsCampaignWritePlatformServiceJpaImpl implements SmsCampaignWriteP
 				}
 			}
         } catch (final IOException e) {
-            System.out.println("IOException: " + e.getMessage());
+        	logger.error(e.getMessage()) ;
         } catch (final RuntimeException e) {
-            System.out.println("RuntimeException: " + e.getMessage());
+        	logger.error(e.getMessage()) ;
         }
     }
     
@@ -372,9 +371,9 @@ public class SmsCampaignWritePlatformServiceJpaImpl implements SmsCampaignWriteP
 				}
 			}
         } catch (final IOException e) {
-            System.out.println("IOException: " + e.getMessage());
+        	logger.error(e.getMessage()) ;
         } catch (final RuntimeException e) {
-            System.out.println("RuntimeException: " + e.getMessage());
+        	logger.error(e.getMessage()) ;
         }
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-fineract/blob/2d1f6ab3/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobServiceImpl.java
----------------------------------------------------------------------
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobServiceImpl.java
index 3e23a10..4b34f41 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobServiceImpl.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/scheduler/SmsMessageScheduledJobServiceImpl.java
@@ -173,7 +173,7 @@ public class SmsMessageScheduledJobServiceImpl implements SmsMessageScheduledJob
         if (responseOne != null) {
 //            String smsResponse = responseOne.getBody();
             if (!responseOne.getStatusCode().equals(HttpStatus.ACCEPTED)) {
-                System.out.println(responseOne.getStatusCode().name());
+            	logger.debug(responseOne.getStatusCode().name());
                 throw new ConnectionFailureException(SmsCampaignConstants.SMS);
             }
         }