Repository: fineract
Updated Branches:
  refs/heads/develop 037440916 -> 781689c8d


reschedule bulk loan 149 and 481


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

Branch: refs/heads/develop
Commit: aec7f9fa6c70f1c6efef6a86fd0e3cf30355db44
Parents: 18e8585
Author: nazeer shaik <[email protected]>
Authored: Tue Jun 20 14:58:40 2017 +0530
Committer: nazeer shaik <[email protected]>
Committed: Tue Jun 20 14:58:40 2017 +0530

----------------------------------------------------------------------
 .../batch/command/CommandStrategyProvider.java  |  2 +
 .../ApproveLoanRescheduleCommandStrategy.java   | 78 ++++++++++++++++++++
 .../RescheduleLoansApiConstants.java            | 11 ++-
 .../api/RescheduleLoansApiResource.java         | 21 +++++-
 .../data/LoanRescheduleRequestData.java         | 36 +++++++++
 .../LoanRescheduleRequestRepositoryWrapper.java | 50 +++++++++++++
 ...oanReschedulePreviewPlatformServiceImpl.java |  8 +-
 ...oanRescheduleRequestReadPlatformService.java | 11 +++
 ...escheduleRequestReadPlatformServiceImpl.java | 54 ++++++++++++++
 9 files changed, 265 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/fineract/blob/aec7f9fa/fineract-provider/src/main/java/org/apache/fineract/batch/command/CommandStrategyProvider.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/batch/command/CommandStrategyProvider.java
 
b/fineract-provider/src/main/java/org/apache/fineract/batch/command/CommandStrategyProvider.java
index 454c32d..e506004 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/batch/command/CommandStrategyProvider.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/batch/command/CommandStrategyProvider.java
@@ -98,6 +98,8 @@ public class CommandStrategyProvider {
                 "approveLoanCommandStrategy");
         
this.commandStrategies.put(CommandContext.resource("loans\\/\\d+\\?command=disburse").method("POST").build(),
                 "disburseLoanCommandStrategy");
+        
this.commandStrategies.put(CommandContext.resource("rescheduleloans\\/\\d+\\?command=approve").method("POST").build(),
+                "approveLoanRescheduleCommandStrategy");
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/fineract/blob/aec7f9fa/fineract-provider/src/main/java/org/apache/fineract/batch/command/internal/ApproveLoanRescheduleCommandStrategy.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/batch/command/internal/ApproveLoanRescheduleCommandStrategy.java
 
