MIFOSX-1523 Loan Rescheduling

This commit is contained in:
unknown
2015-09-14 17:40:12 +05:30
parent 88685e1f0b
commit dfa51dd7b3
7 changed files with 268 additions and 208 deletions
@@ -307,4 +307,16 @@ public class CommandWrapper {
&& this.entityId == null; && this.entityId == null;
} }
public boolean isReschedule() {
return this.actionName.equalsIgnoreCase("RESCHEDULE") && this.entityName.equalsIgnoreCase("LOAN");
}
public boolean isApproveReschedule() {
return this.actionName.equalsIgnoreCase("APPROVERESCHEDULE") && this.entityName.equalsIgnoreCase("LOAN");
}
public boolean isRejectReschedule() {
return this.actionName.equalsIgnoreCase("REJECTRESCHEDULE") && this.entityName.equalsIgnoreCase("LOAN");
}
} }
@@ -2457,5 +2457,4 @@ public class CommandWrapperBuilder {
this.href = "/clients/" + clientId + "/transactions/" + transactionId + "?command=undo"; this.href = "/clients/" + clientId + "/transactions/" + transactionId + "?command=undo";
return this; return this;
} }
} }
@@ -13,6 +13,8 @@ public class RescheduleLoansApiConstants {
public final static String ENTITY_NAME = "RESCHEDULELOAN"; public final static String ENTITY_NAME = "RESCHEDULELOAN";
public static final String LOAN_RESCHEDULE_REASON = "LoanRescheduleReason";
// general // general
public static final String localeParamName = "locale"; public static final String localeParamName = "locale";
public static final String dateFormatParamName = "dateFormat"; public static final String dateFormatParamName = "dateFormat";
@@ -69,23 +69,41 @@ public class RescheduleLoansApiResource {
} }
@GET @GET
@Path("{requestId}") @Path("template")
@Consumes({ MediaType.APPLICATION_JSON }) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON })
public String readLoanRescheduleRequest(@Context final UriInfo uriInfo, @PathParam("requestId") final Long requestId, public String retrieveTemplate(@Context final UriInfo uriInfo, @QueryParam("commandParam") final String commandParam) {
@QueryParam("command") final String command) {
this.platformSecurityContext.authenticatedUser().validateHasReadPermission(RescheduleLoansApiConstants.ENTITY_NAME);
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
LoanRescheduleRequestData loanRescheduleReasons = null;
if (compareIgnoreCase(commandParam, "rescheduleReason")) {
loanRescheduleReasons = this.loanRescheduleRequestReadPlatformService
.retrieveAllRescheduleReasons(RescheduleLoansApiConstants.LOAN_RESCHEDULE_REASON);
}
return this.loanRescheduleRequestToApiJsonSerializer.serialize(settings, loanRescheduleReasons);
}
@GET
@Path("{scheduleId}")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String readLoanRescheduleRequest(@Context final UriInfo uriInfo, @PathParam("scheduleId") final Long scheduleId,
@QueryParam("commandParam") final String command) {
this.platformSecurityContext.authenticatedUser().validateHasReadPermission(RescheduleLoansApiConstants.ENTITY_NAME); this.platformSecurityContext.authenticatedUser().validateHasReadPermission(RescheduleLoansApiConstants.ENTITY_NAME);
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
if (compareIgnoreCase(command, "previewLoanReschedule")) { if (compareIgnoreCase(command, "previewLoanReschedule")) {
final LoanRescheduleModel loanRescheduleModel = this.loanReschedulePreviewPlatformService.previewLoanReschedule(requestId); final LoanRescheduleModel loanRescheduleModel = this.loanReschedulePreviewPlatformService.previewLoanReschedule(scheduleId);
return this.loanRescheduleToApiJsonSerializer.serialize(settings, loanRescheduleModel.toData(), new HashSet<String>()); return this.loanRescheduleToApiJsonSerializer.serialize(settings, loanRescheduleModel.toData(), new HashSet<String>());
} }
final LoanRescheduleRequestData loanRescheduleRequestData = this.loanRescheduleRequestReadPlatformService final LoanRescheduleRequestData loanRescheduleRequestData = this.loanRescheduleRequestReadPlatformService
.readLoanRescheduleRequest(requestId); .readLoanRescheduleRequest(scheduleId);
return this.loanRescheduleRequestToApiJsonSerializer.serialize(settings, loanRescheduleRequestData); return this.loanRescheduleRequestToApiJsonSerializer.serialize(settings, loanRescheduleRequestData);
} }
@@ -103,20 +121,20 @@ public class RescheduleLoansApiResource {
} }
@POST @POST
@Path("{requestId}") @Path("{scheduleId}")
@Consumes({ MediaType.APPLICATION_JSON }) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON })
public String updateLoanRescheduleRequest(@PathParam("requestId") final Long requestId, @QueryParam("command") final String command, public String updateLoanRescheduleRequest(@PathParam("scheduleId") final Long scheduleId, @QueryParam("command") final String command,
final String apiRequestBodyAsJson) { final String apiRequestBodyAsJson) {
CommandWrapper commandWrapper = null; CommandWrapper commandWrapper = null;
if (compareIgnoreCase(command, "approve")) { if (compareIgnoreCase(command, "approve")) {
commandWrapper = new CommandWrapperBuilder().approveLoanRescheduleRequest(RescheduleLoansApiConstants.ENTITY_NAME, requestId) commandWrapper = new CommandWrapperBuilder().approveLoanRescheduleRequest(RescheduleLoansApiConstants.ENTITY_NAME, scheduleId)
.withJson(apiRequestBodyAsJson).build(); .withJson(apiRequestBodyAsJson).build();
} }
else if (compareIgnoreCase(command, "reject")) { else if (compareIgnoreCase(command, "reject")) {
commandWrapper = new CommandWrapperBuilder().rejectLoanRescheduleRequest(RescheduleLoansApiConstants.ENTITY_NAME, requestId) commandWrapper = new CommandWrapperBuilder().rejectLoanRescheduleRequest(RescheduleLoansApiConstants.ENTITY_NAME, scheduleId)
.withJson(apiRequestBodyAsJson).build(); .withJson(apiRequestBodyAsJson).build();
} }
@@ -6,6 +6,7 @@
package org.mifosplatform.portfolio.loanaccount.rescheduleloan.data; package org.mifosplatform.portfolio.loanaccount.rescheduleloan.data;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Collection;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.mifosplatform.infrastructure.codes.data.CodeValueData; import org.mifosplatform.infrastructure.codes.data.CodeValueData;
@@ -15,188 +16,190 @@ import org.mifosplatform.infrastructure.codes.data.CodeValueData;
**/ **/
public class LoanRescheduleRequestData { public class LoanRescheduleRequestData {
private final Long id; private final Long id;
private final Long loanId; private final Long loanId;
private final Long clientId; private final Long clientId;
private final String clientName; private final String clientName;
private final String loanAccountNumber; private final String loanAccountNumber;
private final LoanRescheduleRequestStatusEnumData statusEnum; private final LoanRescheduleRequestStatusEnumData statusEnum;
private final Integer rescheduleFromInstallment; private final Integer rescheduleFromInstallment;
private final Integer graceOnPrincipal; private final Integer graceOnPrincipal;
private final Integer graceOnInterest; private final Integer graceOnInterest;
private final LocalDate rescheduleFromDate; private final LocalDate rescheduleFromDate;
private final Integer extraTerms; private final Integer extraTerms;
private final BigDecimal interestRate; private final BigDecimal interestRate;
private final Boolean recalculateInterest; private final Boolean recalculateInterest;
private final CodeValueData rescheduleReasonCodeValue; private final CodeValueData rescheduleReasonCodeValue;
private final LoanRescheduleRequestTimelineData timeline; private final LoanRescheduleRequestTimelineData timeline;
private final String rescheduleReasonComment; private final String rescheduleReasonComment;
private final LocalDate adjustedDueDate; private final LocalDate adjustedDueDate;
private final Collection<CodeValueData> rescheduleReasons;
/** /**
* LoanRescheduleRequestData constructor * LoanRescheduleRequestData constructor
**/ **/
private LoanRescheduleRequestData(Long id, Long loanId, LoanRescheduleRequestStatusEnumData statusEnum, private LoanRescheduleRequestData(Long id, Long loanId, LoanRescheduleRequestStatusEnumData statusEnum,
Integer rescheduleFromInstallment, Integer graceOnPrincipal, Integer graceOnInterest, Integer rescheduleFromInstallment, Integer graceOnPrincipal, Integer graceOnInterest, LocalDate rescheduleFromDate,
LocalDate rescheduleFromDate, LocalDate adjustedDueDate, Integer extraTerms, BigDecimal interestRate, LocalDate adjustedDueDate, Integer extraTerms, BigDecimal interestRate, CodeValueData rescheduleReasonCodeValue,
CodeValueData rescheduleReasonCodeValue, String rescheduleReasonComment, LoanRescheduleRequestTimelineData timeline, String rescheduleReasonComment, LoanRescheduleRequestTimelineData timeline, final String clientName,
final String clientName, final String loanAccountNumber, final Long clientId, final Boolean recalculateInterest) { final String loanAccountNumber, final Long clientId, final Boolean recalculateInterest, Collection<CodeValueData> rescheduleReasons) {
this.id = id; this.id = id;
this.loanId = loanId; this.loanId = loanId;
this.statusEnum = statusEnum; this.statusEnum = statusEnum;
this.rescheduleFromInstallment = rescheduleFromInstallment; this.rescheduleFromInstallment = rescheduleFromInstallment;
this.graceOnPrincipal = graceOnPrincipal; this.graceOnPrincipal = graceOnPrincipal;
this.graceOnInterest = graceOnInterest; this.graceOnInterest = graceOnInterest;
this.rescheduleFromDate = rescheduleFromDate; this.rescheduleFromDate = rescheduleFromDate;
this.extraTerms = extraTerms; this.extraTerms = extraTerms;
this.interestRate = interestRate; this.interestRate = interestRate;
this.rescheduleReasonCodeValue = rescheduleReasonCodeValue; this.rescheduleReasonCodeValue = rescheduleReasonCodeValue;
this.rescheduleReasonComment = rescheduleReasonComment; this.rescheduleReasonComment = rescheduleReasonComment;
this.adjustedDueDate = adjustedDueDate; this.adjustedDueDate = adjustedDueDate;
this.timeline = timeline; this.timeline = timeline;
this.clientName = clientName; this.clientName = clientName;
this.loanAccountNumber = loanAccountNumber; this.loanAccountNumber = loanAccountNumber;
this.clientId = clientId; this.clientId = clientId;
this.recalculateInterest = recalculateInterest; this.recalculateInterest = recalculateInterest;
} this.rescheduleReasons = rescheduleReasons ;
}
/** /**
* @return an instance of the LoanRescheduleRequestData class * @return an instance of the LoanRescheduleRequestData class
**/ **/
public static LoanRescheduleRequestData instance(Long id, Long loanId, LoanRescheduleRequestStatusEnumData statusEnum, public static LoanRescheduleRequestData instance(Long id, Long loanId, LoanRescheduleRequestStatusEnumData statusEnum,
Integer rescheduleFromInstallment, Integer graceOnPrincipal, Integer graceOnInterest, Integer rescheduleFromInstallment, Integer graceOnPrincipal, Integer graceOnInterest, LocalDate rescheduleFromDate,
LocalDate rescheduleFromDate, LocalDate adjustedDueDate, Integer extraTerms, BigDecimal interestRate, LocalDate adjustedDueDate, Integer extraTerms, BigDecimal interestRate, CodeValueData rescheduleReasonCodeValue,
CodeValueData rescheduleReasonCodeValue, String rescheduleReasonComment, LoanRescheduleRequestTimelineData timeline, String rescheduleReasonComment, LoanRescheduleRequestTimelineData timeline, final String clientName,
final String clientName, final String loanAccountNumber, final Long clientId, final Boolean recalculateInterest) { final String loanAccountNumber, final Long clientId, final Boolean recalculateInterest, Collection<CodeValueData> rescheduleReasons) {
return new LoanRescheduleRequestData(id, loanId, statusEnum, rescheduleFromInstallment, graceOnPrincipal, graceOnInterest, return new LoanRescheduleRequestData(id, loanId, statusEnum, rescheduleFromInstallment, graceOnPrincipal, graceOnInterest,
rescheduleFromDate, adjustedDueDate, extraTerms, interestRate, rescheduleReasonCodeValue, rescheduleReasonComment, rescheduleFromDate, adjustedDueDate, extraTerms, interestRate, rescheduleReasonCodeValue, rescheduleReasonComment,
timeline, clientName, loanAccountNumber, clientId, recalculateInterest); timeline, clientName, loanAccountNumber, clientId, recalculateInterest, rescheduleReasons);
} }
/** /**
* @return the id * @return the id
*/ */
public Long getId() { public Long getId() {
return id; return id;
} }
/** /**
* @return the loanId * @return the loanId
*/ */
public Long getLoanId() { public Long getLoanId() {
return loanId; return loanId;
} }
/** /**
* @return the statusEnum * @return the statusEnum
*/ */
public LoanRescheduleRequestStatusEnumData getStatusEnum() { public LoanRescheduleRequestStatusEnumData getStatusEnum() {
return statusEnum; return statusEnum;
} }
/** /**
* @return the reschedule from installment number * @return the reschedule from installment number
*/ */
public Integer getRescheduleFromInstallment() { public Integer getRescheduleFromInstallment() {
return rescheduleFromInstallment; return rescheduleFromInstallment;
} }
/** /**
* @return the graceOnPrincipal * @return the graceOnPrincipal
*/ */
public Integer getGraceOnPrincipal() { public Integer getGraceOnPrincipal() {
return graceOnPrincipal; return graceOnPrincipal;
} }
/** /**
* @return the graceOnInterest * @return the graceOnInterest
*/ */
public Integer getGraceOnInterest() { public Integer getGraceOnInterest() {
return graceOnInterest; return graceOnInterest;
} }
/** /**
* @return the reschedule from date * @return the reschedule from date
*/ */
public LocalDate getRescheduleFromDate() { public LocalDate getRescheduleFromDate() {
return rescheduleFromDate; return rescheduleFromDate;
} }
/** /**
* @return the extraTerms * @return the extraTerms
*/ */
public Integer getExtraTerms() { public Integer getExtraTerms() {
return extraTerms; return extraTerms;
} }
/** /**
* @return the interestRate * @return the interestRate
*/ */
public BigDecimal getInterestRate() { public BigDecimal getInterestRate() {
return interestRate; return interestRate;
} }
/** /**
* @return the rescheduleReasonCodeValueId * @return the rescheduleReasonCodeValueId
*/ */
public CodeValueData getRescheduleReasonCodeValueId() { public CodeValueData getRescheduleReasonCodeValueId() {
return rescheduleReasonCodeValue; return rescheduleReasonCodeValue;
} }
/** /**
* @return the rescheduleReasonText * @return the rescheduleReasonText
*/ */
public String getRescheduleReasonComment() { public String getRescheduleReasonComment() {
return rescheduleReasonComment; return rescheduleReasonComment;
} }
/** /**
* @return the timeline * @return the timeline
**/ **/
public LoanRescheduleRequestTimelineData getTimeline() { public LoanRescheduleRequestTimelineData getTimeline() {
return this.timeline; return this.timeline;
} }
/** /**
* @return the adjustedDueDate * @return the adjustedDueDate
*/ */
public LocalDate getAdjustedDueDate() { public LocalDate getAdjustedDueDate() {
return adjustedDueDate; return adjustedDueDate;
} }
/** /**
* @return the clientName * @return the clientName
*/ */
public String getClientName() { public String getClientName() {
return clientName; return clientName;
} }
/** /**
* @return the loanAccountNumber * @return the loanAccountNumber
*/ */
public String getLoanAccountNumber() { public String getLoanAccountNumber() {
return loanAccountNumber; return loanAccountNumber;
} }
/** /**
* @return the clientId * @return the clientId
*/ */
public Long getClientId() { public Long getClientId() {
return clientId; return clientId;
} }
/** /**
* @return the recalculateInterest * @return the recalculateInterest
*/ */
public Boolean getRecalculateInterest() { public Boolean getRecalculateInterest() {
boolean value = false; boolean value = false;
if(recalculateInterest != null) { if (recalculateInterest != null) {
value = recalculateInterest; value = recalculateInterest;
} }
return value; return value;
} }
} }
@@ -11,27 +11,39 @@ import org.mifosplatform.portfolio.loanaccount.rescheduleloan.data.LoanReschedul
public interface LoanRescheduleRequestReadPlatformService { public interface LoanRescheduleRequestReadPlatformService {
/** /**
* get all loan reschedule requests by loan ID * get all loan reschedule requests by loan ID
* *
* @param loanId the loan identifier * @param loanId
* @return list of LoanRescheduleRequestData objects * the loan identifier
**/ * @return list of LoanRescheduleRequestData objects
public List<LoanRescheduleRequestData> readLoanRescheduleRequests(Long loanId); **/
public List<LoanRescheduleRequestData> readLoanRescheduleRequests(Long loanId);
/** /**
* get a single loan reschedule request by ID (primary key) * get a single loan reschedule request by ID (primary key)
* *
* @param requestId the loan reschedule request identifier * @param requestId
* @return a LoanRescheduleRequestData object * the loan reschedule request identifier
**/ * @return a LoanRescheduleRequestData object
public LoanRescheduleRequestData readLoanRescheduleRequest(Long requestId); **/
public LoanRescheduleRequestData readLoanRescheduleRequest(Long requestId);
/** /**
* get all loan reschedule requests filter by loan ID and status enum * get all loan reschedule requests filter by loan ID and status enum
* *
* @param loanId the loan identifier * @param loanId
* @return list of LoanRescheduleRequestData objects * the loan identifier
**/ * @return list of LoanRescheduleRequestData objects
public List<LoanRescheduleRequestData> readLoanRescheduleRequests(Long loanId, Integer statusEnum); **/
public List<LoanRescheduleRequestData> readLoanRescheduleRequests(Long loanId, Integer statusEnum);
/**
* get all loan reschedule reasons
*
* @param loanRescheduleReason
* the loan reschedule reason
* @return list of LoanRescheduleRequestData objects
**/
public LoanRescheduleRequestData retrieveAllRescheduleReasons(String loanRescheduleReason);
} }
@@ -8,10 +8,12 @@ package org.mifosplatform.portfolio.loanaccount.rescheduleloan.service;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.mifosplatform.infrastructure.codes.data.CodeValueData; import org.mifosplatform.infrastructure.codes.data.CodeValueData;
import org.mifosplatform.infrastructure.codes.service.CodeValueReadPlatformService;
import org.mifosplatform.infrastructure.core.domain.JdbcSupport; import org.mifosplatform.infrastructure.core.domain.JdbcSupport;
import org.mifosplatform.infrastructure.core.service.RoutingDataSource; import org.mifosplatform.infrastructure.core.service.RoutingDataSource;
import org.mifosplatform.portfolio.loanaccount.domain.Loan; import org.mifosplatform.portfolio.loanaccount.domain.Loan;
@@ -33,12 +35,14 @@ public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanResched
private final JdbcTemplate jdbcTemplate; private final JdbcTemplate jdbcTemplate;
private final LoanRepository loanRepository; private final LoanRepository loanRepository;
private final LoanRescheduleRequestRowMapper loanRescheduleRequestRowMapper = new LoanRescheduleRequestRowMapper(); private final LoanRescheduleRequestRowMapper loanRescheduleRequestRowMapper = new LoanRescheduleRequestRowMapper();
private final CodeValueReadPlatformService codeValueReadPlatformService;
@Autowired @Autowired
public LoanRescheduleRequestReadPlatformServiceImpl(final RoutingDataSource dataSource, public LoanRescheduleRequestReadPlatformServiceImpl(final RoutingDataSource dataSource,
LoanRepository loanRepository) { LoanRepository loanRepository, final CodeValueReadPlatformService codeValueReadPlatformService) {
this.jdbcTemplate = new JdbcTemplate(dataSource); this.jdbcTemplate = new JdbcTemplate(dataSource);
this.loanRepository = loanRepository; this.loanRepository = loanRepository;
this.codeValueReadPlatformService = codeValueReadPlatformService ;
} }
private static final class LoanRescheduleRequestRowMapper implements RowMapper<LoanRescheduleRequestData> { private static final class LoanRescheduleRequestRowMapper implements RowMapper<LoanRescheduleRequestData> {
@@ -145,7 +149,7 @@ public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanResched
return LoanRescheduleRequestData.instance(id, loanId, statusEnum, rescheduleFromInstallment, graceOnPrincipal, return LoanRescheduleRequestData.instance(id, loanId, statusEnum, rescheduleFromInstallment, graceOnPrincipal,
graceOnInterest, rescheduleFromDate, adjustedDueDate, extraTerms, interestRate, rescheduleReasonCodeValue, graceOnInterest, rescheduleFromDate, adjustedDueDate, extraTerms, interestRate, rescheduleReasonCodeValue,
rescheduleReasonComment, timeline, clientName, loanAccountNumber, clientId, recalculateInterest); rescheduleReasonComment, timeline, clientName, loanAccountNumber, clientId, recalculateInterest, null);
} }
} }
@@ -190,4 +194,14 @@ public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanResched
return this.jdbcTemplate.query(sql, this.loanRescheduleRequestRowMapper, new Object[] { loanId, statusEnum }); return this.jdbcTemplate.query(sql, this.loanRescheduleRequestRowMapper, new Object[] { loanId, statusEnum });
} }
@Override
public LoanRescheduleRequestData retrieveAllRescheduleReasons(String loanRescheduleReason) {
final List<CodeValueData> rescheduleReasons = new ArrayList<>(
this.codeValueReadPlatformService.retrieveCodeValuesByCode(loanRescheduleReason));
return LoanRescheduleRequestData.instance(null, null, null, null, null, null,
null, null, null, null, null, null,
null, null, null, null, null,rescheduleReasons);
}
} }