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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 191a35a940 FINERACT-2169: SMS API refactoring and clean up;
191a35a940 is described below

commit 191a35a940a600369c50d733f62b3098110a0940
Author: viktorpavlenko <[email protected]>
AuthorDate: Mon Feb 17 10:01:27 2025 +0200

    FINERACT-2169: SMS API refactoring and clean up;
---
 .../infrastructure/core/api/DateParam.java         |   3 +
 .../campaigns/helper/SmsConfigUtils.java           |  15 +-
 .../campaigns/sms/api/SmsCampaignApiResource.java  | 113 +++++------
 .../campaigns/sms/constants/SmsCampaignStatus.java |  42 +---
 .../sms/constants/SmsCampaignTriggerType.java      |  58 ++----
 .../campaigns/sms/data/CampaignPreviewData.java    |  18 +-
 .../sms/data/MessageGatewayConfigurationData.java  |  61 +-----
 .../campaigns/sms/data/SmsBusinessRulesData.java   |  49 +----
 .../campaigns/sms/data/SmsCampaignData.java        | 150 ++-------------
 .../campaigns/sms/data/SmsCampaignTimeLine.java    |  21 +-
 .../campaigns/sms/data/SmsProviderData.java        |  49 +----
 .../SmsCampaignCreationDto.java}                   |  31 ++-
 .../campaigns/sms/data/dto/SmsCampaignDto.java     |  49 +++++
 .../sms/data/dto/SmsCampaignHandlerDto.java        |  48 +++++
 .../SmsCampaignParamReq.java}                      |  32 ++--
 .../SmsCampaignPreviewDto.java}                    |  23 +--
 .../SmsCampaignUpdateDto.java}                     |  28 ++-
 .../campaigns/sms/domain/SmsCampaign.java          |  27 ++-
 .../sms/domain/SmsCampaignStatusEnumerations.java  |  35 ++--
 .../handler/ActivateSmsCampaignCommandHandler.java |  10 +-
 .../handler/CloseSmsCampaignCommandHandler.java    |   8 +-
 .../handler/CreateSmsCampaignCommandHandler.java   |  10 +-
 .../handler/DeleteSmsCampaignCommandHandler.java   |   8 +-
 .../ReactivateSmsCampaignCommandHandler.java       |   8 +-
 .../handler/UpdateSmsCampaignCommandHandler.java   |  10 +-
 .../campaigns/sms/mapper/BusinessRuleMapper.java   | 103 ++++++++++
 .../campaigns/sms/mapper/SmsCampaignMapper.java    | 118 ++++++++++++
 .../sms/service/SmsCampaignDomainServiceImpl.java  |  20 +-
 .../service/SmsCampaignReadPlatformService.java    |   4 -
 .../SmsCampaignReadPlatformServiceImpl.java        | 211 ++-------------------
 .../SmsCampaignWritePlatformServiceJpaImpl.java    |  10 +-
 .../hooks/processor/data/SmsProviderData.java      |  52 +----
 .../infrastructure/sms/api/SmsApiResource.java     |  90 ++++-----
 .../data/request/SmsCreationRequest.java}          |  23 +--
 .../data/request/SmsUpdateRequest.java}            |  23 +--
 .../param/SmsRequestParam.java}                    |  22 +--
 .../sms/service/SmsReadPlatformService.java        |  11 +-
 .../sms/service/SmsReadPlatformServiceImpl.java    |  31 +--
 38 files changed, 617 insertions(+), 1007 deletions(-)

diff --git 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/DateParam.java
 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/DateParam.java