b/fineract-provider/src/main/java/org/apache/fineract/batch/command/internal/ApproveLoanRescheduleCommandStrategy.java
new file mode 100644
index 0000000..3822f0a
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/batch/command/internal/ApproveLoanRescheduleCommandStrategy.java
@@ -0,0 +1,78 @@
+/**
+ * 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.batch.command.internal;
+
+import javax.ws.rs.core.UriInfo;
+
+import org.apache.fineract.batch.command.CommandStrategy;
+import org.apache.fineract.batch.domain.BatchRequest;
+import org.apache.fineract.batch.domain.BatchResponse;
+import org.apache.fineract.batch.exception.ErrorHandler;
+import org.apache.fineract.batch.exception.ErrorInfo;
+import 
org.apache.fineract.portfolio.loanaccount.rescheduleloan.api.RescheduleLoansApiResource;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ApproveLoanRescheduleCommandStrategy implements CommandStrategy {
+
+    private final RescheduleLoansApiResource rescheduleLoansApiResource;
+
+    @Autowired
+    public ApproveLoanRescheduleCommandStrategy(final 
RescheduleLoansApiResource rescheduleLoansApiResource) {
+        this.rescheduleLoansApiResource = rescheduleLoansApiResource;
+    }
+
+    @Override
+    public BatchResponse execute(BatchRequest request, UriInfo uriInfo) {
+        final BatchResponse response = new BatchResponse();
+        final String responseBody;
+
+        response.setRequestId(request.getRequestId());
+        response.setHeaders(request.getHeaders());
+
+        final String[] pathParameters = request.getRelativeUrl().split("/");
+        Long scheduleId = Long.parseLong(pathParameters[1].substring(0, 
pathParameters[1].indexOf("?")));
+
+        // Try-catch blocks to map exceptions to appropriate status codes
+        try {
+
+            // Calls 'approve' function from 'Loans reschedule Request' to 
approve a
+            // loan
+            responseBody = 
rescheduleLoansApiResource.updateLoanRescheduleRequest(scheduleId, "approve", 
request.getBody());
+
+            response.setStatusCode(200);
+            // Sets the body of the response after the successful approval of a
+            // Loans reschedule Request
+            response.setBody(responseBody);
+
+        } catch (RuntimeException e) {
+
+            // Gets an object of type ErrorInfo, containing information about
+            // raised exception
+            ErrorInfo ex = ErrorHandler.handler(e);
+
+            response.setStatusCode(ex.getStatusCode());
+            response.setBody(ex.getMessage());
+        }
+
+        return response;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/fineract/blob/aec7f9fa/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/RescheduleLoansApiConstants.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/RescheduleLoansApiConstants.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/RescheduleLoansApiConstants.java
index 3fec406..516d66a 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/RescheduleLoansApiConstants.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/RescheduleLoansApiConstants.java
@@ -47,10 +47,19 @@ public class RescheduleLoansApiConstants {
     public static final String adjustedDueDateParamName = "adjustedDueDate";
     public static final String 
resheduleForMultiDisbursementNotSupportedErrorCode = 
"loan.reschedule.multidisbursement.error.code";
     public static final String 
resheduleWithInterestRecalculationNotSupportedErrorCode = 
"loan.reschedule.interestrecalculation.error.code";
-
+    public static final String allCommandParamName = "all";
+    public static final String approveCommandParamName = "approve";
+    public static final String pendingCommandParamName = "pending";
+    public static final String rejectCommandParamName = "reject";
+    
     // reject action request parameters
     public static final String rejectedOnDateParam = "rejectedOnDate";
 
     // approve action request parameters
     public static final String approvedOnDateParam = "approvedOnDate";
+
+    public static final Set<String> APPROVE_REQUEST_DATA_PARAMETERS = new 
HashSet<>(Arrays.asList(localeParamName, dateFormatParamName,
+            approvedOnDateParam));
+    
+    public static final Set<String> commandParams = new 
HashSet<>(Arrays.asList(allCommandParamName, approveCommandParamName, 
pendingCommandParamName, rejectCommandParamName));
 }

http://git-wip-us.apache.org/repos/asf/fineract/blob/aec7f9fa/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/api/RescheduleLoansApiResource.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/api/RescheduleLoansApiResource.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/api/RescheduleLoansApiResource.java
index 591e21b..569d5b7 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/api/RescheduleLoansApiResource.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/api/RescheduleLoansApiResource.java
@@ -19,6 +19,7 @@
 package org.apache.fineract.portfolio.loanaccount.rescheduleloan.api;
 
 import java.util.HashSet;
+import java.util.List;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
@@ -96,7 +97,7 @@ public class RescheduleLoansApiResource {
 
         return 
this.loanRescheduleRequestToApiJsonSerializer.serialize(settings, 
loanRescheduleReasons);
     }
-
+    
     @GET
     @Path("{scheduleId}")
     @Consumes({ MediaType.APPLICATION_JSON })
@@ -170,6 +171,24 @@ public class RescheduleLoansApiResource {
     private boolean compareIgnoreCase(String firstString, String secondString) 
{
         return StringUtils.isNotBlank(firstString) && 
firstString.trim().equalsIgnoreCase(secondString);
     }
+
+    @GET
+    @Consumes({ MediaType.APPLICATION_JSON })
+    @Produces({ MediaType.APPLICATION_JSON })
+    public String retrieveAllRescheduleRequest(@Context final UriInfo uriInfo, 
@QueryParam("command") final String command) {
+
+        
this.platformSecurityContext.authenticatedUser().validateHasReadPermission(RescheduleLoansApiConstants.ENTITY_NAME);
+
+        final ApiRequestJsonSerializationSettings settings = 
this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
+        if (StringUtils.isNotBlank(command) && 
!RescheduleLoansApiConstants.commandParams.contains(command.toLowerCase())) { 
throw new UnrecognizedQueryParamException(
+                "command", command, new Object[] { 
RescheduleLoansApiConstants.allCommandParamName,
+                        RescheduleLoansApiConstants.pendingCommandParamName, 
RescheduleLoansApiConstants.approveCommandParamName,
+                        RescheduleLoansApiConstants.rejectCommandParamName }); 
}
+        final List<LoanRescheduleRequestData> loanRescheduleRequestsData = 
this.loanRescheduleRequestReadPlatformService
+                .retrieveAllRescheduleRequests(command);
+
+        return 
this.loanRescheduleRequestToApiJsonSerializer.serialize(settings, 
loanRescheduleRequestsData);
+    }
     
     /*@GET
     @Path("{scheduleId}")

http://git-wip-us.apache.org/repos/asf/fineract/blob/aec7f9fa/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/data/LoanRescheduleRequestData.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/data/LoanRescheduleRequestData.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/data/LoanRescheduleRequestData.java
index 2a6dfbd..1f02a5f 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/data/LoanRescheduleRequestData.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/data/LoanRescheduleRequestData.java
@@ -86,7 +86,43 @@ public class LoanRescheduleRequestData {
                 rescheduleReasonCodeValue, rescheduleReasonComment, timeline, 
clientName, loanAccountNumber, clientId, recalculateInterest,
                 rescheduleReasons, loanTermVariationsData);
     }
+    
+    /**
+     * LoanRescheduleRequestData constructor
+     * 
+     * @param loanTermVariationsData
+     *            TODO
+     **/
+    private LoanRescheduleRequestData(Long id, Long loanId, 
LoanRescheduleRequestStatusEnumData statusEnum, final String clientName,
+            final String loanAccountNumber, final Long clientId, final 
LocalDate rescheduleFromDate,
+            final CodeValueData rescheduleReasonCodeValue) {
+
+        this.id = id;
+        this.loanId = loanId;
+        this.statusEnum = statusEnum;
+        this.clientName = clientName;
+        this.loanAccountNumber = loanAccountNumber;
+        this.clientId = clientId;
+        this.rescheduleFromDate = rescheduleFromDate;
+        this.rescheduleReasonCodeValue = rescheduleReasonCodeValue;
+        this.rescheduleFromInstallment = null;
+        this.rescheduleReasonComment = null;
+        this.timeline = null;
+        this.recalculateInterest = null;
+        this.rescheduleReasons = null;
+        this.loanTermVariationsData = null;
+    }
+
+    /**
+     * @return an instance of the LoanRescheduleRequestData class
+     **/
+    public static LoanRescheduleRequestData instance(Long id, Long loanId, 
LoanRescheduleRequestStatusEnumData statusEnum,
+            final String clientName, final String loanAccountNumber, final 
Long clientId, final LocalDate rescheduleFromDate,
+            final CodeValueData rescheduleReasonCodeValue) {
 
+        return new LoanRescheduleRequestData(id, loanId, statusEnum, 
clientName, loanAccountNumber, clientId, rescheduleFromDate,
+                rescheduleReasonCodeValue);
+    }
     /**
      * @return the id
      */

