Merge pull request #1502 from nazeer1100126/Mifosx_1523_-_Loan_Rescheduling

Mifosx 1523   loan rescheduling
This commit is contained in:
pramod
2015-09-15 13:20:36 +05:30
7 changed files with 386 additions and 331 deletions
@@ -306,5 +306,4 @@ public class CommandWrapper {
return this.actionName.equalsIgnoreCase("UPDATE") && this.entityName.equalsIgnoreCase("DISBURSEMENTDETAIL") return this.actionName.equalsIgnoreCase("UPDATE") && this.entityName.equalsIgnoreCase("DISBURSEMENTDETAIL")
&& this.entityId == null; && this.entityId == null;
} }
} }
@@ -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,39 @@ 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) {
this.platformSecurityContext.authenticatedUser().validateHasReadPermission(RescheduleLoansApiConstants.ENTITY_NAME);
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
LoanRescheduleRequestData loanRescheduleReasons = null;
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("command") final String command) { @QueryParam("command") 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 +119,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,197 +6,200 @@
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;
/** /**
* Immutable data object representing loan reschedule request data. * Immutable data object representing loan reschedule request data.
**/ **/
public class LoanRescheduleRequestData { public class LoanRescheduleRequestData {
private final Long id;
private final Long loanId;
private final Long clientId;
private final String clientName;
private final String loanAccountNumber;
private final LoanRescheduleRequestStatusEnumData statusEnum;
private final Integer rescheduleFromInstallment;
private final Integer graceOnPrincipal;
private final Integer graceOnInterest;
private final LocalDate rescheduleFromDate;
private final Integer extraTerms;
private final BigDecimal interestRate;
private final Boolean recalculateInterest;
private final CodeValueData rescheduleReasonCodeValue;
private final LoanRescheduleRequestTimelineData timeline;
private final String rescheduleReasonComment;
private final LocalDate adjustedDueDate;
/**
* LoanRescheduleRequestData constructor
**/
private LoanRescheduleRequestData(Long id, Long loanId, LoanRescheduleRequestStatusEnumData statusEnum,
Integer rescheduleFromInstallment, Integer graceOnPrincipal, Integer graceOnInterest,
LocalDate rescheduleFromDate, LocalDate adjustedDueDate, Integer extraTerms, BigDecimal interestRate,
CodeValueData rescheduleReasonCodeValue, String rescheduleReasonComment, LoanRescheduleRequestTimelineData timeline,
final String clientName, final String loanAccountNumber, final Long clientId, final Boolean recalculateInterest) {
this.id = id;
this.loanId = loanId;
this.statusEnum = statusEnum;
this.rescheduleFromInstallment = rescheduleFromInstallment;
this.graceOnPrincipal = graceOnPrincipal;
this.graceOnInterest = graceOnInterest;
this.rescheduleFromDate = rescheduleFromDate;
this.extraTerms = extraTerms;
this.interestRate = interestRate;
this.rescheduleReasonCodeValue = rescheduleReasonCodeValue;
this.rescheduleReasonComment = rescheduleReasonComment;
this.adjustedDueDate = adjustedDueDate;
this.timeline = timeline;
this.clientName = clientName;
this.loanAccountNumber = loanAccountNumber;
this.clientId = clientId;
this.recalculateInterest = recalculateInterest;
}
/**
* @return an instance of the LoanRescheduleRequestData class
**/
public static LoanRescheduleRequestData instance(Long id, Long loanId, LoanRescheduleRequestStatusEnumData statusEnum,
Integer rescheduleFromInstallment, Integer graceOnPrincipal, Integer graceOnInterest,
LocalDate rescheduleFromDate, LocalDate adjustedDueDate, Integer extraTerms, BigDecimal interestRate,
CodeValueData rescheduleReasonCodeValue, String rescheduleReasonComment, LoanRescheduleRequestTimelineData timeline,
final String clientName, final String loanAccountNumber, final Long clientId, final Boolean recalculateInterest) {
return new LoanRescheduleRequestData(id, loanId, statusEnum, rescheduleFromInstallment, graceOnPrincipal, graceOnInterest,
rescheduleFromDate, adjustedDueDate, extraTerms, interestRate, rescheduleReasonCodeValue, rescheduleReasonComment,
timeline, clientName, loanAccountNumber, clientId, recalculateInterest);
}
/** private final Long id;
* @return the id private final Long loanId;
*/ private final Long clientId;
public Long getId() { private final String clientName;
return id; private final String loanAccountNumber;
} private final LoanRescheduleRequestStatusEnumData statusEnum;
private final Integer rescheduleFromInstallment;
private final Integer graceOnPrincipal;
private final Integer graceOnInterest;
private final LocalDate rescheduleFromDate;
private final Integer extraTerms;
private final BigDecimal interestRate;
private final Boolean recalculateInterest;
private final CodeValueData rescheduleReasonCodeValue;
private final LoanRescheduleRequestTimelineData timeline;
private final String rescheduleReasonComment;
private final LocalDate adjustedDueDate;
private final Collection<CodeValueData> rescheduleReasons;
/**
* LoanRescheduleRequestData constructor
**/
private LoanRescheduleRequestData(Long id, Long loanId, LoanRescheduleRequestStatusEnumData statusEnum,
Integer rescheduleFromInstallment, Integer graceOnPrincipal, Integer graceOnInterest, LocalDate rescheduleFromDate,
LocalDate adjustedDueDate, Integer extraTerms, BigDecimal interestRate, CodeValueData rescheduleReasonCodeValue,
String rescheduleReasonComment, LoanRescheduleRequestTimelineData timeline, final String clientName,
final String loanAccountNumber, final Long clientId, final Boolean recalculateInterest, Collection<CodeValueData> rescheduleReasons) {
/** this.id = id;
* @return the loanId this.loanId = loanId;
*/ this.statusEnum = statusEnum;
public Long getLoanId() { this.rescheduleFromInstallment = rescheduleFromInstallment;
return loanId; this.graceOnPrincipal = graceOnPrincipal;
} this.graceOnInterest = graceOnInterest;
this.rescheduleFromDate = rescheduleFromDate;
this.extraTerms = extraTerms;
this.interestRate = interestRate;
this.rescheduleReasonCodeValue = rescheduleReasonCodeValue;
this.rescheduleReasonComment = rescheduleReasonComment;
this.adjustedDueDate = adjustedDueDate;
this.timeline = timeline;
this.clientName = clientName;
this.loanAccountNumber = loanAccountNumber;
this.clientId = clientId;
this.recalculateInterest = recalculateInterest;
this.rescheduleReasons = rescheduleReasons ;
}
/** /**
* @return the statusEnum * @return an instance of the LoanRescheduleRequestData class
*/ **/
public LoanRescheduleRequestStatusEnumData getStatusEnum() { public static LoanRescheduleRequestData instance(Long id, Long loanId, LoanRescheduleRequestStatusEnumData statusEnum,
return statusEnum; Integer rescheduleFromInstallment, Integer graceOnPrincipal, Integer graceOnInterest, LocalDate rescheduleFromDate,
} LocalDate adjustedDueDate, Integer extraTerms, BigDecimal interestRate, CodeValueData rescheduleReasonCodeValue,
String rescheduleReasonComment, LoanRescheduleRequestTimelineData timeline, final String clientName,
final String loanAccountNumber, final Long clientId, final Boolean recalculateInterest, Collection<CodeValueData> rescheduleReasons) {
/** return new LoanRescheduleRequestData(id, loanId, statusEnum, rescheduleFromInstallment, graceOnPrincipal, graceOnInterest,
* @return the reschedule from installment number rescheduleFromDate, adjustedDueDate, extraTerms, interestRate, rescheduleReasonCodeValue, rescheduleReasonComment,
*/ timeline, clientName, loanAccountNumber, clientId, recalculateInterest, rescheduleReasons);
public Integer getRescheduleFromInstallment() { }
return rescheduleFromInstallment;
}
/** /**
* @return the graceOnPrincipal * @return the id
*/ */
public Integer getGraceOnPrincipal() { public Long getId() {
return graceOnPrincipal; return id;
} }
/** /**
* @return the graceOnInterest * @return the loanId
*/ */
public Integer getGraceOnInterest() { public Long getLoanId() {
return graceOnInterest; return loanId;
} }
/** /**
* @return the reschedule from date * @return the statusEnum
*/ */
public LocalDate getRescheduleFromDate() { public LoanRescheduleRequestStatusEnumData getStatusEnum() {
return rescheduleFromDate; return statusEnum;
} }
/** /**
* @return the extraTerms * @return the reschedule from installment number
*/ */
public Integer getExtraTerms() { public Integer getRescheduleFromInstallment() {
return extraTerms; return rescheduleFromInstallment;
} }
/** /**
* @return the interestRate * @return the graceOnPrincipal
*/ */
public BigDecimal getInterestRate() { public Integer getGraceOnPrincipal() {
return interestRate; return graceOnPrincipal;
} }
/** /**
* @return the rescheduleReasonCodeValueId * @return the graceOnInterest
*/ */
public CodeValueData getRescheduleReasonCodeValueId() { public Integer getGraceOnInterest() {
return rescheduleReasonCodeValue; return graceOnInterest;
} }
/** /**
* @return the rescheduleReasonText * @return the reschedule from date
*/ */
public String getRescheduleReasonComment() { public LocalDate getRescheduleFromDate() {
return rescheduleReasonComment; return rescheduleFromDate;
} }
/**
* @return the timeline
**/
public LoanRescheduleRequestTimelineData getTimeline() {
return this.timeline;
}
/** /**
* @return the adjustedDueDate * @return the extraTerms
*/ */
public LocalDate getAdjustedDueDate() { public Integer getExtraTerms() {
return adjustedDueDate; return extraTerms;
} }
/** /**
* @return the clientName * @return the interestRate
*/ */
public String getClientName() { public BigDecimal getInterestRate() {
return clientName; return interestRate;
} }
/** /**
* @return the loanAccountNumber * @return the rescheduleReasonCodeValueId
*/ */
public String getLoanAccountNumber() { public CodeValueData getRescheduleReasonCodeValueId() {
return loanAccountNumber; return rescheduleReasonCodeValue;
} }
/** /**
* @return the clientId * @return the rescheduleReasonText
*/ */
public Long getClientId() { public String getRescheduleReasonComment() {
return clientId; return rescheduleReasonComment;
} }
/** /**
* @return the recalculateInterest * @return the timeline
*/ **/
public Boolean getRecalculateInterest() { public LoanRescheduleRequestTimelineData getTimeline() {
boolean value = false; return this.timeline;
}
if(recalculateInterest != null) {
value = recalculateInterest; /**
} * @return the adjustedDueDate
*/
return value; public LocalDate getAdjustedDueDate() {
} return adjustedDueDate;
}
/**
* @return the clientName
*/
public String getClientName() {
return clientName;
}
/**
* @return the loanAccountNumber
*/
public String getLoanAccountNumber() {
return loanAccountNumber;
}
/**
* @return the clientId
*/
public Long getClientId() {
return clientId;
}
/**
* @return the recalculateInterest
*/
public Boolean getRecalculateInterest() {
boolean value = false;
if (recalculateInterest != null) {
value = recalculateInterest;
}
return value;
}
} }
@@ -10,28 +10,40 @@ import java.util.List;
import org.mifosplatform.portfolio.loanaccount.rescheduleloan.data.LoanRescheduleRequestData; import org.mifosplatform.portfolio.loanaccount.rescheduleloan.data.LoanRescheduleRequestData;
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 *
* @return a LoanRescheduleRequestData object * @param requestId
**/ * the loan reschedule request identifier
public LoanRescheduleRequestData readLoanRescheduleRequest(Long requestId); * @return a LoanRescheduleRequestData object
**/
/** public LoanRescheduleRequestData readLoanRescheduleRequest(Long requestId);
* get all loan reschedule requests filter by loan ID and status enum
* /**
* @param loanId the loan identifier * get all loan reschedule requests filter by loan ID and status enum
* @return list of LoanRescheduleRequestData objects *
**/ * @param loanId
public List<LoanRescheduleRequestData> readLoanRescheduleRequests(Long loanId, Integer statusEnum); * the loan identifier
* @return list of LoanRescheduleRequestData objects
**/
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,13 @@ 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.Collection;
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;
@@ -29,83 +32,84 @@ import org.springframework.stereotype.Service;
@Service @Service
public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanRescheduleRequestReadPlatformService { public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanRescheduleRequestReadPlatformService {
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
public LoanRescheduleRequestReadPlatformServiceImpl(final RoutingDataSource dataSource, @Autowired
LoanRepository loanRepository) { public LoanRescheduleRequestReadPlatformServiceImpl(final RoutingDataSource dataSource, LoanRepository loanRepository,
this.jdbcTemplate = new JdbcTemplate(dataSource); final CodeValueReadPlatformService codeValueReadPlatformService) {
this.loanRepository = loanRepository; this.jdbcTemplate = new JdbcTemplate(dataSource);
} this.loanRepository = loanRepository;
this.codeValueReadPlatformService = codeValueReadPlatformService;
private static final class LoanRescheduleRequestRowMapper implements RowMapper<LoanRescheduleRequestData> { }
private final String schema; private static final class LoanRescheduleRequestRowMapper implements RowMapper<LoanRescheduleRequestData> {
public LoanRescheduleRequestRowMapper() { private final String schema;
final StringBuilder sqlBuilder = new StringBuilder(200);
public LoanRescheduleRequestRowMapper() {
sqlBuilder.append("lr.id as id, lr.loan_id as loanId, lr.status_enum as statusEnum, "); final StringBuilder sqlBuilder = new StringBuilder(200);
sqlBuilder.append("mc.display_name as clientName, ");
sqlBuilder.append("mc.id as clientId, "); sqlBuilder.append("lr.id as id, lr.loan_id as loanId, lr.status_enum as statusEnum, ");
sqlBuilder.append("ml.account_no as loanAccountNumber, "); sqlBuilder.append("mc.display_name as clientName, ");
sqlBuilder.append("lr.reschedule_from_installment as rescheduleFromInstallment, "); sqlBuilder.append("mc.id as clientId, ");
sqlBuilder.append("lr.grace_on_principal as graceOnPrincipal, "); sqlBuilder.append("ml.account_no as loanAccountNumber, ");
sqlBuilder.append("lr.grace_on_interest as graceOnInterest, "); sqlBuilder.append("lr.reschedule_from_installment as rescheduleFromInstallment, ");
sqlBuilder.append("lr.reschedule_from_date as rescheduleFromDate, "); sqlBuilder.append("lr.grace_on_principal as graceOnPrincipal, ");
sqlBuilder.append("lr.adjusted_due_date as adjustedDueDate, "); sqlBuilder.append("lr.grace_on_interest as graceOnInterest, ");
sqlBuilder.append("lr.extra_terms as extraTerms, "); sqlBuilder.append("lr.reschedule_from_date as rescheduleFromDate, ");
sqlBuilder.append("lr.recalculate_interest as recalculateInterest, "); sqlBuilder.append("lr.adjusted_due_date as adjustedDueDate, ");
sqlBuilder.append("lr.interest_rate as interestRate, "); sqlBuilder.append("lr.extra_terms as extraTerms, ");
sqlBuilder.append("lr.reschedule_reason_cv_id as rescheduleReasonCvId, "); sqlBuilder.append("lr.recalculate_interest as recalculateInterest, ");
sqlBuilder.append("cv.code_value as rescheduleReasonCvValue, "); sqlBuilder.append("lr.interest_rate as interestRate, ");
sqlBuilder.append("lr.reschedule_reason_comment as rescheduleReasonComment, "); sqlBuilder.append("lr.reschedule_reason_cv_id as rescheduleReasonCvId, ");
sqlBuilder.append("cv.code_value as rescheduleReasonCvValue, ");
sqlBuilder.append("lr.submitted_on_date as submittedOnDate, "); sqlBuilder.append("lr.reschedule_reason_comment as rescheduleReasonComment, ");
sqlBuilder.append("sbu.username as submittedByUsername, ");
sqlBuilder.append("sbu.firstname as submittedByFirstname, "); sqlBuilder.append("lr.submitted_on_date as submittedOnDate, ");
sqlBuilder.append("sbu.lastname as submittedByLastname, "); sqlBuilder.append("sbu.username as submittedByUsername, ");
sqlBuilder.append("sbu.firstname as submittedByFirstname, ");
sqlBuilder.append("lr.approved_on_date as approvedOnDate, "); sqlBuilder.append("sbu.lastname as submittedByLastname, ");
sqlBuilder.append("abu.username as approvedByUsername, ");
sqlBuilder.append("abu.firstname as approvedByFirstname, "); sqlBuilder.append("lr.approved_on_date as approvedOnDate, ");
sqlBuilder.append("abu.lastname as approvedByLastname, "); sqlBuilder.append("abu.username as approvedByUsername, ");
sqlBuilder.append("abu.firstname as approvedByFirstname, ");
sqlBuilder.append("lr.rejected_on_date as rejectedOnDate, "); sqlBuilder.append("abu.lastname as approvedByLastname, ");
sqlBuilder.append("rbu.username as rejectedByUsername, ");
sqlBuilder.append("rbu.firstname as rejectedByFirstname, "); sqlBuilder.append("lr.rejected_on_date as rejectedOnDate, ");
sqlBuilder.append("rbu.lastname as rejectedByLastname "); sqlBuilder.append("rbu.username as rejectedByUsername, ");
sqlBuilder.append("rbu.firstname as rejectedByFirstname, ");
sqlBuilder.append("from " + loanRescheduleRequestTableName() + " lr "); sqlBuilder.append("rbu.lastname as rejectedByLastname ");
sqlBuilder.append("left join m_code_value cv on cv.id = lr.reschedule_reason_cv_id ");
sqlBuilder.append("left join m_appuser sbu on sbu.id = lr.submitted_by_user_id "); sqlBuilder.append("from " + loanRescheduleRequestTableName() + " lr ");
sqlBuilder.append("left join m_appuser abu on abu.id = lr.approved_by_user_id "); sqlBuilder.append("left join m_code_value cv on cv.id = lr.reschedule_reason_cv_id ");
sqlBuilder.append("left join m_appuser rbu on rbu.id = lr.rejected_by_user_id "); sqlBuilder.append("left join m_appuser sbu on sbu.id = lr.submitted_by_user_id ");
sqlBuilder.append("left join m_loan ml on ml.id = lr.loan_id "); sqlBuilder.append("left join m_appuser abu on abu.id = lr.approved_by_user_id ");
sqlBuilder.append("left join m_client mc on mc.id = ml.client_id "); sqlBuilder.append("left join m_appuser rbu on rbu.id = lr.rejected_by_user_id ");
sqlBuilder.append("left join m_loan ml on ml.id = lr.loan_id ");
this.schema = sqlBuilder.toString(); sqlBuilder.append("left join m_client mc on mc.id = ml.client_id ");
}
this.schema = sqlBuilder.toString();
public String schema() { }
public String schema() {
return this.schema; return this.schema;
} }
public String loanRescheduleRequestTableName() { public String loanRescheduleRequestTableName() {
return "m_loan_reschedule_request"; return "m_loan_reschedule_request";
} }
@Override @Override
@SuppressWarnings("unused") @SuppressWarnings("unused")
public LoanRescheduleRequestData mapRow(final ResultSet rs, final int rowNum) throws SQLException { public LoanRescheduleRequestData mapRow(final ResultSet rs, final int rowNum) throws SQLException {
final Long id = rs.getLong("id"); final Long id = rs.getLong("id");
final Long loanId = rs.getLong("loanId"); final Long loanId = rs.getLong("loanId");
final Integer statusEnumId = JdbcSupport.getInteger(rs, "statusEnum"); final Integer statusEnumId = JdbcSupport.getInteger(rs, "statusEnum");
final LoanRescheduleRequestStatusEnumData statusEnum = LoanRescheduleRequestEnumerations final LoanRescheduleRequestStatusEnumData statusEnum = LoanRescheduleRequestEnumerations.status(statusEnumId);
.status(statusEnumId);
final String clientName = rs.getString("clientName"); final String clientName = rs.getString("clientName");
final String loanAccountNumber = rs.getString("loanAccountNumber"); final String loanAccountNumber = rs.getString("loanAccountNumber");
final Long clientId = rs.getLong("clientId"); final Long clientId = rs.getLong("clientId");
@@ -118,76 +122,96 @@ public class LoanRescheduleRequestReadPlatformServiceImpl implements LoanResched
final BigDecimal interestRate = rs.getBigDecimal("interestRate"); final BigDecimal interestRate = rs.getBigDecimal("interestRate");
final Long rescheduleReasonCvId = JdbcSupport.getLong(rs, "rescheduleReasonCvId"); final Long rescheduleReasonCvId = JdbcSupport.getLong(rs, "rescheduleReasonCvId");
final String rescheduleReasonCvValue = rs.getString("rescheduleReasonCvValue"); final String rescheduleReasonCvValue = rs.getString("rescheduleReasonCvValue");
final CodeValueData rescheduleReasonCodeValue = CodeValueData final CodeValueData rescheduleReasonCodeValue = CodeValueData.instance(rescheduleReasonCvId, rescheduleReasonCvValue);
.instance(rescheduleReasonCvId, rescheduleReasonCvValue);
final String rescheduleReasonComment = rs.getString("rescheduleReasonComment"); final String rescheduleReasonComment = rs.getString("rescheduleReasonComment");
final Boolean recalculateInterest = rs.getBoolean("recalculateInterest"); final Boolean recalculateInterest = rs.getBoolean("recalculateInterest");
final LocalDate submittedOnDate = JdbcSupport.getLocalDate(rs, "submittedOnDate"); final LocalDate submittedOnDate = JdbcSupport.getLocalDate(rs, "submittedOnDate");
final String submittedByUsername = rs.getString("submittedByUsername"); final String submittedByUsername = rs.getString("submittedByUsername");
final String submittedByFirstname = rs.getString("submittedByFirstname"); final String submittedByFirstname = rs.getString("submittedByFirstname");
final String submittedByLastname = rs.getString("submittedByLastname"); final String submittedByLastname = rs.getString("submittedByLastname");
final LocalDate approvedOnDate = JdbcSupport.getLocalDate(rs, "approvedOnDate"); final LocalDate approvedOnDate = JdbcSupport.getLocalDate(rs, "approvedOnDate");
final String approvedByUsername = rs.getString("approvedByUsername"); final String approvedByUsername = rs.getString("approvedByUsername");
final String approvedByFirstname = rs.getString("approvedByFirstname"); final String approvedByFirstname = rs.getString("approvedByFirstname");
final String approvedByLastname = rs.getString("approvedByLastname"); final String approvedByLastname = rs.getString("approvedByLastname");
final LocalDate rejectedOnDate = JdbcSupport.getLocalDate(rs, "rejectedOnDate"); final LocalDate rejectedOnDate = JdbcSupport.getLocalDate(rs, "rejectedOnDate");
final String rejectedByUsername = rs.getString("rejectedByUsername"); final String rejectedByUsername = rs.getString("rejectedByUsername");
final String rejectedByFirstname = rs.getString("rejectedByFirstname"); final String rejectedByFirstname = rs.getString("rejectedByFirstname");
final String rejectedByLastname = rs.getString("rejectedByLastname"); final String rejectedByLastname = rs.getString("rejectedByLastname");
final Collection<CodeValueData> rescheduleReasons = null;
final LoanRescheduleRequestTimelineData timeline = new LoanRescheduleRequestTimelineData(submittedOnDate, final LoanRescheduleRequestTimelineData timeline = new LoanRescheduleRequestTimelineData(submittedOnDate, submittedByUsername,
submittedByUsername, submittedByFirstname, submittedByLastname, approvedOnDate, approvedByUsername, submittedByFirstname, submittedByLastname, approvedOnDate, approvedByUsername, approvedByFirstname, approvedByLastname,
approvedByFirstname, approvedByLastname, rejectedOnDate, rejectedByUsername, rejectedByFirstname, rejectedOnDate, rejectedByUsername, rejectedByFirstname, rejectedByLastname);
rejectedByLastname);
return LoanRescheduleRequestData.instance(id, loanId, statusEnum, rescheduleFromInstallment, graceOnPrincipal, return LoanRescheduleRequestData.instance(id, loanId, statusEnum, rescheduleFromInstallment, graceOnPrincipal, graceOnInterest,
graceOnInterest, rescheduleFromDate, adjustedDueDate, extraTerms, interestRate, rescheduleReasonCodeValue, rescheduleFromDate, adjustedDueDate, extraTerms, interestRate, rescheduleReasonCodeValue, rescheduleReasonComment,
rescheduleReasonComment, timeline, clientName, loanAccountNumber, clientId, recalculateInterest); timeline, clientName, loanAccountNumber, clientId, recalculateInterest, rescheduleReasons);
}
}
@Override
public List<LoanRescheduleRequestData> readLoanRescheduleRequests(Long loanId) {
final Loan loan = this.loanRepository.findOne(loanId);
if(loan == null) {
throw new LoanNotFoundException(loanId);
} }
final String sql = "select " + this.loanRescheduleRequestRowMapper.schema() + " where lr.loan_id = ?";
return this.jdbcTemplate.query(sql, this.loanRescheduleRequestRowMapper, new Object[] { loanId });
}
@Override }
public LoanRescheduleRequestData readLoanRescheduleRequest(Long requestId) {
try {
final String sql = "select " + this.loanRescheduleRequestRowMapper.schema() + " where lr.id = ?";
return this.jdbcTemplate.queryForObject(sql, this.loanRescheduleRequestRowMapper, new Object[] { requestId });
}
catch(final EmptyResultDataAccessException e) {
return null;
}
}
@Override @Override
public List<LoanRescheduleRequestData> readLoanRescheduleRequests(Long loanId, Integer statusEnum) { public List<LoanRescheduleRequestData> readLoanRescheduleRequests(Long loanId) {
final Loan loan = this.loanRepository.findOne(loanId); final Loan loan = this.loanRepository.findOne(loanId);
if(loan == null) { if (loan == null) { throw new LoanNotFoundException(loanId); }
throw new LoanNotFoundException(loanId);
final String sql = "select " + this.loanRescheduleRequestRowMapper.schema() + " where lr.loan_id = ?";
return this.jdbcTemplate.query(sql, this.loanRescheduleRequestRowMapper, new Object[] { loanId });
}
@Override
public LoanRescheduleRequestData readLoanRescheduleRequest(Long requestId) {
try {
final String sql = "select " + this.loanRescheduleRequestRowMapper.schema() + " where lr.id = ?";
return this.jdbcTemplate.queryForObject(sql, this.loanRescheduleRequestRowMapper, new Object[] { requestId });
} }
final String sql = "select " + this.loanRescheduleRequestRowMapper.schema() + " where lr.loan_id = ?" catch (final EmptyResultDataAccessException e) {
+ " and lr.status_enum = ?"; return null;
}
return this.jdbcTemplate.query(sql, this.loanRescheduleRequestRowMapper, new Object[] { loanId, statusEnum }); }
}
@Override
public List<LoanRescheduleRequestData> readLoanRescheduleRequests(Long loanId, Integer statusEnum) {
final Loan loan = this.loanRepository.findOne(loanId);
if (loan == null) { throw new LoanNotFoundException(loanId); }
final String sql = "select " + this.loanRescheduleRequestRowMapper.schema() + " where lr.loan_id = ?" + " and lr.status_enum = ?";
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));
final Long id = null;
final Long loanId = null;
final LoanRescheduleRequestStatusEnumData statusEnum = null;
final Integer rescheduleFromInstallment = null;
final Integer graceOnPrincipal = null;
final Integer graceOnInterest = null;
final LocalDate rescheduleFromDate = null;
final LocalDate adjustedDueDate = null;
final Integer extraTerms = null;
final BigDecimal interestRate = null;
final CodeValueData rescheduleReasonCodeValue = null;
final String rescheduleReasonComment = null;
final LoanRescheduleRequestTimelineData timeline = null;
final String clientName = null;
final String loanAccountNumber = null;
final Long clientId = null;
final Boolean recalculateInterest = null;
return LoanRescheduleRequestData.instance(id, loanId, statusEnum, rescheduleFromInstallment, graceOnPrincipal, graceOnInterest,
rescheduleFromDate, adjustedDueDate, extraTerms, interestRate, rescheduleReasonCodeValue, rescheduleReasonComment,
timeline, clientName, loanAccountNumber, clientId, recalculateInterest, rescheduleReasons);
}
} }