index fcf183388e..1fd8f1845e 100755
--- 
a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/DateParam.java
+++ 
b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/api/DateParam.java
@@ -28,6 +28,9 @@ import 
org.apache.fineract.infrastructure.core.serialization.JsonParserHelper;
  */
 public class DateParam {
 
+    public static final String FROM_DATE_PARAM = "fromDate";
+    public static final String TO_DATE_PARAM = "toDate";
+
     private final String dateAsString;
 
     public DateParam(final String dateStr) {
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/helper/SmsConfigUtils.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/helper/SmsConfigUtils.java
index a566998ee9..beab7ca0c2 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/helper/SmsConfigUtils.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/helper/SmsConfigUtils.java
@@ -48,18 +48,17 @@ public class SmsConfigUtils {
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_JSON);
         headers.add(SmsCampaignConstants.FINERACT_PLATFORM_TENANT_ID, 
tenant.getTenantIdentifier());
-        headers.add(SmsCampaignConstants.FINERACT_TENANT_APP_KEY, 
messageGatewayConfigurationData.getTenantAppKey());
+        headers.add(SmsCampaignConstants.FINERACT_TENANT_APP_KEY, 
messageGatewayConfigurationData.tenantAppKey());
         StringBuilder pathBuilder = new StringBuilder();
-        String endPoint = messageGatewayConfigurationData.getEndPoint() == 
null || messageGatewayConfigurationData.getEndPoint().equals("/")
-                ? ""
-                : messageGatewayConfigurationData.getEndPoint();
-        pathBuilder = messageGatewayConfigurationData.getEndPoint() == null || 
messageGatewayConfigurationData.getEndPoint().equals("/")
+        String endPoint = messageGatewayConfigurationData.endPoint() == null 
|| messageGatewayConfigurationData.endPoint().equals("/") ? ""
+                : messageGatewayConfigurationData.endPoint();
+        pathBuilder = messageGatewayConfigurationData.endPoint() == null || 
messageGatewayConfigurationData.endPoint().equals("/")
                 ? pathBuilder.append("{apiEndPoint}")
                 : pathBuilder.append("{endPoint}/{apiEndPoint}");
         // pathBuilder.append("{endPoint}/{apiEndPoint}") ;
-        UriBuilder builder = 
UriBuilder.fromPath(pathBuilder.toString()).host(messageGatewayConfigurationData.getHostName()).scheme("http")
-                .port(messageGatewayConfigurationData.getPortNumber());
-        URI uri = messageGatewayConfigurationData.getEndPoint() == null || 
messageGatewayConfigurationData.getEndPoint().equals("/")
+        UriBuilder builder = 
UriBuilder.fromPath(pathBuilder.toString()).host(messageGatewayConfigurationData.hostName()).scheme("http")
+                .port(messageGatewayConfigurationData.portNumber());
+        URI uri = messageGatewayConfigurationData.endPoint() == null || 
messageGatewayConfigurationData.endPoint().equals("/")
                 ? builder.build(apiEndPoint)
                 : builder.build(endPoint, apiEndPoint);
         HttpEntity<?> entity = null;
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/api/SmsCampaignApiResource.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/api/SmsCampaignApiResource.java
index 1faf38a0c7..33f6a24f3c 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/api/SmsCampaignApiResource.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/api/SmsCampaignApiResource.java
@@ -18,6 +18,10 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.api;
 
+import static 
org.apache.fineract.infrastructure.campaigns.sms.data.dto.SmsCampaignHandlerDto.ACTIVATE_COMMAND;
+import static 
org.apache.fineract.infrastructure.campaigns.sms.data.dto.SmsCampaignHandlerDto.CLOSE_COMMAND;
+import static 
org.apache.fineract.infrastructure.campaigns.sms.data.dto.SmsCampaignHandlerDto.REACTIVATE_COMMAND;
+
 import com.google.gson.JsonElement;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -34,10 +38,7 @@ import jakarta.ws.rs.Path;
 import jakarta.ws.rs.PathParam;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.QueryParam;
-import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.UriInfo;
-import java.util.HashSet;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.fineract.commands.domain.CommandWrapper;
@@ -47,18 +48,19 @@ import 
org.apache.fineract.infrastructure.campaigns.constants.CampaignType;
 import 
org.apache.fineract.infrastructure.campaigns.sms.constants.SmsCampaignConstants;
 import 
org.apache.fineract.infrastructure.campaigns.sms.data.CampaignPreviewData;
 import org.apache.fineract.infrastructure.campaigns.sms.data.SmsCampaignData;
+import 
org.apache.fineract.infrastructure.campaigns.sms.data.dto.SmsCampaignCreationDto;
+import 
org.apache.fineract.infrastructure.campaigns.sms.data.dto.SmsCampaignHandlerDto;
+import 
org.apache.fineract.infrastructure.campaigns.sms.data.dto.SmsCampaignPreviewDto;
+import 
org.apache.fineract.infrastructure.campaigns.sms.data.dto.SmsCampaignUpdateDto;
 import 
org.apache.fineract.infrastructure.campaigns.sms.service.SmsCampaignReadPlatformService;
 import 
org.apache.fineract.infrastructure.campaigns.sms.service.SmsCampaignWritePlatformService;
-import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
 import org.apache.fineract.infrastructure.core.api.JsonQuery;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
-import 
org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
 import 
org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
 import org.apache.fineract.infrastructure.core.serialization.FromJsonHelper;
 import org.apache.fineract.infrastructure.core.service.Page;
 import org.apache.fineract.infrastructure.core.service.SearchParameters;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
-import org.apache.fineract.infrastructure.security.service.SqlValidator;
 import org.springframework.stereotype.Component;
 
 @Path("/v1/smscampaigns")
@@ -68,14 +70,11 @@ public class SmsCampaignApiResource {
 
     private final PlatformSecurityContext platformSecurityContext;
     private final PortfolioCommandSourceWritePlatformService 
commandsSourceWritePlatformService;
-    private final DefaultToApiJsonSerializer<SmsCampaignData> 
toApiJsonSerializer;
     private final SmsCampaignReadPlatformService 
smsCampaignReadPlatformService;
-    private final ApiRequestParameterHelper apiRequestParameterHelper;
     private final FromJsonHelper fromJsonHelper;
-    private final DefaultToApiJsonSerializer<CampaignPreviewData> 
previewCampaignMessageDefaultToApiJsonSerializer;
     private final SmsCampaignWritePlatformService 
smsCampaignWritePlatformService;
     private final PlatformSecurityContext context;
-    private final SqlValidator sqlValidator;
+    private final DefaultToApiJsonSerializer<String> toApiJsonSerializer;
 
     private static final String RESOURCE_NAME_FOR_PERMISSIONS = "SMS_CAMPAIGN";
 
@@ -92,11 +91,9 @@ public class SmsCampaignApiResource {
 
             smscampaigns/template""")
     @ApiResponse(responseCode = "200", description = "OK", content = 
@Content(schema = @Schema(implementation = SmsCampaignData.class)))
-    public String template(@Context final UriInfo uriInfo) {
+    public SmsCampaignData template() {
         
platformSecurityContext.authenticatedUser().validateHasReadPermission(SmsCampaignConstants.RESOURCE_NAME);
-        final SmsCampaignData smsCampaignData = 
smsCampaignReadPlatformService.retrieveTemplate(CampaignType.SMS.name());
-        final ApiRequestJsonSerializationSettings settings = 
apiRequestParameterHelper.process(uriInfo.getQueryParameters());
-        return toApiJsonSerializer.serialize(settings, smsCampaignData);
+        return 
smsCampaignReadPlatformService.retrieveTemplate(CampaignType.SMS.name());
     }
 
     @POST
@@ -110,11 +107,11 @@ public class SmsCampaignApiResource {
             paramValue in json format""")
     @RequestBody(required = true, content = @Content(schema = 
@Schema(implementation = CommandWrapper.class)))
     @ApiResponse(responseCode = "200", description = "OK", content = 
@Content(schema = @Schema(implementation = CommandProcessingResult.class)))
-    public String createCampaign(@Parameter(hidden = true) final String 
apiRequestBodyAsJson) {
+    public CommandProcessingResult createCampaign(@Parameter(hidden = true) 
final SmsCampaignCreationDto smsCampaignCreationDto) {
         platformSecurityContext.authenticatedUser();
-        final CommandWrapper commandRequest = new 
CommandWrapperBuilder().createSmsCampaign().withJson(apiRequestBodyAsJson).build();
-        final CommandProcessingResult result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
-        return toApiJsonSerializer.serialize(result);
+        final CommandWrapper commandRequest = new 
CommandWrapperBuilder().createSmsCampaign()
+                
.withJson(toApiJsonSerializer.serialize(smsCampaignCreationDto)).build();
+        return 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
     }
 
     @GET
@@ -126,12 +123,9 @@ public class SmsCampaignApiResource {
             smscampaigns/1
             """)
     @ApiResponse(responseCode = "200", description = "OK", content = 
@Content(schema = @Schema(implementation = SmsCampaignData.class)))
-    public String retrieveCampaign(@PathParam("resourceId") final Long 
resourceId, @Context final UriInfo uriInfo) {
+    public SmsCampaignData retrieveCampaign(@PathParam("resourceId") final 
Long resourceId) {
         
platformSecurityContext.authenticatedUser().validateHasReadPermission(SmsCampaignConstants.RESOURCE_NAME);
-        SmsCampaignData smsCampaignData = 
smsCampaignReadPlatformService.retrieveOne(resourceId);
-        final ApiRequestJsonSerializationSettings settings = 
apiRequestParameterHelper.process(uriInfo.getQueryParameters());
-        return toApiJsonSerializer.serialize(settings, smsCampaignData);
-
+        return smsCampaignReadPlatformService.retrieveOne(resourceId);
     }
 
     @GET
@@ -141,16 +135,12 @@ public class SmsCampaignApiResource {
 
             smscampaigns""")
     @ApiResponse(responseCode = "200", description = "OK", content = 
@Content(schema = @Schema(implementation = SmsCampaignData.class)))
-    public String retrieveAllEmails(@QueryParam("offset") final Integer 
offset, @QueryParam("limit") final Integer limit,
-            @QueryParam("orderBy") final String orderBy, 
@QueryParam("sortOrder") final String sortOrder, @Context final UriInfo 
uriInfo) {
+    public Page<SmsCampaignData> retrieveAllEmails(@QueryParam("offset") final 
Integer offset, @QueryParam("limit") final Integer limit,
+            @QueryParam("orderBy") final String orderBy, 
@QueryParam("sortOrder") final String sortOrder) {
         
platformSecurityContext.authenticatedUser().validateHasReadPermission(SmsCampaignConstants.RESOURCE_NAME);
-        sqlValidator.validate(orderBy);
-        sqlValidator.validate(sortOrder);
         final SearchParameters searchParameters = 
SearchParameters.builder().limit(limit).offset(offset).orderBy(orderBy)
                 .sortOrder(sortOrder).build();
-        Page<SmsCampaignData> smsCampaignDataCollection = 
smsCampaignReadPlatformService.retrieveAll(searchParameters);
-        final ApiRequestJsonSerializationSettings settings = 
apiRequestParameterHelper.process(uriInfo.getQueryParameters());
-        return toApiJsonSerializer.serialize(settings, 
smsCampaignDataCollection);
+        return smsCampaignReadPlatformService.retrieveAll(searchParameters);
     }
 
     @PUT
@@ -160,12 +150,11 @@ public class SmsCampaignApiResource {
     @Operation(summary = "Update a Campaign")
     @RequestBody(required = true, content = @Content(schema = 
@Schema(implementation = CommandWrapper.class)))
     @ApiResponse(responseCode = "200", description = "OK", content = 
@Content(schema = @Schema(implementation = CommandProcessingResult.class)))
-    public String updateCampaign(@PathParam("campaignId") final Long 
campaignId,
-            @Parameter(hidden = true) final String apiRequestBodyAsJson) {
-        final CommandWrapper commandRequest = new 
CommandWrapperBuilder().updateSmsCampaign(campaignId).withJson(apiRequestBodyAsJson)
-                .build();
-        final CommandProcessingResult result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
-        return toApiJsonSerializer.serialize(result);
+    public CommandProcessingResult updateCampaign(@PathParam("campaignId") 
final Long campaignId,
+            @Parameter(hidden = true) final SmsCampaignUpdateDto 
smsCampaignUpdateDto) {
+        final CommandWrapper commandRequest = new 
CommandWrapperBuilder().updateSmsCampaign(campaignId)
+                
.withJson(toApiJsonSerializer.serialize(smsCampaignUpdateDto)).build();
+        return 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
     }
 
     @POST
@@ -174,51 +163,43 @@ public class SmsCampaignApiResource {
     @Produces({ MediaType.APPLICATION_JSON })
     @Operation(summary = "SMS Campaign", description = "Activates | 
Deactivates | Reactivates")
     @ApiResponse(responseCode = "200", description = "OK", content = 
@Content(schema = @Schema(implementation = CommandProcessingResult.class)))
-    public String handleCommands(@PathParam("campaignId") final Long 
campaignId, @QueryParam("command") final String commandParam,
-            @Parameter(hidden = true) final String apiRequestBodyAsJson) {
-        final CommandWrapperBuilder builder = new 
CommandWrapperBuilder().withJson(apiRequestBodyAsJson);
-        CommandProcessingResult result = null;
-        CommandWrapper commandRequest;
-        if (is(commandParam, "activate")) {
-            commandRequest = builder.activateSmsCampaign(campaignId).build();
-            result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
-        } else if (is(commandParam, "close")) {
-            commandRequest = builder.closeSmsCampaign(campaignId).build();
-            result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
-        } else if (is(commandParam, "reactivate")) {
-            commandRequest = builder.reactivateSmsCampaign(campaignId).build();
-            result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
-        }
-        return toApiJsonSerializer.serialize(result);
+    public CommandProcessingResult handleCommands(@PathParam("campaignId") 
final Long campaignId,
+            @QueryParam("command") final String commandParam, 
@Parameter(hidden = true) SmsCampaignHandlerDto campaignHandlerDto) {
+        final CommandWrapperBuilder builder = new 
CommandWrapperBuilder().withJson(toApiJsonSerializer.serialize(campaignHandlerDto));
+        return getCommandProcessingResult(commandParam, builder, campaignId);
     }
 
     @POST
     @Path("preview")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String preview(final String apiRequestBodyAsJson, @Context final 
UriInfo uriInfo) {
+    public CampaignPreviewData preview(SmsCampaignPreviewDto previewDto) {
         
context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
-
-        CampaignPreviewData campaignMessage;
-        final JsonElement parsedQuery = 
fromJsonHelper.parse(apiRequestBodyAsJson);
-        final JsonQuery query = JsonQuery.from(apiRequestBodyAsJson, 
parsedQuery, fromJsonHelper);
-        campaignMessage = 
smsCampaignWritePlatformService.previewMessage(query);
-        final ApiRequestJsonSerializationSettings settings = 
apiRequestParameterHelper.process(uriInfo.getQueryParameters());
-        return 
previewCampaignMessageDefaultToApiJsonSerializer.serialize(settings, 
campaignMessage, new HashSet<>());
-
+        final String strPreviewDtoJson = 
toApiJsonSerializer.serialize(previewDto);
+        final JsonElement parsedQuery = 
fromJsonHelper.parse(strPreviewDtoJson);
+        final JsonQuery query = JsonQuery.from(strPreviewDtoJson, parsedQuery, 
fromJsonHelper);
+        return smsCampaignWritePlatformService.previewMessage(query);
     }
 
     @DELETE
     @Path("{campaignId}")
     @Operation(summary = "Delete a SMS Campaign", description = "Note: Only 
closed SMS Campaigns can be deleted")
     @ApiResponse(responseCode = "200", description = "OK", content = 
@Content(schema = @Schema(implementation = CommandProcessingResult.class)))
-    public String delete(@PathParam("campaignId") final Long campaignId) {
+    public CommandProcessingResult delete(@PathParam("campaignId") final Long 
campaignId) {
         final CommandWrapper commandRequest = new 
CommandWrapperBuilder().deleteSmsCampaign(campaignId).build();
-        final CommandProcessingResult result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
-        return toApiJsonSerializer.serialize(result);
+        return 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
     }
 
-    private boolean is(final String commandParam, final String commandValue) {
-        return StringUtils.isNotBlank(commandParam) && 
commandParam.trim().equalsIgnoreCase(commandValue);
+    private CommandProcessingResult getCommandProcessingResult(String 
commandParam, CommandWrapperBuilder builder, Long campaignId) {
+        if (StringUtils.isBlank(commandParam)) {
+            return null;
+        }
+        return switch (commandParam.trim().toLowerCase()) {
+            case ACTIVATE_COMMAND -> 
commandsSourceWritePlatformService.logCommandSource(builder.activateSmsCampaign(campaignId).build());
+            case CLOSE_COMMAND -> 
commandsSourceWritePlatformService.logCommandSource(builder.closeSmsCampaign(campaignId).build());
+            case REACTIVATE_COMMAND ->
+                
commandsSourceWritePlatformService.logCommandSource(builder.reactivateSmsCampaign(campaignId).build());
+            default -> null;
+        };
     }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignStatus.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignStatus.java
index 5f02b2a8b9..64231c9190 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignStatus.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignStatus.java
@@ -18,6 +18,9 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.constants;
 
+import lombok.Getter;
+
+@Getter
 public enum SmsCampaignStatus {
 
     INVALID(-1, "smsCampaignStatus.invalid"), //
@@ -34,38 +37,11 @@ public enum SmsCampaignStatus {
     }
 
     public static SmsCampaignStatus fromInt(final Integer statusValue) {
-        switch (statusValue) {
-            case 100:
-                return PENDING;
-            case 300:
-                return ACTIVE;
-            case 600:
-                return CLOSED;
-            default:
-                return INVALID;
-        }
-    }
-
-    public Integer getValue() {
-        return value;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
-    // TODO: why not just use the enum values... just more boilerplate code 
here!!
-    public boolean isActive() {
-        return this.equals(ACTIVE);
-    }
-
-    // TODO: why not just use the enum values... just more boilerplate code 
here!!
-    public boolean isPending() {
-        return this.equals(PENDING);
-    }
-
-    // TODO: why not just use the enum values... just more boilerplate code 
here!!
-    public boolean isClosed() {
-        return this.equals(CLOSED);
+        return switch (statusValue) {
+            case 100 -> PENDING;
+            case 300 -> ACTIVE;
+            case 600 -> CLOSED;
+            default -> INVALID;
+        };
     }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignTriggerType.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignTriggerType.java
index 7f4cdef79f..580bcfc566 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignTriggerType.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/constants/SmsCampaignTriggerType.java
@@ -18,8 +18,10 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.constants;
 
+import lombok.Getter;
 import org.apache.fineract.infrastructure.core.data.EnumOptionData;
 
+@Getter
 public enum SmsCampaignTriggerType {
 
     INVALID(-1, "triggerType.invalid"), DIRECT(1, "triggerType.direct"), 
SCHEDULE(2, "triggerType.schedule"), TRIGGERED(3,
@@ -33,29 +35,17 @@ public enum SmsCampaignTriggerType {
         this.code = code;
     }
 
-    public Integer getValue() {
-        return value;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
     public static SmsCampaignTriggerType fromInt(final Integer v) {
         if (v == null) {
             return INVALID;
         }
 
-        switch (v) {
-            case 1:
-                return DIRECT;
-            case 2:
-                return SCHEDULE;
-            case 3:
-                return TRIGGERED;
-            default:
-                return INVALID;
-        }
+        return switch (v) {
+            case 1 -> DIRECT;
+            case 2 -> SCHEDULE;
+            case 3 -> TRIGGERED;
+            default -> INVALID;
+        };
     }
 
     public static EnumOptionData triggerType(final Integer triggerTypeId) {
@@ -63,32 +53,12 @@ public enum SmsCampaignTriggerType {
     }
 
     public static EnumOptionData triggerType(final SmsCampaignTriggerType 
triggerType) {
-        switch (triggerType) {
-            case INVALID:
-                return new EnumOptionData(INVALID.getValue().longValue(), 
INVALID.getCode(), "Invalid");
-            case DIRECT:
-                return new EnumOptionData(DIRECT.getValue().longValue(), 
DIRECT.getCode(), "Direct");
-            case SCHEDULE:
-                return new EnumOptionData(SCHEDULE.getValue().longValue(), 
SCHEDULE.getCode(), "Schedule");
-            case TRIGGERED:
-                return new EnumOptionData(TRIGGERED.getValue().longValue(), 
TRIGGERED.getCode(), "Triggered");
-            default:
-                return new EnumOptionData(INVALID.getValue().longValue(), 
INVALID.getCode(), "Invalid");
-        }
+        return switch (triggerType) {
+            case DIRECT -> new EnumOptionData(DIRECT.getValue().longValue(), 
DIRECT.getCode(), "Direct");
+            case SCHEDULE -> new 
EnumOptionData(SCHEDULE.getValue().longValue(), SCHEDULE.getCode(), "Schedule");
+            case TRIGGERED -> new 
EnumOptionData(TRIGGERED.getValue().longValue(), TRIGGERED.getCode(), 
"Triggered");
+            default -> new EnumOptionData(INVALID.getValue().longValue(), 
INVALID.getCode(), "Invalid");
+        };
     }
 
-    // TODO: why not just use the enum values... just more boilerplate code 
here!!
-    public boolean isDirect() {
-        return this.equals(DIRECT);
-    }
-
-    // TODO: why not just use the enum values... just more boilerplate code 
here!!
-    public boolean isSchedule() {
-        return this.equals(SCHEDULE);
-    }
-
-    // TODO: why not just use the enum values... just more boilerplate code 
here!!
-    public boolean isTriggered() {
-        return this.equals(TRIGGERED);
-    }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
index 73ca41f73a..d3e8e5022b 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
@@ -18,22 +18,6 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.data;
 
-public class CampaignPreviewData {
+public record CampaignPreviewData(String campaignMessage, Integer 
totalNumberOfMessages) {
 
-    private final String campaignMessage;
-
-    private final Integer totalNumberOfMessages;
-
-    public CampaignPreviewData(String campaignMessage, Integer 
totalNumberOfMessages) {
-        this.campaignMessage = campaignMessage;
-        this.totalNumberOfMessages = totalNumberOfMessages;
-    }
-
-    public String getCampaignMessage() {
-        return campaignMessage;
-    }
-
-    public Integer getTotalNumberOfMessages() {
-        return totalNumberOfMessages;
-    }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/MessageGatewayConfigurationData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/MessageGatewayConfigurationData.java
index f2222ee64e..7ebef15af8 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/MessageGatewayConfigurationData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/MessageGatewayConfigurationData.java
@@ -18,64 +18,7 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.data;
 
-public class MessageGatewayConfigurationData {
+public record MessageGatewayConfigurationData(Long id, String connectionName, 
String hostName, int portNumber, String endPoint,
+        String userName, String password, boolean sslEnabled, String 
tenantAppKey) {
 
-    private final Long id;
-    private final String connectionName;
-    private final String hostName;
-    private final int portNumber;
-    private final String endPoint;
-    private final String userName;
-    private final String password;
-    private final boolean sslEnabled;
-    private final String tenantAppKey;
-
-    public MessageGatewayConfigurationData(final Long id, final String 
connectionName, final String hostName, final int portNumber,
-            final String endPoint, final String userName, final String 
password, final boolean sslEnabled, final String tenantAppKey) {
-        this.id = id;
-        this.connectionName = connectionName;
-        this.hostName = hostName;
-        this.portNumber = portNumber;
-        this.endPoint = endPoint;
-        this.userName = userName;
-        this.password = password;
-        this.sslEnabled = sslEnabled;
-        this.tenantAppKey = tenantAppKey;
-    }
-
-    public Long getId() {
-        return this.id;
-    }
-
-    public String getConnectionName() {
-        return this.connectionName;
-    }
-
-    public String getHostName() {
-        return this.hostName;
-    }
-
-    public int getPortNumber() {
-        return this.portNumber;
-    }
-
-    public String getEndPoint() {
-        return this.endPoint;
-    }
-
-    public String getUserName() {
-        return this.userName;
-    }
-
-    public String getPassword() {
-        return this.password;
-    }
-
-    public boolean isSslEnabled() {
-        return this.sslEnabled;
-    }
-
-    public String getTenantAppKey() {
-        return this.tenantAppKey;
-    }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsBusinessRulesData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsBusinessRulesData.java
index 6b621bf948..1f6130f4ad 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsBusinessRulesData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsBusinessRulesData.java
@@ -20,59 +20,14 @@ package 
org.apache.fineract.infrastructure.campaigns.sms.data;
 
 import java.util.Map;
 
-public class SmsBusinessRulesData {
-
-    private final Long reportId;
-
-    private final String reportName;
-
-    private final String reportType;
-
-    private final String reportSubType;
-
-    private final String reportDescription;
-
-    private final Map<String, Object> reportParamName;
-
-    public SmsBusinessRulesData(final Long reportId, final String reportName, 
final String reportType, final String reportSubType,
-            final Map<String, Object> reportParamName, final String 
reportDescription) {
-        this.reportId = reportId;
-        this.reportName = reportName;
-        this.reportType = reportType;
-        this.reportSubType = reportSubType;
-        this.reportParamName = reportParamName;
-        this.reportDescription = reportDescription;
-    }
+public record SmsBusinessRulesData(Long reportId, String reportName, String 
reportType, String reportSubType,
+        Map<String, Object> reportParamName, String reportDescription) {
 
     public static SmsBusinessRulesData instance(final Long reportId, final 
String reportName, final String reportType,
             final String reportSubType, final Map<String, Object> 
reportParamName, final String reportDescription) {
         return new SmsBusinessRulesData(reportId, reportName, reportType, 
reportSubType, reportParamName, reportDescription);
     }
 
-    public Map<String, Object> getReportParamName() {
-        return reportParamName;
-    }
-
-    public String getReportType() {
-        return reportType;
-    }
-
-    public String getReportSubType() {
-        return this.reportSubType;
-    }
-
-    public String getReportName() {
-        return reportName;
-    }
-
-    public Long getReportId() {
-        return reportId;
-    }
-
-    public String getReportDescription() {
-        return reportDescription;
-    }
-
     @Override
     public boolean equals(Object o) {
         if (this == o) {
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsCampaignData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsCampaignData.java
index 813dc1291f..04e5941e2d 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsCampaignData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsCampaignData.java
@@ -21,8 +21,12 @@ package 
org.apache.fineract.infrastructure.campaigns.sms.data;
 import java.time.LocalDate;
 import java.time.ZonedDateTime;
 import java.util.Collection;
+import lombok.Builder;
+import lombok.Getter;
 import org.apache.fineract.infrastructure.core.data.EnumOptionData;
 
+@Builder
+@Getter
 @SuppressWarnings("unused")
 public final class SmsCampaignData {
 
@@ -44,82 +48,25 @@ public final class SmsCampaignData {
     private final boolean isNotification;
 
     private final Collection<SmsProviderData> smsProviderOptions;
-
     private final Collection<EnumOptionData> campaignTypeOptions;
-
     private final Collection<EnumOptionData> triggerTypeOptions;
-
     private final Collection<SmsBusinessRulesData> businessRulesOptions;
-
     private final Collection<EnumOptionData> months;
-
     private final Collection<EnumOptionData> weekDays;
-
     private final Collection<EnumOptionData> frequencyTypeOptions;
-
     private final Collection<EnumOptionData> periodFrequencyOptions;
 
-    private SmsCampaignData(final Long id, final String campaignName, final 
EnumOptionData campaignType, final EnumOptionData triggerType,
-            final Long runReportId, final String reportName, final String 
paramValue, final EnumOptionData campaignStatus,
-            final String message, final ZonedDateTime nextTriggerDate, final 
LocalDate lastTriggerDate,
-            final SmsCampaignTimeLine smsCampaignTimeLine, final ZonedDateTime 
recurrenceStartDate, final String recurrence,
-            final Long providerId, final Collection<SmsBusinessRulesData> 
businessRulesOptions,
-            final Collection<SmsProviderData> smsProviderOptions, final 
Collection<EnumOptionData> campaignTypeOptions,
-            final Collection<EnumOptionData> triggerTypeOptions, final 
Collection<EnumOptionData> months,
-            final Collection<EnumOptionData> weekDays, final 
Collection<EnumOptionData> frequencyTypeOptions,
-            final Collection<EnumOptionData> periodFrequencyOptions, final 
boolean isNotification) {
-        this.id = id;
-        this.campaignName = campaignName;
-        this.campaignType = campaignType;
-        this.triggerType = triggerType;
-        this.runReportId = runReportId;
-        this.reportName = reportName;
-        this.paramValue = paramValue;
-        this.campaignStatus = campaignStatus;
-        this.campaignMessage = message;
-        if (nextTriggerDate != null) {
-            this.nextTriggerDate = nextTriggerDate;
-        } else {
-            this.nextTriggerDate = null;
-        }
-        if (lastTriggerDate != null) {
-            this.lastTriggerDate = lastTriggerDate;
-        } else {
-            this.lastTriggerDate = null;
-        }
-        this.isNotification = isNotification;
-        this.smsCampaignTimeLine = smsCampaignTimeLine;
-        this.recurrenceStartDate = recurrenceStartDate;
-        this.recurrence = recurrence;
-        this.providerId = providerId;
-        this.businessRulesOptions = businessRulesOptions;
-        this.smsProviderOptions = smsProviderOptions;
-        this.campaignTypeOptions = campaignTypeOptions;
-        this.triggerTypeOptions = triggerTypeOptions;
-        this.months = months;
-        this.weekDays = weekDays;
-        this.frequencyTypeOptions = frequencyTypeOptions;
-        this.periodFrequencyOptions = periodFrequencyOptions;
-    }
-
     public static SmsCampaignData instance(final Long id, final String 
campaignName, final EnumOptionData campaignType,
             final EnumOptionData triggerType, final Long runReportId, final 
String reportName, final String paramValue,
             final EnumOptionData campaignStatus, final String message, final 
ZonedDateTime nextTriggerDate, final LocalDate lastTriggerDate,
             final SmsCampaignTimeLine smsCampaignTimeLine, final ZonedDateTime 
recurrenceStartDate, final String recurrence,
             final Long providerId, final boolean isNotification) {
-        final Collection<SmsBusinessRulesData> businessRulesOptions = null;
-        final Collection<SmsProviderData> smsProviderOptions = null;
-        final Collection<EnumOptionData> campaignTypeOptions = null;
-        final Collection<EnumOptionData> triggerTypeOptions = null;
-        final Collection<EnumOptionData> months = null;
-        final Collection<EnumOptionData> weekDays = null;
-        final Collection<EnumOptionData> frequencyTypeOptions = null;
-        final Collection<EnumOptionData> periodFrequencyOptions = null;
 
-        return new SmsCampaignData(id, campaignName, campaignType, 
triggerType, runReportId, reportName, paramValue, campaignStatus,
-                message, nextTriggerDate, lastTriggerDate, 
smsCampaignTimeLine, recurrenceStartDate, recurrence, providerId,
-                businessRulesOptions, smsProviderOptions, campaignTypeOptions, 
triggerTypeOptions, months, weekDays, frequencyTypeOptions,
-                periodFrequencyOptions, isNotification);
+        return 
SmsCampaignData.builder().id(id).campaignName(campaignName).campaignType(campaignType).triggerType(triggerType)
+                
.runReportId(runReportId).reportName(reportName).paramValue(paramValue).campaignStatus(campaignStatus)
+                
.campaignMessage(message).nextTriggerDate(nextTriggerDate).lastTriggerDate(lastTriggerDate)
+                
.smsCampaignTimeLine(smsCampaignTimeLine).recurrenceStartDate(recurrenceStartDate).recurrence(recurrence)
+                .providerId(providerId).isNotification(isNotification).build();
     }
 
     public static SmsCampaignData template(final Collection<SmsProviderData> 
smsProviderOptions,
@@ -127,82 +74,9 @@ public final class SmsCampaignData {
             final Collection<EnumOptionData> triggerTypeOptions, final 
Collection<EnumOptionData> months,
             final Collection<EnumOptionData> weekDays, final 
Collection<EnumOptionData> frequencyTypeOptions,
             final Collection<EnumOptionData> periodFrequencyOptions) {
-        final Long id = null;
-        final String campaignName = null;
-        final EnumOptionData campaignType = null;
-        final Long runReportId = null;
-        final String paramValue = null;
-        final EnumOptionData campaignStatus = null;
-        final String message = null;
-        final ZonedDateTime nextTriggerDate = null;
-        final LocalDate lastTriggerDate = null;
-        final SmsCampaignTimeLine smsCampaignTimeLine = null;
-        final ZonedDateTime recurrenceStartDate = null;
-        final String recurrence = null;
-        final EnumOptionData triggerType = null;
-        final String reportName = null;
-        final Long providerId = null;
-        final boolean isNotification = false;
-        return new SmsCampaignData(id, campaignName, campaignType, 
triggerType, runReportId, reportName, paramValue, campaignStatus,
-                message, nextTriggerDate, lastTriggerDate, 
smsCampaignTimeLine, recurrenceStartDate, recurrence, providerId,
-                businessRulesOptions, smsProviderOptions, campaignTypeOptions, 
triggerTypeOptions, months, weekDays, frequencyTypeOptions,
-                periodFrequencyOptions, isNotification);
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public String getCampaignName() {
-        return this.campaignName;
-    }
-
-    public EnumOptionData getCampaignType() {
-        return this.campaignType;
-    }
-
-    public Long getRunReportId() {
-        return this.runReportId;
-    }
-
-    public String getParamValue() {
-        return this.paramValue;
-    }
-
-    public EnumOptionData getCampaignStatus() {
-        return this.campaignStatus;
-    }
-
-    public String getMessage() {
-        return this.campaignMessage;
-    }
-
-    public ZonedDateTime getNextTriggerDate() {
-        return this.nextTriggerDate;
-    }
-
-    public LocalDate getLastTriggerDate() {
-        return this.lastTriggerDate;
-    }
-
-    public String getRecurrence() {
-        return this.recurrence;
-    }
-
-    public ZonedDateTime getRecurrenceStartDate() {
-        return this.recurrenceStartDate;
-    }
-
-    public String getReportName() {
-        return this.reportName;
-    }
-
-    public Long providerId() {
-        return this.providerId;
-    }
-
-    public boolean isNotification() {
-        return this.isNotification;
+        return 
SmsCampaignData.builder().smsProviderOptions(smsProviderOptions).businessRulesOptions(businessRulesOptions)
+                
.campaignTypeOptions(campaignTypeOptions).triggerTypeOptions(triggerTypeOptions).months(months).weekDays(weekDays)
+                
.frequencyTypeOptions(frequencyTypeOptions).periodFrequencyOptions(periodFrequencyOptions).build();
     }
 
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsCampaignTimeLine.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsCampaignTimeLine.java
index 9c9433d50e..586094485d 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsCampaignTimeLine.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsCampaignTimeLine.java
@@ -21,24 +21,7 @@ package 
org.apache.fineract.infrastructure.campaigns.sms.data;
 import java.time.LocalDate;
 
 @SuppressWarnings("unused")
-public class SmsCampaignTimeLine {
+public record SmsCampaignTimeLine(LocalDate submittedOnDate, String 
submittedByUsername, LocalDate activatedOnDate,
+        String activatedByUsername, LocalDate closedOnDate, String 
closedByUsername) {
 
-    private final LocalDate submittedOnDate;
-    private final String submittedByUsername;
-
-    private final LocalDate activatedOnDate;
-    private final String activatedByUsername;
-
-    private final LocalDate closedOnDate;
-    private final String closedByUsername;
-
-    public SmsCampaignTimeLine(final LocalDate submittedOnDate, final String 
submittedByUsername, final LocalDate activatedOnDate,
-            final String activatedByUsername, final LocalDate closedOnDate, 
final String closedByUsername) {
-        this.submittedOnDate = submittedOnDate;
-        this.submittedByUsername = submittedByUsername;
-        this.activatedOnDate = activatedOnDate;
-        this.activatedByUsername = activatedByUsername;
-        this.closedOnDate = closedOnDate;
-        this.closedByUsername = closedByUsername;
-    }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsProviderData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsProviderData.java
index 5cc24c7cfd..91c2b5179f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsProviderData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/SmsProviderData.java
@@ -18,55 +18,20 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.data;
 
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
 public class SmsProviderData {
 
     private Long id;
-
     private String tenantId;
-
     private String phoneNo;
-
     private String providerAppKey;
-
     private String providerName;
-
     private String providerDescription;
 
-    public SmsProviderData(final Long id, final String providerAppKey, final 
String providerName, final String providerDescription,
-            final String tenantId, final String phoneNo) {
-        this.id = id;
-        this.providerAppKey = providerAppKey;
-        this.providerName = providerName;
-        this.providerDescription = providerDescription;
-        this.tenantId = tenantId;
-        this.phoneNo = phoneNo;
-    }
-
-    public SmsProviderData() {
-
-    }
-
-    public Long getId() {
-        return this.id;
-    }
-
-    public String getProviderAppKey() {
-        return this.providerAppKey;
-    }
-
-    public String getProviderName() {
-        return this.providerName;
-    }
-
-    public String getProviderDescription() {
-        return this.providerDescription;
-    }
-
-    public String getTenantId() {
-        return this.tenantId;
-    }
-
-    public String getPhoneNo() {
-        return this.phoneNo;
-    }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignCreationDto.java
similarity index 58%
copy from 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
copy to 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignCreationDto.java
index 73ca41f73a..2ec71e3a70 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignCreationDto.java
@@ -16,24 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.infrastructure.campaigns.sms.data;
+package org.apache.fineract.infrastructure.campaigns.sms.data.dto;
 
-public class CampaignPreviewData {
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
 
-    private final String campaignMessage;
+@Getter
+@Setter
+@NoArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class SmsCampaignCreationDto extends SmsCampaignDto {
 
-    private final Integer totalNumberOfMessages;
-
-    public CampaignPreviewData(String campaignMessage, Integer 
totalNumberOfMessages) {
-        this.campaignMessage = campaignMessage;
-        this.totalNumberOfMessages = totalNumberOfMessages;
-    }
-
-    public String getCampaignMessage() {
-        return campaignMessage;
-    }
-
-    public Integer getTotalNumberOfMessages() {
-        return totalNumberOfMessages;
-    }
+    private Long providerId;
+    private String frequency;
+    private String interval;
+    private String repeatsOnDay;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignDto.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignDto.java
new file mode 100644
index 0000000000..970bd13d27
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignDto.java
@@ -0,0 +1,49 @@
+/**
+ * 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.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public abstract class SmsCampaignDto implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private String campaignName;
+    private Long campaignType;
+    private Long triggerType;
+    private Long runReportId;
+    private String message;
+    private SmsCampaignParamReq paramValue;
+    private String recurrenceStartDate;
+    private String submittedOnDate;
+    private Boolean isNotification;
+    private String locale;
+    private String dateFormat;
+    private String dateTimeFormat;
+}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignHandlerDto.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignHandlerDto.java
new file mode 100644
index 0000000000..22fc8ade4c
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignHandlerDto.java
@@ -0,0 +1,48 @@
+/**
+ * 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.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class SmsCampaignHandlerDto implements Serializable {
+
+    public static final String ACTIVATE_COMMAND = "activate";
+    public static final String CLOSE_COMMAND = "close";
+    public static final String REACTIVATE_COMMAND = "reactivate";
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private String locale;
+    private String dateFormat;
+    private String activationDate;
+    private String closureDate;
+
+}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignParamReq.java
similarity index 58%
copy from 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
copy to 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignParamReq.java
index 73ca41f73a..47ce9328f4 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignParamReq.java
@@ -16,24 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.infrastructure.campaigns.sms.data;
+package org.apache.fineract.infrastructure.campaigns.sms.data.dto;
 
-public class CampaignPreviewData {
+import java.io.Serial;
+import java.io.Serializable;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
 
-    private final String campaignMessage;
+@Getter
+@Setter
+@NoArgsConstructor
+public class SmsCampaignParamReq implements Serializable {
 
-    private final Integer totalNumberOfMessages;
+    @Serial
+    private static final long serialVersionUID = 1L;
 
-    public CampaignPreviewData(String campaignMessage, Integer 
totalNumberOfMessages) {
-        this.campaignMessage = campaignMessage;
-        this.totalNumberOfMessages = totalNumberOfMessages;
-    }
-
-    public String getCampaignMessage() {
-        return campaignMessage;
-    }
-
-    public Integer getTotalNumberOfMessages() {
-        return totalNumberOfMessages;
-    }
+    private Integer officeId;
+    private Integer loanOfficerId;
+    private Integer transactionId;
+    private String reportName;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignPreviewDto.java
similarity index 58%
copy from 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
copy to 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignPreviewDto.java
index 73ca41f73a..9fc1e21a87 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignPreviewDto.java
@@ -16,24 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.infrastructure.campaigns.sms.data;
+package org.apache.fineract.infrastructure.campaigns.sms.data.dto;
 
-public class CampaignPreviewData {
+import java.io.Serial;
+import java.io.Serializable;
 
-    private final String campaignMessage;
+public record SmsCampaignPreviewDto(SmsCampaignParamReq paramValue, String 
message) implements Serializable {
 
-    private final Integer totalNumberOfMessages;
-
-    public CampaignPreviewData(String campaignMessage, Integer 
totalNumberOfMessages) {
-        this.campaignMessage = campaignMessage;
-        this.totalNumberOfMessages = totalNumberOfMessages;
-    }
-
-    public String getCampaignMessage() {
-        return campaignMessage;
-    }
-
-    public Integer getTotalNumberOfMessages() {
-        return totalNumberOfMessages;
-    }
+    @Serial
+    private static final long serialVersionUID = 1L;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignUpdateDto.java
similarity index 58%
copy from 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
copy to 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignUpdateDto.java
index 73ca41f73a..98d19fcfcc 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/dto/SmsCampaignUpdateDto.java
@@ -16,24 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.infrastructure.campaigns.sms.data;
+package org.apache.fineract.infrastructure.campaigns.sms.data.dto;
 
-public class CampaignPreviewData {
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
 
-    private final String campaignMessage;
+@Getter
+@Setter
+@NoArgsConstructor
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class SmsCampaignUpdateDto extends SmsCampaignDto {
 
-    private final Integer totalNumberOfMessages;
-
-    public CampaignPreviewData(String campaignMessage, Integer 
totalNumberOfMessages) {
-        this.campaignMessage = campaignMessage;
-        this.totalNumberOfMessages = totalNumberOfMessages;
-    }
-
-    public String getCampaignMessage() {
-        return campaignMessage;
-    }
-
-    public Integer getTotalNumberOfMessages() {
-        return totalNumberOfMessages;
-    }
+    private String recurrence;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaign.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaign.java
index 4c472abdf4..819a525441 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaign.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaign.java
@@ -18,6 +18,13 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.domain;
 
+import static 
org.apache.fineract.infrastructure.campaigns.sms.constants.SmsCampaignStatus.ACTIVE;
+import static 
org.apache.fineract.infrastructure.campaigns.sms.constants.SmsCampaignStatus.CLOSED;
+import static 
org.apache.fineract.infrastructure.campaigns.sms.constants.SmsCampaignStatus.PENDING;
+import static 
org.apache.fineract.infrastructure.campaigns.sms.constants.SmsCampaignTriggerType.DIRECT;
+import static 
org.apache.fineract.infrastructure.campaigns.sms.constants.SmsCampaignTriggerType.SCHEDULE;
+import static 
org.apache.fineract.infrastructure.campaigns.sms.constants.SmsCampaignTriggerType.TRIGGERED;
+
 import jakarta.persistence.Column;
 import jakarta.persistence.Entity;
 import jakarta.persistence.JoinColumn;
@@ -159,7 +166,7 @@ public class SmsCampaign extends 
AbstractPersistableCustom<Long> {
         String recurrence = null;
 
         LocalDateTime recurrenceStartDate = null;
-        if 
(SmsCampaignTriggerType.fromInt(triggerType.intValue()).isSchedule()) {
+        if (SCHEDULE.getValue().equals(triggerType.intValue())) {
             final Locale locale = command.extractLocale();
             String dateTimeFormat;
             recurrenceStartDate = DateUtils.getLocalDateTimeOfTenant();
@@ -228,7 +235,7 @@ public class SmsCampaign extends 
AbstractPersistableCustom<Long> {
             actualChanges.put(SmsCampaignValidator.isNotificationParamName, 
newValue);
         }
 
-        if (SmsCampaignTriggerType.fromInt(this.triggerType).isSchedule()) {
+        if (isSchedule()) {
             final String dateFormatAsInput = command.dateFormat();
             final String dateTimeFormatAsInput = 
command.stringValueOfParameterNamed(SmsCampaignValidator.dateTimeFormat);
             final String localeAsInput = command.locale();
@@ -260,7 +267,7 @@ public class SmsCampaign extends 
AbstractPersistableCustom<Long> {
         }
         this.approvedOnDate = activationLocalDate;
         this.approvedBy = currentUser;
-        this.status = SmsCampaignStatus.ACTIVE.getValue();
+        this.status = ACTIVE.getValue();
 
         validate();
     }
@@ -301,7 +308,7 @@ public class SmsCampaign extends 
AbstractPersistableCustom<Long> {
         }
 
         this.approvedOnDate = reactivateLocalDate;
-        this.status = SmsCampaignStatus.ACTIVE.getValue();
+        this.status = ACTIVE.getValue();
         this.approvedBy = currentUser;
         this.closureDate = null;
         this.isVisible = true;
@@ -326,27 +333,27 @@ public class SmsCampaign extends 
AbstractPersistableCustom<Long> {
     }
 
     public boolean isActive() {
-        return SmsCampaignStatus.fromInt(this.status).isActive();
+        return SmsCampaignStatus.fromInt(this.status).equals(ACTIVE);
     }
 
     public boolean isPending() {
-        return SmsCampaignStatus.fromInt(this.status).isPending();
+        return SmsCampaignStatus.fromInt(this.status).equals(PENDING);
     }
 
     public boolean isClosed() {
-        return SmsCampaignStatus.fromInt(this.status).isClosed();
+        return SmsCampaignStatus.fromInt(this.status).equals(CLOSED);
     }
 
     public boolean isDirect() {
-        return SmsCampaignTriggerType.fromInt(this.triggerType).isDirect();
+        return SmsCampaignTriggerType.fromInt(this.triggerType).equals(DIRECT);
     }
 
     public boolean isSchedule() {
-        return SmsCampaignTriggerType.fromInt(this.triggerType).isSchedule();
+        return 
SmsCampaignTriggerType.fromInt(this.triggerType).equals(SCHEDULE);
     }
 
     public boolean isTriggered() {
-        return SmsCampaignTriggerType.fromInt(this.triggerType).isTriggered();
+        return 
SmsCampaignTriggerType.fromInt(this.triggerType).equals(TRIGGERED);
     }
 
     private void validate() {
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaignStatusEnumerations.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaignStatusEnumerations.java
index 3d296cb433..3e4e6f6b00 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaignStatusEnumerations.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/domain/SmsCampaignStatusEnumerations.java
@@ -32,28 +32,17 @@ public final class SmsCampaignStatusEnumerations {
     }
 
     public static EnumOptionData status(final SmsCampaignStatus status) {
-        EnumOptionData optionData = new 
EnumOptionData(SmsCampaignStatus.INVALID.getValue().longValue(),
-                SmsCampaignStatus.INVALID.getCode(), "Invalid");
-        switch (status) {
-            case INVALID:
-                optionData = new 
EnumOptionData(SmsCampaignStatus.INVALID.getValue().longValue(), 
SmsCampaignStatus.INVALID.getCode(),
-                        "Invalid");
-            break;
-            case PENDING:
-                optionData = new 
EnumOptionData(SmsCampaignStatus.PENDING.getValue().longValue(), 
SmsCampaignStatus.PENDING.getCode(),
-                        "Pending");
-            break;
-            case ACTIVE:
-                optionData = new 
EnumOptionData(SmsCampaignStatus.ACTIVE.getValue().longValue(), 
SmsCampaignStatus.ACTIVE.getCode(),
-                        "active");
-            break;
-            case CLOSED:
-                optionData = new 
EnumOptionData(SmsCampaignStatus.CLOSED.getValue().longValue(), 
SmsCampaignStatus.CLOSED.getCode(),
-                        "closed");
-            break;
-
-        }
-
-        return optionData;
+        new EnumOptionData(SmsCampaignStatus.INVALID.getValue().longValue(), 
SmsCampaignStatus.INVALID.getCode(), "Invalid");
+
+        return switch (status) {
+            case INVALID ->
+                new 
EnumOptionData(SmsCampaignStatus.INVALID.getValue().longValue(), 
SmsCampaignStatus.INVALID.getCode(), "Invalid");
+            case PENDING ->
+                new 
EnumOptionData(SmsCampaignStatus.PENDING.getValue().longValue(), 
SmsCampaignStatus.PENDING.getCode(), "Pending");
+            case ACTIVE ->
+                new 
EnumOptionData(SmsCampaignStatus.ACTIVE.getValue().longValue(), 
SmsCampaignStatus.ACTIVE.getCode(), "active");
+            case CLOSED ->
+                new 
EnumOptionData(SmsCampaignStatus.CLOSED.getValue().longValue(), 
SmsCampaignStatus.CLOSED.getCode(), "closed");
+        };
     }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/ActivateSmsCampaignCommandHandler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/ActivateSmsCampaignCommandHandler.java
index a6b56d3532..f2abaab93f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/ActivateSmsCampaignCommandHandler.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/ActivateSmsCampaignCommandHandler.java
@@ -18,25 +18,21 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.handler;
 
+import lombok.RequiredArgsConstructor;
 import org.apache.fineract.commands.annotation.CommandType;
 import org.apache.fineract.commands.handler.NewCommandSourceHandler;
 import 
org.apache.fineract.infrastructure.campaigns.sms.service.SmsCampaignWritePlatformService;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 @Service
 @CommandType(entity = "SMSCAMPAIGN", action = "ACTIVATE")
+@RequiredArgsConstructor
 public class ActivateSmsCampaignCommandHandler implements 
NewCommandSourceHandler {
 
-    private SmsCampaignWritePlatformService smsCampaignWritePlatformService;
-
-    @Autowired
-    public ActivateSmsCampaignCommandHandler(final 
SmsCampaignWritePlatformService smsCampaignWritePlatformService) {
-        this.smsCampaignWritePlatformService = smsCampaignWritePlatformService;
-    }
+    private final SmsCampaignWritePlatformService 
smsCampaignWritePlatformService;
 
     @Transactional
     @Override
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/CloseSmsCampaignCommandHandler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/CloseSmsCampaignCommandHandler.java
index 427e416d12..c26ef90e4b 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/CloseSmsCampaignCommandHandler.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/CloseSmsCampaignCommandHandler.java
@@ -18,25 +18,21 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.handler;
 
+import lombok.RequiredArgsConstructor;
 import org.apache.fineract.commands.annotation.CommandType;
 import org.apache.fineract.commands.handler.NewCommandSourceHandler;
 import 
org.apache.fineract.infrastructure.campaigns.sms.service.SmsCampaignWritePlatformService;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 @Service
 @CommandType(entity = "SMSCAMPAIGN", action = "CLOSE")
+@RequiredArgsConstructor
 public class CloseSmsCampaignCommandHandler implements NewCommandSourceHandler 
{
 
     private final SmsCampaignWritePlatformService 
smsCampaignWritePlatformService;
 
-    @Autowired
-    public CloseSmsCampaignCommandHandler(final 
SmsCampaignWritePlatformService smsCampaignWritePlatformService) {
-        this.smsCampaignWritePlatformService = smsCampaignWritePlatformService;
-    }
-
     @Override
     public CommandProcessingResult processCommand(JsonCommand command) {
         return 
this.smsCampaignWritePlatformService.closeSmsCampaign(command.entityId(), 
command);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/CreateSmsCampaignCommandHandler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/CreateSmsCampaignCommandHandler.java
index 687d9af161..aa9fd41e46 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/CreateSmsCampaignCommandHandler.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/CreateSmsCampaignCommandHandler.java
@@ -18,25 +18,21 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.handler;
 
+import lombok.RequiredArgsConstructor;
 import org.apache.fineract.commands.annotation.CommandType;
 import org.apache.fineract.commands.handler.NewCommandSourceHandler;
 import 
org.apache.fineract.infrastructure.campaigns.sms.service.SmsCampaignWritePlatformService;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 @Service
 @CommandType(entity = "SMSCAMPAIGN", action = "CREATE")
+@RequiredArgsConstructor
 public class CreateSmsCampaignCommandHandler implements 
NewCommandSourceHandler {
 
-    private SmsCampaignWritePlatformService smsCampaignWritePlatformService;
-
-    @Autowired
-    public CreateSmsCampaignCommandHandler(final 
SmsCampaignWritePlatformService smsCampaignWritePlatformService) {
-        this.smsCampaignWritePlatformService = smsCampaignWritePlatformService;
-    }
+    private final SmsCampaignWritePlatformService 
smsCampaignWritePlatformService;
 
     @Transactional
     @Override
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/DeleteSmsCampaignCommandHandler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/DeleteSmsCampaignCommandHandler.java
index b48c7a18b9..83b8d25922 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/DeleteSmsCampaignCommandHandler.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/DeleteSmsCampaignCommandHandler.java
@@ -18,26 +18,22 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.handler;
 
+import lombok.RequiredArgsConstructor;
 import org.apache.fineract.commands.annotation.CommandType;
 import org.apache.fineract.commands.handler.NewCommandSourceHandler;
 import 
org.apache.fineract.infrastructure.campaigns.sms.service.SmsCampaignWritePlatformService;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 @Service
 @CommandType(entity = "SMSCAMPAIGN", action = "DELETE")
+@RequiredArgsConstructor
 public class DeleteSmsCampaignCommandHandler implements 
NewCommandSourceHandler {
 
     private final SmsCampaignWritePlatformService 
smsCampaignWritePlatformService;
 
-    @Autowired
-    public DeleteSmsCampaignCommandHandler(SmsCampaignWritePlatformService 
smsCampaignWritePlatformService) {
-        this.smsCampaignWritePlatformService = smsCampaignWritePlatformService;
-    }
-
     @Transactional
     @Override
     public CommandProcessingResult processCommand(JsonCommand command) {
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/ReactivateSmsCampaignCommandHandler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/ReactivateSmsCampaignCommandHandler.java
index c50aed4004..074c9e5e4a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/ReactivateSmsCampaignCommandHandler.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/ReactivateSmsCampaignCommandHandler.java
@@ -18,26 +18,22 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.handler;
 
+import lombok.RequiredArgsConstructor;
 import org.apache.fineract.commands.annotation.CommandType;
 import org.apache.fineract.commands.handler.NewCommandSourceHandler;
 import 
org.apache.fineract.infrastructure.campaigns.sms.service.SmsCampaignWritePlatformService;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 @Service
 @CommandType(entity = "SMSCAMPAIGN", action = "REACTIVATE")
+@RequiredArgsConstructor
 public class ReactivateSmsCampaignCommandHandler implements 
NewCommandSourceHandler {
 
     private final SmsCampaignWritePlatformService 
smsCampaignWritePlatformService;
 
-    @Autowired
-    public ReactivateSmsCampaignCommandHandler(SmsCampaignWritePlatformService 
smsCampaignWritePlatformService) {
-        this.smsCampaignWritePlatformService = smsCampaignWritePlatformService;
-    }
-
     @Transactional
     @Override
     public CommandProcessingResult processCommand(JsonCommand command) {
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/UpdateSmsCampaignCommandHandler.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/UpdateSmsCampaignCommandHandler.java
index e3c7f66157..aad0a43c80 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/UpdateSmsCampaignCommandHandler.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/handler/UpdateSmsCampaignCommandHandler.java
@@ -18,25 +18,21 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.handler;
 
+import lombok.RequiredArgsConstructor;
 import org.apache.fineract.commands.annotation.CommandType;
 import org.apache.fineract.commands.handler.NewCommandSourceHandler;
 import 
org.apache.fineract.infrastructure.campaigns.sms.service.SmsCampaignWritePlatformService;
 import org.apache.fineract.infrastructure.core.api.JsonCommand;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 @Service
 @CommandType(entity = "SMSCAMPAIGN", action = "UPDATE")
+@RequiredArgsConstructor
 public class UpdateSmsCampaignCommandHandler implements 
NewCommandSourceHandler {
 
-    private SmsCampaignWritePlatformService smsCampaignWritePlatformService;
-
-    @Autowired
-    public UpdateSmsCampaignCommandHandler(final 
SmsCampaignWritePlatformService smsCampaignWritePlatformService) {
-        this.smsCampaignWritePlatformService = smsCampaignWritePlatformService;
-    }
+    private final SmsCampaignWritePlatformService 
smsCampaignWritePlatformService;
 
     @Transactional
     @Override
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/mapper/BusinessRuleMapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/mapper/BusinessRuleMapper.java
new file mode 100644
index 0000000000..84c4911108
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/mapper/BusinessRuleMapper.java
@@ -0,0 +1,103 @@
+/**
+ * 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.mapper;
+
+import jakarta.annotation.PostConstruct;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import lombok.RequiredArgsConstructor;
+import 
org.apache.fineract.infrastructure.campaigns.sms.data.SmsBusinessRulesData;
+import 
org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator;
+import org.springframework.dao.DataAccessException;
+import org.springframework.jdbc.core.ResultSetExtractor;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class BusinessRuleMapper implements 
ResultSetExtractor<List<SmsBusinessRulesData>> {
+
+    private String schema;
+    private final DatabaseSpecificSQLGenerator sqlGenerator;
+
+    @PostConstruct
+    public void init() {
+        final StringBuilder sql = new StringBuilder(300);
+        sql.append("sr.id as id, ");
+        sql.append("sr.report_name as reportName, ");
+        sql.append("sr.report_type as reportType, ");
+        sql.append("sr.report_subtype as reportSubType, ");
+        sql.append("sr.description as description, ");
+        sql.append("sp.parameter_variable as params, ");
+        sql.append("sp." + sqlGenerator.escape("parameter_FormatType") + " as 
paramType, ");
+        sql.append("sp.parameter_label as paramLabel, ");
+        sql.append("sp.parameter_name as paramName ");
+        sql.append("from stretchy_report sr ");
+        sql.append("left join stretchy_report_parameter as srp on 
srp.report_id = sr.id ");
+        sql.append("left join stretchy_parameter as sp on sp.id = 
srp.parameter_id ");
+
+        this.schema = sql.toString();
+    }
+
+    public String schema() {
+        return this.schema;
+    }
+
+    @Override
+    public List<SmsBusinessRulesData> extractData(ResultSet rs) throws 
SQLException, DataAccessException {
+        List<SmsBusinessRulesData> smsBusinessRulesDataList = new 
ArrayList<>();
+
+        SmsBusinessRulesData smsBusinessRulesData = null;
+
+        Map<Long, SmsBusinessRulesData> mapOfSameObjects = new HashMap<>();
+
+        while (rs.next()) {
+            final Long id = rs.getLong("id");
+            smsBusinessRulesData = mapOfSameObjects.get(id);
+            if (smsBusinessRulesData == null) {
+                final String reportName = rs.getString("reportName");
+                final String reportType = rs.getString("reportType");
+                final String reportSubType = rs.getString("reportSubType");
+                final String paramName = rs.getString("paramName");
+                final String paramLabel = rs.getString("paramLabel");
+                final String description = rs.getString("description");
+
+                Map<String, Object> hashMap = new HashMap<String, Object>();
+                hashMap.put(paramLabel, paramName);
+                smsBusinessRulesData = SmsBusinessRulesData.instance(id, 
reportName, reportType, reportSubType, hashMap, description);
+                mapOfSameObjects.put(id, smsBusinessRulesData);
+                // add to the list
+                smsBusinessRulesDataList.add(smsBusinessRulesData);
+            }
+            // add new paramType to the existing object
+            Map<String, Object> hashMap = new HashMap<String, Object>();
+            final String paramName = rs.getString("paramName");
+            final String paramLabel = rs.getString("paramLabel");
+            hashMap.put(paramLabel, paramName);
+
+            // get existing map and add new items to it
+            smsBusinessRulesData.reportParamName().putAll(hashMap);
+        }
+
+        return smsBusinessRulesDataList;
+    }
+}
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/mapper/SmsCampaignMapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/mapper/SmsCampaignMapper.java
new file mode 100644
index 0000000000..588c96de10
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/mapper/SmsCampaignMapper.java
@@ -0,0 +1,118 @@
+/**
+ * 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.mapper;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.time.LocalDate;
+import java.time.ZonedDateTime;
+import lombok.Setter;
+import org.apache.fineract.infrastructure.campaigns.constants.CampaignType;
+import 
org.apache.fineract.infrastructure.campaigns.sms.constants.SmsCampaignTriggerType;
+import org.apache.fineract.infrastructure.campaigns.sms.data.SmsCampaignData;
+import 
org.apache.fineract.infrastructure.campaigns.sms.data.SmsCampaignTimeLine;
+import 
org.apache.fineract.infrastructure.campaigns.sms.domain.SmsCampaignStatusEnumerations;
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+import org.apache.fineract.infrastructure.core.domain.JdbcSupport;
+import org.springframework.jdbc.core.RowMapper;
+import org.springframework.stereotype.Component;
+
+@Setter
+@Component
+public class SmsCampaignMapper implements RowMapper<SmsCampaignData> {
+
+    private String schema;
+
+    public SmsCampaignMapper() {
+        setSchema(buildCampaignColumn());
+    }
+
+    public String schema() {
+        return this.schema;
+    }
+
+    private String buildCampaignColumn() {
+        final StringBuilder sql = new StringBuilder(400);
+        sql.append("sc.id as id, ");
+        sql.append("sc.campaign_name as campaignName, ");
+        sql.append("sc.campaign_type as campaignType, ");
+        sql.append("sc.campaign_trigger_type as triggerType, ");
+        sql.append("sc.report_id as runReportId, ");
+        sql.append("sc.message as message, ");
+        sql.append("sc.param_value as paramValue, ");
+        sql.append("sc.status_enum as status, ");
+        sql.append("sc.recurrence as recurrence, ");
+        sql.append("sc.recurrence_start_date as recurrenceStartDate, ");
+        sql.append("sc.next_trigger_date as nextTriggerDate, ");
+        sql.append("sc.last_trigger_date as lastTriggerDate, ");
+        sql.append("sc.submittedon_date as submittedOnDate, ");
+        sql.append("sbu.username as submittedByUsername, ");
+        sql.append("sc.closedon_date as closedOnDate, ");
+        sql.append("clu.username as closedByUsername, ");
+        sql.append("acu.username as activatedByUsername, ");
+        sql.append("sc.approvedon_date as activatedOnDate, ");
+        sql.append("sr.report_name as reportName, ");
+        sql.append("provider_id as providerId, ");
+        sql.append("sc.is_notification as isNotification ");
+        sql.append("from sms_campaign sc ");
+        sql.append("left join m_appuser sbu on sbu.id = sc.submittedon_userid 
");
+        sql.append("left join m_appuser acu on acu.id = sc.approvedon_userid 
");
+        sql.append("left join m_appuser clu on clu.id = sc.closedon_userid ");
+        sql.append("left join stretchy_report sr on sr.id = sc.report_id ");
+        return sql.toString();
+    }
+
+    @Override
+    public SmsCampaignData mapRow(ResultSet rs, int rowNum) throws 
SQLException {
+        final Long id = JdbcSupport.getLong(rs, "id");
+        final String campaignName = rs.getString("campaignName");
+        final Integer campaignType = JdbcSupport.getInteger(rs, 
"campaignType");
+        final EnumOptionData campaignTypeEnum = 
CampaignType.campaignType(campaignType);
+        final Long runReportId = JdbcSupport.getLong(rs, "runReportId");
+        final String paramValue = rs.getString("paramValue");
+        final String message = rs.getString("message");
+
+        final Integer statusId = JdbcSupport.getInteger(rs, "status");
+        final EnumOptionData status = 
SmsCampaignStatusEnumerations.status(statusId);
+        final Integer triggerType = JdbcSupport.getInteger(rs, "triggerType");
+        final EnumOptionData triggerTypeEnum = 
SmsCampaignTriggerType.triggerType(triggerType);
+
+        final ZonedDateTime nextTriggerDate = JdbcSupport.getDateTime(rs, 
"nextTriggerDate");
+        final LocalDate lastTriggerDate = JdbcSupport.getLocalDate(rs, 
"lastTriggerDate");
+
+        final LocalDate closedOnDate = JdbcSupport.getLocalDate(rs, 
"closedOnDate");
+        final String closedByUsername = rs.getString("closedByUsername");
+
+        final LocalDate submittedOnDate = JdbcSupport.getLocalDate(rs, 
"submittedOnDate");
+        final String submittedByUsername = rs.getString("submittedByUsername");
+
+        final LocalDate activatedOnDate = JdbcSupport.getLocalDate(rs, 
"activatedOnDate");
+        final String activatedByUsername = rs.getString("activatedByUsername");
+        final String recurrence = rs.getString("recurrence");
+        final ZonedDateTime recurrenceStartDate = JdbcSupport.getDateTime(rs, 
"recurrenceStartDate");
+        final SmsCampaignTimeLine smsCampaignTimeLine = new 
SmsCampaignTimeLine(submittedOnDate, submittedByUsername, activatedOnDate,
+                activatedByUsername, closedOnDate, closedByUsername);
+        final String reportName = rs.getString("reportName");
+        final Long providerId = rs.getLong("providerId");
+        final boolean isNotification = rs.getBoolean("isNotification");
+        return SmsCampaignData.instance(id, campaignName, campaignTypeEnum, 
triggerTypeEnum, runReportId, reportName, paramValue, status,
+                message, nextTriggerDate, lastTriggerDate, 
smsCampaignTimeLine, recurrenceStartDate, recurrence, providerId,
+                isNotification);
+    }
+}
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 b5fac551f4..ec8aa53abd 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
@@ -104,7 +104,7 @@ public class SmsCampaignDomainServiceImpl implements 
SmsCampaignDomainService {
 
     private void notifyRejectedLoanOwner(Loan loan) {
         List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("Loan Rejected");
-        if (smsCampaigns.size() > 0) {
+        if (!smsCampaigns.isEmpty()) {
             for (SmsCampaign campaign : smsCampaigns) {
                 if (campaign.isActive()) {
                     
SmsCampaignDomainServiceImpl.this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(loan,
@@ -116,7 +116,7 @@ public class SmsCampaignDomainServiceImpl implements 
SmsCampaignDomainService {
 
     private void notifyAcceptedLoanOwner(Loan loan) {
         List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("Loan Approved");
-        if (smsCampaigns.size() > 0) {
+        if (!smsCampaigns.isEmpty()) {
             for (SmsCampaign campaign : smsCampaigns) {
                 
this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(loan,
 campaign);
             }
@@ -125,7 +125,7 @@ public class SmsCampaignDomainServiceImpl implements 
SmsCampaignDomainService {
 
     private void notifyClientActivated(final Client client) {
         List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("Client 
Activated");
-        if (smsCampaigns.size() > 0) {
+        if (!smsCampaigns.isEmpty()) {
             for (SmsCampaign campaign : smsCampaigns) {
                 
this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(client,
 campaign);
             }
@@ -135,7 +135,7 @@ public class SmsCampaignDomainServiceImpl implements 
SmsCampaignDomainService {
 
     private void notifyClientRejected(final Client client) {
         List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("Client 
Rejected");
-        if (smsCampaigns.size() > 0) {
+        if (!smsCampaigns.isEmpty()) {
             for (SmsCampaign campaign : smsCampaigns) {
                 
this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(client,
 campaign);
             }
@@ -145,7 +145,7 @@ public class SmsCampaignDomainServiceImpl implements 
SmsCampaignDomainService {
 
     private void notifySavingsAccountActivated(final SavingsAccount 
savingsAccount) {
         List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("Savings 
Activated");
-        if (smsCampaigns.size() > 0) {
+        if (!smsCampaigns.isEmpty()) {
             for (SmsCampaign campaign : smsCampaigns) {
                 
this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(savingsAccount,
 campaign);
             }
@@ -155,7 +155,7 @@ public class SmsCampaignDomainServiceImpl implements 
SmsCampaignDomainService {
 
     private void notifySavingsAccountRejected(final SavingsAccount 
savingsAccount) {
         List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("Savings 
Rejected");
-        if (smsCampaigns.size() > 0) {
+        if (!smsCampaigns.isEmpty()) {
             for (SmsCampaign campaign : smsCampaigns) {
                 
this.smsCampaignWritePlatformCommandHandler.insertDirectCampaignIntoSmsOutboundTable(savingsAccount,
 campaign);
             }
@@ -165,7 +165,7 @@ public class SmsCampaignDomainServiceImpl implements 
SmsCampaignDomainService {
 
     private void sendSmsForLoanRepayment(LoanTransaction loanTransaction) {
         List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns("Loan 
Repayment");
-        if (smsCampaigns.size() > 0) {
+        if (!smsCampaigns.isEmpty()) {
             for (SmsCampaign smsCampaign : smsCampaigns) {
                 try {
                     Loan loan = loanTransaction.getLoan();
@@ -236,7 +236,7 @@ public class SmsCampaignDomainServiceImpl implements 
SmsCampaignDomainService {
     private void sendSmsForSavingsTransaction(final SavingsAccountTransaction 
savingsTransaction, boolean isDeposit) {
         String campaignName = isDeposit ? "Savings Deposit" : "Savings 
Withdrawal";
         List<SmsCampaign> smsCampaigns = retrieveSmsCampaigns(campaignName);
-        if (smsCampaigns.size() > 0) {
+        if (!smsCampaigns.isEmpty()) {
             for (SmsCampaign smsCampaign : smsCampaigns) {
                 try {
                     final SavingsAccount savingsAccount = 
savingsTransaction.getSavingsAccount();
@@ -293,9 +293,7 @@ public class SmsCampaignDomainServiceImpl implements 
SmsCampaignDomainService {
     }
 
     private List<SmsCampaign> retrieveSmsCampaigns(String paramValue) {
-        List<SmsCampaign> smsCampaigns = 
smsCampaignRepository.findActiveSmsCampaigns("%" + paramValue + "%",
-                SmsCampaignTriggerType.TRIGGERED.getValue());
-        return smsCampaigns;
+        return smsCampaignRepository.findActiveSmsCampaigns("%" + paramValue + 
"%", SmsCampaignTriggerType.TRIGGERED.getValue());
     }
 
     private HashMap<String, Object> processRepaymentDataForSms(final 
LoanTransaction loanTransaction, Client groupClient) {
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignReadPlatformService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignReadPlatformService.java
index 9d19356b05..22946c4cb1 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignReadPlatformService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignReadPlatformService.java
@@ -18,7 +18,6 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.service;
 
-import java.util.Collection;
 import org.apache.fineract.infrastructure.campaigns.sms.data.SmsCampaignData;
 import org.apache.fineract.infrastructure.core.service.Page;
 import org.apache.fineract.infrastructure.core.service.SearchParameters;
@@ -30,7 +29,4 @@ public interface SmsCampaignReadPlatformService {
     Page<SmsCampaignData> retrieveAll(SearchParameters searchParameters);
 
     SmsCampaignData retrieveTemplate(String reportType);
-
-    Collection<SmsCampaignData> retrieveAllScheduleActiveCampaign();
-
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignReadPlatformServiceImpl.java
index 48bb96846e..0994fa0d39 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/service/SmsCampaignReadPlatformServiceImpl.java
@@ -18,69 +18,42 @@
  */
 package org.apache.fineract.infrastructure.campaigns.sms.service;
 
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.time.LocalDate;
-import java.time.ZonedDateTime;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.fineract.infrastructure.campaigns.constants.CampaignType;
-import 
org.apache.fineract.infrastructure.campaigns.sms.constants.SmsCampaignTriggerType;
 import 
org.apache.fineract.infrastructure.campaigns.sms.data.SmsBusinessRulesData;
 import org.apache.fineract.infrastructure.campaigns.sms.data.SmsCampaignData;
-import 
org.apache.fineract.infrastructure.campaigns.sms.data.SmsCampaignTimeLine;
 import org.apache.fineract.infrastructure.campaigns.sms.data.SmsProviderData;
-import 
org.apache.fineract.infrastructure.campaigns.sms.domain.SmsCampaignStatusEnumerations;
 import 
org.apache.fineract.infrastructure.campaigns.sms.exception.SmsCampaignNotFound;
+import 
org.apache.fineract.infrastructure.campaigns.sms.mapper.BusinessRuleMapper;
+import 
org.apache.fineract.infrastructure.campaigns.sms.mapper.SmsCampaignMapper;
 import org.apache.fineract.infrastructure.core.data.EnumOptionData;
-import org.apache.fineract.infrastructure.core.domain.JdbcSupport;
 import org.apache.fineract.infrastructure.core.service.Page;
 import org.apache.fineract.infrastructure.core.service.PaginationHelper;
 import org.apache.fineract.infrastructure.core.service.SearchParameters;
 import 
org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator;
 import 
org.apache.fineract.portfolio.calendar.service.CalendarDropdownReadPlatformService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.dao.DataAccessException;
 import org.springframework.dao.EmptyResultDataAccessException;
 import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.ResultSetExtractor;
-import org.springframework.jdbc.core.RowMapper;
 import org.springframework.stereotype.Service;
 
 @Service
+@RequiredArgsConstructor
 public class SmsCampaignReadPlatformServiceImpl implements 
SmsCampaignReadPlatformService {
 
-    private final BusinessRuleMapper businessRuleMapper;
     private final JdbcTemplate jdbcTemplate;
     private final DatabaseSpecificSQLGenerator sqlGenerator;
     private final SmsCampaignDropdownReadPlatformService 
smsCampaignDropdownReadPlatformService;
-    private final SmsCampaignMapper smsCampaignMapper;
     private final CalendarDropdownReadPlatformService 
calendarDropdownReadPlatformService;
     private final PaginationHelper paginationHelper;
-
-    @Autowired
-    public SmsCampaignReadPlatformServiceImpl(final JdbcTemplate jdbcTemplate,
-            SmsCampaignDropdownReadPlatformService 
smsCampaignDropdownReadPlatformService,
-            final CalendarDropdownReadPlatformService 
calendarDropdownReadPlatformService, DatabaseSpecificSQLGenerator sqlGenerator,
-            PaginationHelper paginationHelper) {
-        this.jdbcTemplate = jdbcTemplate;
-        this.sqlGenerator = sqlGenerator;
-        this.businessRuleMapper = new BusinessRuleMapper(sqlGenerator);
-        this.smsCampaignDropdownReadPlatformService = 
smsCampaignDropdownReadPlatformService;
-        this.smsCampaignMapper = new SmsCampaignMapper();
-        this.calendarDropdownReadPlatformService = 
calendarDropdownReadPlatformService;
-        this.paginationHelper = paginationHelper;
-    }
+    private final BusinessRuleMapper businessRuleMapper;
+    private final SmsCampaignMapper smsCampaignMapper;
 
     @Override
     public SmsCampaignData retrieveOne(Long campaignId) {
         final boolean isVisible = true;
         try {
-            final String sql = "select " + this.smsCampaignMapper.schema + " 
where sc.id = ? and sc.is_visible = ?";
+            final String sql = "select " + this.smsCampaignMapper.schema() + " 
where sc.id = ? and sc.is_visible = ?";
             return this.jdbcTemplate.queryForObject(sql, 
this.smsCampaignMapper, campaignId, isVisible); // NOSONAR
         } catch (final EmptyResultDataAccessException e) {
             throw new SmsCampaignNotFound(campaignId, e);
@@ -90,9 +63,9 @@ public class SmsCampaignReadPlatformServiceImpl implements 
SmsCampaignReadPlatfo
     @Override
     public Page<SmsCampaignData> retrieveAll(final SearchParameters 
searchParameters) {
         final boolean visible = true;
-        final StringBuilder sqlBuilder = new StringBuilder(200);
-        sqlBuilder.append("select " + sqlGenerator.calcFoundRows() + " ");
-        sqlBuilder.append(this.smsCampaignMapper.schema() + " where 
sc.is_visible = ? ");
+        final StringBuilder sqlBuilder = new StringBuilder();
+        sqlBuilder.append("select 
").append(sqlGenerator.calcFoundRows()).append(" 
").append(this.smsCampaignMapper.schema())
+                .append(" where sc.is_visible = ? ");
 
         if (searchParameters.hasLimit()) {
             sqlBuilder.append(" ");
@@ -107,11 +80,13 @@ public class SmsCampaignReadPlatformServiceImpl implements 
SmsCampaignReadPlatfo
 
     @Override
     public SmsCampaignData retrieveTemplate(final String reportType) {
-        String sql = "select " + this.businessRuleMapper.schema();
-        if (!StringUtils.isEmpty(reportType)) {
-            sql = sql + " where sr.report_type = ?";
+        final StringBuilder sqlBuilder = new StringBuilder();
+        sqlBuilder.append("select ").append(this.businessRuleMapper.schema());
+        if (StringUtils.isNotBlank(reportType)) {
+            sqlBuilder.append(" where sr.report_type = ?");
         }
-        final Collection<SmsBusinessRulesData> businessRulesOptions = 
this.jdbcTemplate.query(sql, this.businessRuleMapper, // NOSONAR
+        final Collection<SmsBusinessRulesData> businessRulesOptions = 
this.jdbcTemplate.query(sqlBuilder.toString(),
+                this.businessRuleMapper, // NOSONAR
                 reportType);
         final Collection<SmsProviderData> smsProviderOptions = 
this.smsCampaignDropdownReadPlatformService.retrieveSmsProviders();
         final Collection<EnumOptionData> campaignTypeOptions = 
this.smsCampaignDropdownReadPlatformService.retrieveCampaignTypes();
@@ -122,161 +97,7 @@ public class SmsCampaignReadPlatformServiceImpl implements 
SmsCampaignReadPlatfo
         final Collection<EnumOptionData> frequencyTypeOptions = 
this.calendarDropdownReadPlatformService
                 .retrieveCalendarFrequencyTypeOptions();
         final Collection<EnumOptionData> periodFrequencyOptions = 
this.smsCampaignDropdownReadPlatformService.retrivePeriodFrequencyTypes();
-        // final Collection<TriggerTypeWithSubTypesData>
-        // triggerTypeSubTypeOptions =
-        // 
this.smsCampaignDropdownReadPlatformService.getTriggerTypeAndSubTypes();
         return SmsCampaignData.template(smsProviderOptions, 
campaignTypeOptions, businessRulesOptions, campaignTriggerTypeOptions, months,
                 weekDays, frequencyTypeOptions, periodFrequencyOptions);
     }
-
-    @Override
-    public Collection<SmsCampaignData> retrieveAllScheduleActiveCampaign() {
-        return null;
-    }
-
-    private static final class BusinessRuleMapper implements 
ResultSetExtractor<List<SmsBusinessRulesData>> {
-
-        final String schema;
-
-        private BusinessRuleMapper(DatabaseSpecificSQLGenerator sqlGenerator) {
-            final StringBuilder sql = new StringBuilder(300);
-            sql.append("sr.id as id, ");
-            sql.append("sr.report_name as reportName, ");
-            sql.append("sr.report_type as reportType, ");
-            sql.append("sr.report_subtype as reportSubType, ");
-            sql.append("sr.description as description, ");
-            sql.append("sp.parameter_variable as params, ");
-            sql.append("sp." + sqlGenerator.escape("parameter_FormatType") + " 
as paramType, ");
-            sql.append("sp.parameter_label as paramLabel, ");
-            sql.append("sp.parameter_name as paramName ");
-            sql.append("from stretchy_report sr ");
-            sql.append("left join stretchy_report_parameter as srp on 
srp.report_id = sr.id ");
-            sql.append("left join stretchy_parameter as sp on sp.id = 
srp.parameter_id ");
-
-            this.schema = sql.toString();
-        }
-
-        public String schema() {
-            return this.schema;
-        }
-
-        @Override
-        public List<SmsBusinessRulesData> extractData(ResultSet rs) throws 
SQLException, DataAccessException {
-            List<SmsBusinessRulesData> smsBusinessRulesDataList = new 
ArrayList<SmsBusinessRulesData>();
-
-            SmsBusinessRulesData smsBusinessRulesData = null;
-
-            Map<Long, SmsBusinessRulesData> mapOfSameObjects = new 
HashMap<Long, SmsBusinessRulesData>();
-
-            while (rs.next()) {
-                final Long id = rs.getLong("id");
-                smsBusinessRulesData = mapOfSameObjects.get(id);
-                if (smsBusinessRulesData == null) {
-                    final String reportName = rs.getString("reportName");
-                    final String reportType = rs.getString("reportType");
-                    final String reportSubType = rs.getString("reportSubType");
-                    final String paramName = rs.getString("paramName");
-                    final String paramLabel = rs.getString("paramLabel");
-                    final String description = rs.getString("description");
-
-                    Map<String, Object> hashMap = new HashMap<String, 
Object>();
-                    hashMap.put(paramLabel, paramName);
-                    smsBusinessRulesData = SmsBusinessRulesData.instance(id, 
reportName, reportType, reportSubType, hashMap, description);
-                    mapOfSameObjects.put(id, smsBusinessRulesData);
-                    // add to the list
-                    smsBusinessRulesDataList.add(smsBusinessRulesData);
-                }
-                // add new paramType to the existing object
-                Map<String, Object> hashMap = new HashMap<String, Object>();
-                final String paramName = rs.getString("paramName");
-                final String paramLabel = rs.getString("paramLabel");
-                hashMap.put(paramLabel, paramName);
-
-                // get existing map and add new items to it
-                smsBusinessRulesData.getReportParamName().putAll(hashMap);
-            }
-
-            return smsBusinessRulesDataList;
-        }
-    }
-
-    private static final class SmsCampaignMapper implements 
RowMapper<SmsCampaignData> {
-
-        final String schema;
-
-        private SmsCampaignMapper() {
-            final StringBuilder sql = new StringBuilder(400);
-            sql.append("sc.id as id, ");
-            sql.append("sc.campaign_name as campaignName, ");
-            sql.append("sc.campaign_type as campaignType, ");
-            sql.append("sc.campaign_trigger_type as triggerType, ");
-            sql.append("sc.report_id as runReportId, ");
-            sql.append("sc.message as message, ");
-            sql.append("sc.param_value as paramValue, ");
-            sql.append("sc.status_enum as status, ");
-            sql.append("sc.recurrence as recurrence, ");
-            sql.append("sc.recurrence_start_date as recurrenceStartDate, ");
-            sql.append("sc.next_trigger_date as nextTriggerDate, ");
-            sql.append("sc.last_trigger_date as lastTriggerDate, ");
-            sql.append("sc.submittedon_date as submittedOnDate, ");
-            sql.append("sbu.username as submittedByUsername, ");
-            sql.append("sc.closedon_date as closedOnDate, ");
-            sql.append("clu.username as closedByUsername, ");
-            sql.append("acu.username as activatedByUsername, ");
-            sql.append("sc.approvedon_date as activatedOnDate, ");
-            sql.append("sr.report_name as reportName, ");
-            sql.append("provider_id as providerId, ");
-            sql.append("sc.is_notification as isNotification ");
-            sql.append("from sms_campaign sc ");
-            sql.append("left join m_appuser sbu on sbu.id = 
sc.submittedon_userid ");
-            sql.append("left join m_appuser acu on acu.id = 
sc.approvedon_userid ");
-            sql.append("left join m_appuser clu on clu.id = sc.closedon_userid 
");
-            sql.append("left join stretchy_report sr on sr.id = sc.report_id 
");
-
-            this.schema = sql.toString();
-        }
-
-        public String schema() {
-            return this.schema;
-        }
-
-        @Override
-        public SmsCampaignData mapRow(ResultSet rs, int rowNum) throws 
SQLException {
-            final Long id = JdbcSupport.getLong(rs, "id");
-            final String campaignName = rs.getString("campaignName");
-            final Integer campaignType = JdbcSupport.getInteger(rs, 
"campaignType");
-            final EnumOptionData campaignTypeEnum = 
CampaignType.campaignType(campaignType);
-            final Long runReportId = JdbcSupport.getLong(rs, "runReportId");
-            final String paramValue = rs.getString("paramValue");
-            final String message = rs.getString("message");
-
-            final Integer statusId = JdbcSupport.getInteger(rs, "status");
-            final EnumOptionData status = 
SmsCampaignStatusEnumerations.status(statusId);
-            final Integer triggerType = JdbcSupport.getInteger(rs, 
"triggerType");
-            final EnumOptionData triggerTypeEnum = 
SmsCampaignTriggerType.triggerType(triggerType);
-
-            final ZonedDateTime nextTriggerDate = JdbcSupport.getDateTime(rs, 
"nextTriggerDate");
-            final LocalDate lastTriggerDate = JdbcSupport.getLocalDate(rs, 
"lastTriggerDate");
-
-            final LocalDate closedOnDate = JdbcSupport.getLocalDate(rs, 
"closedOnDate");
-            final String closedByUsername = rs.getString("closedByUsername");
-
-            final LocalDate submittedOnDate = JdbcSupport.getLocalDate(rs, 
"submittedOnDate");
-            final String submittedByUsername = 
rs.getString("submittedByUsername");
-
-            final LocalDate activatedOnDate = JdbcSupport.getLocalDate(rs, 
"activatedOnDate");
-            final String activatedByUsername = 
rs.getString("activatedByUsername");
-            final String recurrence = rs.getString("recurrence");
-            final ZonedDateTime recurrenceStartDate = 
JdbcSupport.getDateTime(rs, "recurrenceStartDate");
-            final SmsCampaignTimeLine smsCampaignTimeLine = new 
SmsCampaignTimeLine(submittedOnDate, submittedByUsername, activatedOnDate,
-                    activatedByUsername, closedOnDate, closedByUsername);
-            final String reportName = rs.getString("reportName");
-            final Long providerId = rs.getLong("providerId");
-            final Boolean isNotification = rs.getBoolean("isNotification");
-            return SmsCampaignData.instance(id, campaignName, 
campaignTypeEnum, triggerTypeEnum, runReportId, reportName, paramValue,
-                    status, message, nextTriggerDate, lastTriggerDate, 
smsCampaignTimeLine, recurrenceStartDate, recurrence, providerId,
-                    isNotification);
-        }
-    }
-
 }
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 baa07bbb22..db4b9e82ea 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
@@ -472,20 +472,14 @@ public class SmsCampaignWritePlatformServiceJpaImpl 
implements SmsCampaignWriteP
         CampaignPreviewData campaignMessage = null;
         this.context.authenticatedUser();
         this.smsCampaignValidator.validatePreviewMessage(query.json());
-        // final String smsParams =
-        // this.fromJsonHelper.extractJsonObjectNamed("paramValue",
-        // query.parsedJson()).getAsString();
         final JsonElement smsParamsElement = 
this.fromJsonHelper.extractJsonObjectNamed(SmsCampaignValidator.paramValue,
                 query.parsedJson());
         String smsParams = smsParamsElement.toString();
         final String textMessageTemplate = 
this.fromJsonHelper.extractStringNamed("message", query.parsedJson());
 
         try {
-            HashMap<String, String> campaignParams = new 
ObjectMapper().readValue(smsParams,
-                    new TypeReference<HashMap<String, String>>() {});
-
-            HashMap<String, String> queryParamForRunReport = new 
ObjectMapper().readValue(smsParams,
-                    new TypeReference<HashMap<String, String>>() {});
+            HashMap<String, String> campaignParams = new 
ObjectMapper().readValue(smsParams, new TypeReference<>() {});
+            HashMap<String, String> queryParamForRunReport = new 
ObjectMapper().readValue(smsParams, new TypeReference<>() {});
 
             List<HashMap<String, Object>> runReportObject = 
this.getRunReportByServiceImpl(campaignParams.get("reportName"),
                     queryParamForRunReport);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/data/SmsProviderData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/data/SmsProviderData.java
index bee9b07d66..21b31d28ba 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/data/SmsProviderData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/processor/data/SmsProviderData.java
@@ -25,8 +25,12 @@ import static 
org.apache.fineract.infrastructure.hooks.api.HookApiConstants.smsP
 import static 
org.apache.fineract.infrastructure.hooks.api.HookApiConstants.smsProviderTokenIdName;
 
 import java.util.Set;
+import lombok.Getter;
+import lombok.Setter;
 import org.apache.fineract.infrastructure.hooks.domain.HookConfiguration;
 
+@Getter
+@Setter
 public class SmsProviderData {
 
     private String url;
@@ -60,52 +64,4 @@ public class SmsProviderData {
             }
         }
     }
-
-    public String getUrl() {
-        return url;
-    }
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    public String getPhoneNumber() {
-        return phoneNo;
-    }
-
-    public String getSmsProvider() {
-        return smsProvider;
-    }
-
-    public String getSmsProviderAccountId() {
-        return smsProviderAccountId;
-    }
-
-    public String getSmsProviderTokenId() {
-        return smsProviderToken;
-    }
-
-    public String getTenantId() {
-        return tenantId;
-    }
-
-    public void setTenantId(String tenantId) {
-        this.tenantId = tenantId;
-    }
-
-    public String getMifosToken() {
-        return mifosToken;
-    }
-
-    public void setMifosToken(String mifosToken) {
-        this.mifosToken = mifosToken;
-    }
-
-    public String getEndpoint() {
-        return endpoint;
-    }
-
-    public void setEndpoint(String endpoint) {
-        this.endpoint = endpoint;
-    }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/api/SmsApiResource.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/api/SmsApiResource.java
index 2c20a57d5c..4d848bdb1c 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/api/SmsApiResource.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/api/SmsApiResource.java
@@ -18,7 +18,11 @@
  */
 package org.apache.fineract.infrastructure.sms.api;
 
+import static 
org.apache.fineract.infrastructure.core.api.DateParam.FROM_DATE_PARAM;
+import static 
org.apache.fineract.infrastructure.core.api.DateParam.TO_DATE_PARAM;
+
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.ws.rs.BeanParam;
 import jakarta.ws.rs.Consumes;
 import jakarta.ws.rs.DELETE;
 import jakarta.ws.rs.GET;
@@ -27,28 +31,24 @@ import jakarta.ws.rs.PUT;
 import jakarta.ws.rs.Path;
 import jakarta.ws.rs.PathParam;
 import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.QueryParam;
-import jakarta.ws.rs.core.Context;
 import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.UriInfo;
 import java.time.LocalDate;
-import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
 import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import 
org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
-import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
-import org.apache.fineract.infrastructure.core.api.DateParam;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import org.apache.fineract.infrastructure.core.data.DateFormat;
-import 
org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
 import 
org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
 import org.apache.fineract.infrastructure.core.service.Page;
 import org.apache.fineract.infrastructure.core.service.SearchParameters;
 import 
org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
-import org.apache.fineract.infrastructure.security.service.SqlValidator;
 import org.apache.fineract.infrastructure.sms.data.SmsData;
+import org.apache.fineract.infrastructure.sms.data.request.SmsCreationRequest;
+import org.apache.fineract.infrastructure.sms.data.request.SmsUpdateRequest;
+import org.apache.fineract.infrastructure.sms.param.SmsRequestParam;
 import org.apache.fineract.infrastructure.sms.service.SmsReadPlatformService;
 import org.springframework.stereotype.Component;
 
@@ -64,79 +64,57 @@ public class SmsApiResource {
 
     private final PlatformSecurityContext context;
     private final SmsReadPlatformService readPlatformService;
-    private final DefaultToApiJsonSerializer<SmsData> toApiJsonSerializer;
-    private final ApiRequestParameterHelper apiRequestParameterHelper;
     private final PortfolioCommandSourceWritePlatformService 
commandsSourceWritePlatformService;
-    private final SqlValidator sqlValidator;
+    private final DefaultToApiJsonSerializer<String> apiJsonSerializer;
 
     @GET
-    public String retrieveAll(@Context final UriInfo uriInfo) {
+    public List<SmsData> retrieveAll() {
         
context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
-        final Collection<SmsData> smsMessages = 
readPlatformService.retrieveAll();
-        final ApiRequestJsonSerializationSettings settings = 
apiRequestParameterHelper.process(uriInfo.getQueryParameters());
-        return toApiJsonSerializer.serialize(settings, smsMessages);
+        return readPlatformService.retrieveAll();
     }
 
     @POST
-    public String create(final String apiRequestBodyAsJson) {
-        final CommandWrapper commandRequest = new 
CommandWrapperBuilder().createSms().withJson(apiRequestBodyAsJson).build();
-        final CommandProcessingResult result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
-        return toApiJsonSerializer.serialize(result);
+    public CommandProcessingResult create(final SmsCreationRequest 
smsCreationRequest) {
+        final CommandWrapper commandRequest = new 
CommandWrapperBuilder().createSms()
+                
.withJson(apiJsonSerializer.serialize(smsCreationRequest)).build();
+        return 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
     }
 
     @GET
     @Path("{resourceId}")
-    public String retrieveOne(@PathParam("resourceId") final Long resourceId, 
@Context final UriInfo uriInfo) {
-        final SmsData smsMessage = readPlatformService.retrieveOne(resourceId);
-        final ApiRequestJsonSerializationSettings settings = 
apiRequestParameterHelper.process(uriInfo.getQueryParameters());
-        return toApiJsonSerializer.serialize(settings, smsMessage);
+    public SmsData retrieveOne(@PathParam("resourceId") final Long resourceId) 
{
+        return readPlatformService.retrieveOne(resourceId);
     }
 
     @GET
     @Path("{campaignId}/messageByStatus")
-    public String retrieveAllSmsByStatus(@PathParam("campaignId") final Long 
campaignId, @Context final UriInfo uriInfo,
-            @QueryParam("status") final Long status, @QueryParam("fromDate") 
final DateParam fromDateParam,
-            @QueryParam("toDate") final DateParam toDateParam, 
@QueryParam("locale") final String locale,
-            @QueryParam("dateFormat") final String rawDateFormat, 
@QueryParam("offset") final Integer offset,
-            @QueryParam("limit") final Integer limit, @QueryParam("orderBy") 
final String orderBy,
-            @QueryParam("sortOrder") final String sortOrder) {
+    public Page<SmsData> retrieveAllSmsByStatus(@PathParam("campaignId") final 
Long campaignId,
+            @BeanParam SmsRequestParam smsRequestParam) {
         
context.authenticatedUser().validateHasReadPermission(RESOURCE_NAME_FOR_PERMISSIONS);
-        sqlValidator.validate(orderBy);
-        sqlValidator.validate(sortOrder);
-        final SearchParameters searchParameters = 
SearchParameters.builder().limit(limit).offset(offset).orderBy(orderBy)
-                .sortOrder(sortOrder).build();
-
-        final DateFormat dateFormat = StringUtils.isBlank(rawDateFormat) ? 
null : new DateFormat(rawDateFormat);
-
-        LocalDate fromDate = null;
-        if (fromDateParam != null) {
-            fromDate = fromDateParam.getDate("fromDate", dateFormat, locale);
-        }
-        LocalDate toDate = null;
-        if (toDateParam != null) {
-            toDate = toDateParam.getDate("toDate", dateFormat, locale);
-        }
+        final SearchParameters searchParameters = 
SearchParameters.builder().limit(smsRequestParam.limit()).offset(smsRequestParam.offset())
+                
.orderBy(smsRequestParam.orderBy()).sortOrder(smsRequestParam.sortOrder()).build();
 
-        final Page<SmsData> smsMessages = 
readPlatformService.retrieveSmsByStatus(campaignId, searchParameters, 
status.intValue(), fromDate,
-                toDate);
+        final DateFormat dateFormat = 
Optional.ofNullable(smsRequestParam.rawDateFormat()).map(DateFormat::new).orElse(null);
+        final LocalDate fromDate = 
Optional.ofNullable(smsRequestParam.fromDate())
+                .map(fromDateParam -> fromDateParam.getDate(FROM_DATE_PARAM, 
dateFormat, smsRequestParam.locale())).orElse(null);
+        final LocalDate toDate = Optional.ofNullable(smsRequestParam.toDate())
+                .map(toDateParam -> toDateParam.getDate(TO_DATE_PARAM, 
dateFormat, smsRequestParam.locale())).orElse(null);
 
-        final ApiRequestJsonSerializationSettings settings = 
apiRequestParameterHelper.process(uriInfo.getQueryParameters());
-        return toApiJsonSerializer.serialize(settings, smsMessages);
+        return readPlatformService.retrieveSmsByStatus(campaignId, 
searchParameters, smsRequestParam.status().intValue(), fromDate, toDate);
     }
 
     @PUT
     @Path("{resourceId}")
-    public String update(@PathParam("resourceId") final Long resourceId, final 
String apiRequestBodyAsJson) {
-        final CommandWrapper commandRequest = new 
CommandWrapperBuilder().updateSms(resourceId).withJson(apiRequestBodyAsJson).build();
-        final CommandProcessingResult result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
-        return toApiJsonSerializer.serialize(result);
+    public CommandProcessingResult update(@PathParam("resourceId") final Long 
resourceId, final SmsUpdateRequest smsUpdateRequest) {
+        final CommandWrapper commandRequest = new 
CommandWrapperBuilder().updateSms(resourceId)
+                
.withJson(apiJsonSerializer.serialize(smsUpdateRequest)).build();
+        return 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
     }
 
     @DELETE
     @Path("{resourceId}")
-    public String delete(@PathParam("resourceId") final Long resourceId) {
+    public CommandProcessingResult delete(@PathParam("resourceId") final Long 
resourceId) {
         final CommandWrapper commandRequest = new 
CommandWrapperBuilder().deleteSms(resourceId).build();
-        final CommandProcessingResult result = 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
-        return toApiJsonSerializer.serialize(result);
+        return 
commandsSourceWritePlatformService.logCommandSource(commandRequest);
     }
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/data/request/SmsCreationRequest.java
similarity index 58%
copy from 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
copy to 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/data/request/SmsCreationRequest.java
index 73ca41f73a..afea759c8b 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/data/request/SmsCreationRequest.java
@@ -16,24 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.infrastructure.campaigns.sms.data;
+package org.apache.fineract.infrastructure.sms.data.request;
 
-public class CampaignPreviewData {
+import java.io.Serial;
+import java.io.Serializable;
 
-    private final String campaignMessage;
+public record SmsCreationRequest(Long groupId, Long clientId, Long staffId, 
String message, Long campaignId) implements Serializable {
 
-    private final Integer totalNumberOfMessages;
-
-    public CampaignPreviewData(String campaignMessage, Integer 
totalNumberOfMessages) {
-        this.campaignMessage = campaignMessage;
-        this.totalNumberOfMessages = totalNumberOfMessages;
-    }
-
-    public String getCampaignMessage() {
-        return campaignMessage;
-    }
-
-    public Integer getTotalNumberOfMessages() {
-        return totalNumberOfMessages;
-    }
+    @Serial
+    private static final long serialVersionUID = 1L;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/data/request/SmsUpdateRequest.java
similarity index 58%
copy from 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
copy to 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/data/request/SmsUpdateRequest.java
index 73ca41f73a..c44f931120 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/data/request/SmsUpdateRequest.java
@@ -16,24 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.infrastructure.campaigns.sms.data;
+package org.apache.fineract.infrastructure.sms.data.request;
 
-public class CampaignPreviewData {
+import java.io.Serial;
+import java.io.Serializable;
 
-    private final String campaignMessage;
+public record SmsUpdateRequest(String message) implements Serializable {
 
-    private final Integer totalNumberOfMessages;
-
-    public CampaignPreviewData(String campaignMessage, Integer 
totalNumberOfMessages) {
-        this.campaignMessage = campaignMessage;
-        this.totalNumberOfMessages = totalNumberOfMessages;
-    }
-
-    public String getCampaignMessage() {
-        return campaignMessage;
-    }
-
-    public Integer getTotalNumberOfMessages() {
-        return totalNumberOfMessages;
-    }
+    @Serial
+    private static final long serialVersionUID = 1L;
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/param/SmsRequestParam.java
similarity index 58%
copy from 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
copy to 
fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/param/SmsRequestParam.java
index 73ca41f73a..476376c3f5 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/data/CampaignPreviewData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/param/SmsRequestParam.java
@@ -16,24 +16,10 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.infrastructure.campaigns.sms.data;
+package org.apache.fineract.infrastructure.sms.param;
 
-public class CampaignPreviewData {
+import org.apache.fineract.infrastructure.core.api.DateParam;
 
-    private final String campaignMessage;
-
-    private final Integer totalNumberOfMessages;
-
-    public CampaignPreviewData(String campaignMessage, Integer 
totalNumberOfMessages) {
-        this.campaignMessage = campaignMessage;
-        this.totalNumberOfMessages = totalNumberOfMessages;
-    }
-
-    public String getCampaignMessage() {
-        return campaignMessage;
-    }
-
-    public Integer getTotalNumberOfMessages() {
-        return totalNumberOfMessages;
-    }
+public record SmsRequestParam(Long status, DateParam fromDate, DateParam 
toDate, String locale, String rawDateFormat, Integer offset,
+        Integer limit, String orderBy, String sortOrder) {
 }
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/service/SmsReadPlatformService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/service/SmsReadPlatformService.java
index 48634eed6f..33354760c0 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/service/SmsReadPlatformService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/service/SmsReadPlatformService.java
@@ -19,7 +19,6 @@
 package org.apache.fineract.infrastructure.sms.service;
 
 import java.time.LocalDate;
-import java.util.Collection;
 import java.util.List;
 import org.apache.fineract.infrastructure.core.service.Page;
 import org.apache.fineract.infrastructure.core.service.SearchParameters;
@@ -27,17 +26,17 @@ import org.apache.fineract.infrastructure.sms.data.SmsData;
 
 public interface SmsReadPlatformService {
 
-    Collection<SmsData> retrieveAll();
+    List<SmsData> retrieveAll();
 
     SmsData retrieveOne(Long resourceId);
 
-    Collection<SmsData> retrieveAllPending(Long campaignId, Integer limit);
+    List<SmsData> retrieveAllPending(Long campaignId, Integer limit);
 
-    Collection<SmsData> retrieveAllSent(Integer limit);
+    List<SmsData> retrieveAllSent(Integer limit);
 
-    Collection<SmsData> retrieveAllDelivered(Integer limit);
+    List<SmsData> retrieveAllDelivered(Integer limit);
 
-    Collection<SmsData> retrieveAllFailed(Integer limit);
+    List<SmsData> retrieveAllFailed(Integer limit);
 
     Page<SmsData> retrieveSmsByStatus(Long campaignId, SearchParameters 
searchParameters, Integer status, LocalDate dateFrom,
             LocalDate dateTo);
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/service/SmsReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/service/SmsReadPlatformServiceImpl.java
index 9a3af759b1..56634ce0da 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/service/SmsReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/service/SmsReadPlatformServiceImpl.java
@@ -18,12 +18,13 @@
  */
 package org.apache.fineract.infrastructure.sms.service;
 
+import jakarta.annotation.PostConstruct;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.time.LocalDate;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
+import lombok.RequiredArgsConstructor;
 import org.apache.fineract.infrastructure.core.data.EnumOptionData;
 import org.apache.fineract.infrastructure.core.domain.JdbcSupport;
 import org.apache.fineract.infrastructure.core.service.DateUtils;
@@ -31,34 +32,31 @@ import org.apache.fineract.infrastructure.core.service.Page;
 import org.apache.fineract.infrastructure.core.service.PaginationHelper;
 import org.apache.fineract.infrastructure.core.service.SearchParameters;
 import 
org.apache.fineract.infrastructure.core.service.database.DatabaseSpecificSQLGenerator;
+import org.apache.fineract.infrastructure.security.service.SqlValidator;
 import org.apache.fineract.infrastructure.security.utils.ColumnValidator;
 import org.apache.fineract.infrastructure.sms.data.SmsData;
 import org.apache.fineract.infrastructure.sms.domain.SmsMessageEnumerations;
 import org.apache.fineract.infrastructure.sms.domain.SmsMessageStatusType;
 import org.apache.fineract.infrastructure.sms.exception.SmsNotFoundException;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.EmptyResultDataAccessException;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
 import org.springframework.stereotype.Service;
 
 @Service
+@RequiredArgsConstructor
 public class SmsReadPlatformServiceImpl implements SmsReadPlatformService {
 
     private final JdbcTemplate jdbcTemplate;
     private final DatabaseSpecificSQLGenerator sqlGenerator;
-    private final SmsMapper smsRowMapper;
     private final PaginationHelper paginationHelper;
     private final ColumnValidator columnValidator;
+    private final SqlValidator sqlValidator;
+    private SmsMapper smsRowMapper;
 
-    @Autowired
-    public SmsReadPlatformServiceImpl(final JdbcTemplate jdbcTemplate, final 
ColumnValidator columnValidator,
-            DatabaseSpecificSQLGenerator sqlGenerator, PaginationHelper 
paginationHelper) {
-        this.jdbcTemplate = jdbcTemplate;
-        this.sqlGenerator = sqlGenerator;
+    @PostConstruct
+    public void init() {
         this.smsRowMapper = new SmsMapper();
-        this.columnValidator = columnValidator;
-        this.paginationHelper = paginationHelper;
     }
 
     private static final class SmsMapper implements RowMapper<SmsData> {
@@ -113,7 +111,7 @@ public class SmsReadPlatformServiceImpl implements 
SmsReadPlatformService {
     }
 
     @Override
-    public Collection<SmsData> retrieveAll() {
+    public List<SmsData> retrieveAll() {
 
         final String sql = "select " + this.smsRowMapper.schema();
 
@@ -131,7 +129,7 @@ public class SmsReadPlatformServiceImpl implements 
SmsReadPlatformService {
     }
 
     @Override
-    public Collection<SmsData> retrieveAllPending(final Long campaignId, final 
Integer limit) {
+    public List<SmsData> retrieveAllPending(final Long campaignId, final 
Integer limit) {
         final String sqlPlusLimit = limit > 0 ? " " + 
sqlGenerator.limit(limit) : "";
         String sql = "select " + this.smsRowMapper.schema() + " where 
smo.status_enum = " + SmsMessageStatusType.PENDING.getValue();
         if (campaignId != null) {
@@ -144,7 +142,7 @@ public class SmsReadPlatformServiceImpl implements 
SmsReadPlatformService {
     }
 
     @Override
-    public Collection<SmsData> retrieveAllSent(final Integer limit) {
+    public List<SmsData> retrieveAllSent(final Integer limit) {
         final String sqlPlusLimit = limit > 0 ? " " + 
sqlGenerator.limit(limit) : "";
         final String sql = "select " + this.smsRowMapper.schema() + " where 
smo.status_enum IN ("
                 + SmsMessageStatusType.WAITING_FOR_DELIVERY_REPORT.getValue() 
+ "," + SmsMessageStatusType.SENT.getValue() + ")"
@@ -180,7 +178,7 @@ public class SmsReadPlatformServiceImpl implements 
SmsReadPlatformService {
     }
 
     @Override
-    public Collection<SmsData> retrieveAllDelivered(final Integer limit) {
+    public List<SmsData> retrieveAllDelivered(final Integer limit) {
         final String sqlPlusLimit = limit > 0 ? " " + 
sqlGenerator.limit(limit) : "";
         final String sql = "select " + this.smsRowMapper.schema() + " where 
smo.status_enum = " + SmsMessageStatusType.DELIVERED.getValue()
                 + sqlPlusLimit;
@@ -189,7 +187,7 @@ public class SmsReadPlatformServiceImpl implements 
SmsReadPlatformService {
     }
 
     @Override
-    public Collection<SmsData> retrieveAllFailed(final Integer limit) {
+    public List<SmsData> retrieveAllFailed(final Integer limit) {
         final String sqlPlusLimit = limit > 0 ? " " + 
sqlGenerator.limit(limit) : "";
         final String sql = "select " + this.smsRowMapper.schema() + " where 
smo.status_enum = " + SmsMessageStatusType.FAILED.getValue()
                 + sqlPlusLimit;
@@ -200,6 +198,9 @@ public class SmsReadPlatformServiceImpl implements 
SmsReadPlatformService {
     @Override
     public Page<SmsData> retrieveSmsByStatus(final Long campaignId, final 
SearchParameters searchParameters, final Integer status,
             final LocalDate dateFrom, final LocalDate dateTo) {
+        sqlValidator.validate(searchParameters.getOrderBy());
+        sqlValidator.validate(searchParameters.getSortOrder());
+
         final StringBuilder sqlBuilder = new StringBuilder(200);
         final Object[] objectArray = new Object[10];
         int arrayPos = 0;


Reply via email to