http://git-wip-us.apache.org/repos/asf/fineract/blob/aec7f9fa/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanRescheduleRequestRepositoryWrapper.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanRescheduleRequestRepositoryWrapper.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanRescheduleRequestRepositoryWrapper.java
new file mode 100644
index 0000000..c02f050
--- /dev/null
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/domain/LoanRescheduleRequestRepositoryWrapper.java
@@ -0,0 +1,50 @@
+/**
+ * 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.portfolio.loanaccount.rescheduleloan.domain;
+
+import 
org.apache.fineract.portfolio.loanaccount.rescheduleloan.exception.LoanRescheduleRequestNotFoundException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+public class LoanRescheduleRequestRepositoryWrapper {
+
+    private final LoanRescheduleRequestRepository 
loanRescheduleRequestRepository;
+
+    @Autowired
+    public LoanRescheduleRequestRepositoryWrapper(final 
LoanRescheduleRequestRepository loanRescheduleRequestRepository) {
+        this.loanRescheduleRequestRepository = loanRescheduleRequestRepository;
+    }
+
+    public LoanRescheduleRequest findOneWithNotFoundDetection(final Long id) {
+        return this.findOneWithNotFoundDetection(id, false);
+    }
+
+    @Transactional(readOnly = true)
+    public LoanRescheduleRequest findOneWithNotFoundDetection(final Long id, 
boolean loadLazyCollections) {
+        final LoanRescheduleRequest loanRescheduleRequest = 
this.loanRescheduleRequestRepository.findOne(id);
+        if (loanRescheduleRequest == null) { throw new 
LoanRescheduleRequestNotFoundException(id); }
+        if (loadLazyCollections) {
+            loanRescheduleRequest.getLoan().initializeLazyCollections();
+        }
+        return loanRescheduleRequest;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/fineract/blob/aec7f9fa/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanReschedulePreviewPlatformServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanReschedulePreviewPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanReschedulePreviewPlatformServiceImpl.java
index f6a918d..e5ab38d 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanReschedulePreviewPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanReschedulePreviewPlatformServiceImpl.java
@@ -41,7 +41,7 @@ import 
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanSchedul
 import 
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleGeneratorFactory;
 import 
org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleModel;
 import 
org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequest;
-import 
org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequestRepository;
+import 
org.apache.fineract.portfolio.loanaccount.rescheduleloan.domain.LoanRescheduleRequestRepositoryWrapper;
 import 
org.apache.fineract.portfolio.loanaccount.rescheduleloan.exception.LoanRescheduleRequestNotFoundException;
 import org.apache.fineract.portfolio.loanaccount.service.LoanUtilService;
 import org.joda.time.LocalDate;
@@ -51,7 +51,7 @@ import org.springframework.stereotype.Service;
 @Service
 public class LoanReschedulePreviewPlatformServiceImpl implements 
LoanReschedulePreviewPlatformService {
 
-    private final LoanRescheduleRequestRepository 
loanRescheduleRequestRepository;
+    private final LoanRescheduleRequestRepositoryWrapper 
loanRescheduleRequestRepository;
     private final LoanUtilService loanUtilService;
     private final LoanRepaymentScheduleTransactionProcessorFactory 
loanRepaymentScheduleTransactionProcessorFactory;
     private final LoanScheduleGeneratorFactory loanScheduleFactory;
@@ -59,7 +59,7 @@ public class LoanReschedulePreviewPlatformServiceImpl 
implements LoanRescheduleP
     private final DefaultScheduledDateGenerator scheduledDateGenerator = new 
DefaultScheduledDateGenerator();
 
     @Autowired
-    public LoanReschedulePreviewPlatformServiceImpl(final 
LoanRescheduleRequestRepository loanRescheduleRequestRepository,
+    public LoanReschedulePreviewPlatformServiceImpl(final 
LoanRescheduleRequestRepositoryWrapper loanRescheduleRequestRepository,
             final LoanUtilService loanUtilService,
             final LoanRepaymentScheduleTransactionProcessorFactory 
loanRepaymentScheduleTransactionProcessorFactory,
             final LoanScheduleGeneratorFactory loanScheduleFactory, final 
LoanSummaryWrapper loanSummaryWrapper) {
@@ -72,7 +72,7 @@ public class LoanReschedulePreviewPlatformServiceImpl 
implements LoanRescheduleP
 
     @Override
     public LoanScheduleModel previewLoanReschedule(Long requestId) {
-        final LoanRescheduleRequest loanRescheduleRequest = 
this.loanRescheduleRequestRepository.findOne(requestId);
+        final LoanRescheduleRequest loanRescheduleRequest = 
this.loanRescheduleRequestRepository.findOneWithNotFoundDetection(requestId, 
true);
 
         if (loanRescheduleRequest == null) { throw new 
LoanRescheduleRequestNotFoundException(requestId); }
 

http://git-wip-us.apache.org/repos/asf/fineract/blob/aec7f9fa/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformService.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformService.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformService.java
index 14232a9..cb6a310 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformService.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformService.java
@@ -59,4 +59,15 @@ public interface LoanRescheduleRequestReadPlatformService {
      * @return list of LoanRescheduleRequestData objects
      **/
     public LoanRescheduleRequestData retrieveAllRescheduleReasons(String 
loanRescheduleReason);
+    /**
+     * get all loan reschedule request
+     * 
+     * @param command 
+     * all/null - give all request
+     * approved - give all approved request
+     * pending - give all  request which is pending for approval
+     * reject - give all rejected requests
+     * @return list of LoanRescheduleRequestData objects
+     **/
+    public List<LoanRescheduleRequestData> 
retrieveAllRescheduleRequests(String command);
 }

http://git-wip-us.apache.org/repos/asf/fineract/blob/aec7f9fa/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformServiceImpl.java
 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformServiceImpl.java
index 632fe73..6cc3b21 100644
--- 
a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformServiceImpl.java
+++ 
b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/rescheduleloan/service/LoanRescheduleRequestReadPlatformServiceImpl.java
@@ -31,6 +31,7 @@ import 
org.apache.fineract.infrastructure.core.domain.JdbcSupport;
 import org.apache.fineract.infrastructure.core.service.RoutingDataSource;
 import org.apache.fineract.portfolio.loanaccount.data.LoanTermVariationsData;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanRepositoryWrapper;
+import 
org.apache.fineract.portfolio.loanaccount.rescheduleloan.RescheduleLoansApiConstants;
 import 
org.apache.fineract.portfolio.loanaccount.rescheduleloan.data.LoanRescheduleRequestData;
 import 
org.apache.fineract.portfolio.loanaccount.rescheduleloan.data.LoanRescheduleRequestEnumerations;
 import 
org.apache.fineract.portfolio.loanaccount.rescheduleloan.data.LoanRescheduleRequestStatusEnumData;
@@ -43,6 +44,8 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
 import org.springframework.stereotype.Service;
 
+import com.amazonaws.util.StringUtils;
+
 @Service
 public class LoanRescheduleRequestReadPlatformServiceImpl implements 
LoanRescheduleRequestReadPlatformService {
 
@@ -190,6 +193,40 @@ public class LoanRescheduleRequestReadPlatformServiceImpl 
implements LoanResched
 
     }
     
+    private static final class LoanRescheduleRequestRowMapperForBulkApproval 
implements RowMapper<LoanRescheduleRequestData> {
+
+        public String schema() {
+            final StringBuilder sqlBuilder = new StringBuilder(200);
+
+            sqlBuilder.append("lrr.id as id, lrr.status_enum as statusEnum, 
lrr.reschedule_from_date as rescheduleFromDate, ");
+            sqlBuilder.append("cv.id as rescheduleReasonCvId, cv.code_value as 
rescheduleReasonCvValue, ");
+            sqlBuilder
+                    .append(" loan.id as loanId, loan.account_no as 
loanAccountNumber, client.id as clientId, client.display_name as clientName ");
+            sqlBuilder.append("from m_loan_reschedule_request lrr ");
+            sqlBuilder.append("left join m_loan loan on loan.id = lrr.loan_id 
");
+            sqlBuilder.append("left join m_client client on client.id = 
loan.client_id ");
+            sqlBuilder.append("left join m_code_value cv on cv.id = 
lrr.reschedule_reason_cv_id ");
+            return sqlBuilder.toString();
+        }
+
+        @Override
+        public LoanRescheduleRequestData mapRow(final ResultSet rs, 
@SuppressWarnings("unused") final int rowNum) throws SQLException {
+            final Long id = rs.getLong("id");
+            final Long loanId = rs.getLong("loanId");
+            final Integer statusEnumId = JdbcSupport.getInteger(rs, 
"statusEnum");
+            final LoanRescheduleRequestStatusEnumData statusEnum = 
LoanRescheduleRequestEnumerations.status(statusEnumId);
+            final String clientName = rs.getString("clientName");
+            final String loanAccountNumber = rs.getString("loanAccountNumber");
+            final Long clientId = rs.getLong("clientId");
+            final LocalDate rescheduleFromDate = JdbcSupport.getLocalDate(rs, 
"rescheduleFromDate");
+            final Long rescheduleReasonCvId = JdbcSupport.getLong(rs, 
"rescheduleReasonCvId");
+            final String rescheduleReasonCvValue = 
rs.getString("rescheduleReasonCvValue");
+            final CodeValueData rescheduleReasonCodeValue = 
CodeValueData.instance(rescheduleReasonCvId, rescheduleReasonCvValue);
+            return LoanRescheduleRequestData.instance(id, loanId, statusEnum, 
clientName, loanAccountNumber, clientId, rescheduleFromDate,
+                    rescheduleReasonCodeValue);
+        }
+    }
+    
     @Override
     public List<LoanRescheduleRequestData> readLoanRescheduleRequests(Long 
loanId) {
         this.loanRepositoryWrapper.findOneWithNotFoundDetection(loanId);
@@ -241,4 +278,21 @@ public class LoanRescheduleRequestReadPlatformServiceImpl 
implements LoanResched
                 rescheduleReasonCodeValue, rescheduleReasonComment, timeline, 
clientName, loanAccountNumber, clientId, recalculateInterest,
                 rescheduleReasons, loanTermVariationsData);
     }
+
+    @Override
+    public List<LoanRescheduleRequestData> 
retrieveAllRescheduleRequests(String command) {
+        LoanRescheduleRequestRowMapperForBulkApproval 
loanRescheduleRequestRowMapperForBulkApproval = new 
LoanRescheduleRequestRowMapperForBulkApproval();
+        String sql = "select " + 
loanRescheduleRequestRowMapperForBulkApproval.schema();
+        if (!StringUtils.isNullOrEmpty(command) && 
!command.equalsIgnoreCase(RescheduleLoansApiConstants.allCommandParamName)) {
+            sql = sql + " where lrr.status_enum = ? ";
+            Integer statusParam = 100;
+            if 
(command.equalsIgnoreCase(RescheduleLoansApiConstants.approveCommandParamName)) 
{
+                statusParam = 200;
+            } else if 
(command.equalsIgnoreCase(RescheduleLoansApiConstants.rejectCommandParamName)) {
+                statusParam = 300;
+            }
+            return this.jdbcTemplate.query(sql, 
loanRescheduleRequestRowMapperForBulkApproval, new Object[] { statusParam });
+        }
+        return this.jdbcTemplate.query(sql, 
loanRescheduleRequestRowMapperForBulkApproval, new Object[] {});
+    }
 }

Reply via email to