From bf7783fc9483616325b3d21014ea7e71040268ec Mon Sep 17 00:00:00 2001 From: Keith Woodlock Date: Wed, 16 May 2012 01:42:54 +0100 Subject: [PATCH] move functionality around new loan application to loan resource. --- .../data/NewLoanWorkflowStepOneData.java | 49 ++++++++ .../org/mifosng/ui/CommonRestOperations.java | 5 - .../mifosng/ui/CommonRestOperationsImpl.java | 44 ------- .../ApplicationPagesRoutesController.java | 18 +++ .../org/mifosng/ui/loan/LoanController.java | 32 ----- .../views/client/viewClientAccount.jsp | 1 + .../WEB-INF/views/newloanapplication.jsp | 113 +++++++++++------- .../webapp/WEB-INF/views/view-templates.jsp | 9 +- .../mifosng/platform/ReadPlatformService.java | 3 - .../platform/ReadPlatformServiceImpl.java | 54 --------- .../platform/api/LoansApiResource.java | 13 ++ .../loan/service/LoanReadPlatformService.java | 3 + .../service/LoanReadPlatformServiceImpl.java | 62 +++++++++- .../mifosng/platform/rest/LoanResource.java | 48 -------- 14 files changed, 218 insertions(+), 236 deletions(-) diff --git a/mifosng-data/src/main/java/org/mifosng/data/NewLoanWorkflowStepOneData.java b/mifosng-data/src/main/java/org/mifosng/data/NewLoanWorkflowStepOneData.java index 162abe705..6fc0cbbd7 100644 --- a/mifosng-data/src/main/java/org/mifosng/data/NewLoanWorkflowStepOneData.java +++ b/mifosng-data/src/main/java/org/mifosng/data/NewLoanWorkflowStepOneData.java @@ -21,12 +21,18 @@ public class NewLoanWorkflowStepOneData implements Serializable { private List allowedProducts = new ArrayList(); // extra + private String dateFormat; + private String submittedOnDateFormatted; private LocalDate submittedOnDate; private String submittedOnNote = ""; + private String expectedDisbursementDateFormatted; private LocalDate expectedDisbursementDate = new LocalDate(); + + private String repaymentsStartingFromDateFormatted; private LocalDate repaymentsStartingFromDate; + private String interestCalculatedFromDateFormatted; private LocalDate interestCalculatedFromDate; private LoanSchedule repaymentSchedule; @@ -148,4 +154,47 @@ public class NewLoanWorkflowStepOneData implements Serializable { public void setRepaymentSchedule(LoanSchedule repaymentSchedule) { this.repaymentSchedule = repaymentSchedule; } + + public String getDateFormat() { + return dateFormat; + } + + public void setDateFormat(String dateFormat) { + this.dateFormat = dateFormat; + } + + public String getSubmittedOnDateFormatted() { + return submittedOnDateFormatted; + } + + public void setSubmittedOnDateFormatted(String submittedOnDateFormatted) { + this.submittedOnDateFormatted = submittedOnDateFormatted; + } + + public String getExpectedDisbursementDateFormatted() { + return expectedDisbursementDateFormatted; + } + + public void setExpectedDisbursementDateFormatted( + String expectedDisbursementDateFormatted) { + this.expectedDisbursementDateFormatted = expectedDisbursementDateFormatted; + } + + public String getRepaymentsStartingFromDateFormatted() { + return repaymentsStartingFromDateFormatted; + } + + public void setRepaymentsStartingFromDateFormatted( + String repaymentsStartingFromDateFormatted) { + this.repaymentsStartingFromDateFormatted = repaymentsStartingFromDateFormatted; + } + + public String getInterestCalculatedFromDateFormatted() { + return interestCalculatedFromDateFormatted; + } + + public void setInterestCalculatedFromDateFormatted( + String interestCalculatedFromDateFormatted) { + this.interestCalculatedFromDateFormatted = interestCalculatedFromDateFormatted; + } } \ No newline at end of file diff --git a/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/CommonRestOperations.java b/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/CommonRestOperations.java index b718b4b0a..5f6efe356 100644 --- a/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/CommonRestOperations.java +++ b/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/CommonRestOperations.java @@ -6,7 +6,6 @@ import org.mifosng.data.EntityIdentifier; import org.mifosng.data.LoanProductData; import org.mifosng.data.LoanRepaymentData; import org.mifosng.data.LoanSchedule; -import org.mifosng.data.NewLoanWorkflowStepOneData; import org.mifosng.data.command.AdjustLoanTransactionCommand; import org.mifosng.data.command.CalculateLoanScheduleCommand; import org.mifosng.data.command.LoanStateTransitionCommand; @@ -26,8 +25,6 @@ public interface CommonRestOperations { LoanSchedule calculateLoanSchedule(CalculateLoanScheduleCommand command); - NewLoanWorkflowStepOneData retrieveNewLoanApplicationStepOneDetails(Long clientId); - Long submitLoanApplication(SubmitLoanApplicationCommand command); EntityIdentifier deleteLoan(Long loanId); @@ -55,6 +52,4 @@ public interface CommonRestOperations { LoanRepaymentData retrieveNewLoanWaiverDetails(Long loanId); EntityIdentifier waiveLoanAmount(LoanTransactionCommand command); - - NewLoanWorkflowStepOneData retrieveNewLoanApplicationDetails(Long clientId, Long productId); } \ No newline at end of file diff --git a/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/CommonRestOperationsImpl.java b/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/CommonRestOperationsImpl.java index 2077f147d..4e4267a85 100644 --- a/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/CommonRestOperationsImpl.java +++ b/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/CommonRestOperationsImpl.java @@ -14,7 +14,6 @@ import org.mifosng.data.LoanProductData; import org.mifosng.data.LoanProductList; import org.mifosng.data.LoanRepaymentData; import org.mifosng.data.LoanSchedule; -import org.mifosng.data.NewLoanWorkflowStepOneData; import org.mifosng.data.command.AdjustLoanTransactionCommand; import org.mifosng.data.command.CalculateLoanScheduleCommand; import org.mifosng.data.command.LoanStateTransitionCommand; @@ -138,49 +137,6 @@ public class CommonRestOperationsImpl implements CommonRestOperations { } } - @Override - public NewLoanWorkflowStepOneData retrieveNewLoanApplicationStepOneDetails( - final Long clientId) { - try { - URI restUri = URI.create(getBaseServerUrl().concat( - "api/protected/loan/new/" + clientId.toString() - + "/workflow/one")); - - ResponseEntity s = this.oauthRestServiceTemplate - .exchange(restUri, HttpMethod.GET, emptyRequest(), - NewLoanWorkflowStepOneData.class); - - // for now ensure user must select product on step one (even if - // there is only one product!) - NewLoanWorkflowStepOneData data = s.getBody(); - data.setProductId(null); - - return s.getBody(); - } catch (HttpStatusCodeException e) { - ErrorResponseList errorList = parseErrors(e); - throw new ClientValidationException(errorList.getErrors()); - } - } - - @Override - public NewLoanWorkflowStepOneData retrieveNewLoanApplicationDetails( - Long clientId, Long productId) { - try { - URI restUri = URI.create(getBaseServerUrl().concat( - "api/protected/loan/new/" + clientId.toString() - + "/product/" + productId.toString())); - - ResponseEntity s = this.oauthRestServiceTemplate - .exchange(restUri, HttpMethod.GET, emptyRequest(), - NewLoanWorkflowStepOneData.class); - - return s.getBody(); - } catch (HttpStatusCodeException e) { - ErrorResponseList errorList = parseErrors(e); - throw new ClientValidationException(errorList.getErrors()); - } - } - @Override public Long submitLoanApplication(final SubmitLoanApplicationCommand command) { try { diff --git a/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/admin/ApplicationPagesRoutesController.java b/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/admin/ApplicationPagesRoutesController.java index a0c61f39a..2c737c157 100644 --- a/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/admin/ApplicationPagesRoutesController.java +++ b/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/admin/ApplicationPagesRoutesController.java @@ -1,8 +1,12 @@ package org.mifosng.ui.admin; +import java.security.Principal; + +import org.mifosng.oauth.ConsumerUserDetails; import org.mifosng.ui.reporting.ReportingRestOperations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -71,4 +75,18 @@ public class ApplicationPagesRoutesController { public String userSettingsScreen() { return "admin/accountsettings"; } + + @RequestMapping(value = "/portfolio/client/{clientId}/loan/new", method = RequestMethod.GET) + public String loadLoanCreationWorkflow(final Model model, @PathVariable("clientId") final Long clientId, final Principal principal) { + + UsernamePasswordAuthenticationToken authenticationToken = (UsernamePasswordAuthenticationToken) principal; + ConsumerUserDetails user = (ConsumerUserDetails) authenticationToken.getPrincipal(); + if (user.hasNoAuthorityToSumitLoanApplication()) { + throw new AccessDeniedException(""); + } + + model.addAttribute("clientId", clientId); + + return "newloanapplication"; + } } \ No newline at end of file diff --git a/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/loan/LoanController.java b/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/loan/LoanController.java index 34aa6dec8..8bd49369e 100644 --- a/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/loan/LoanController.java +++ b/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/loan/LoanController.java @@ -1,7 +1,6 @@ package org.mifosng.ui.loan; import java.math.BigDecimal; -import java.security.Principal; import java.text.NumberFormat; import java.text.ParseException; import java.util.ArrayList; @@ -17,20 +16,15 @@ import org.joda.time.format.DateTimeFormat; import org.mifosng.data.EntityIdentifier; import org.mifosng.data.ErrorResponse; import org.mifosng.data.LoanSchedule; -import org.mifosng.data.NewLoanWorkflowStepOneData; import org.mifosng.data.command.CalculateLoanScheduleCommand; import org.mifosng.data.command.SubmitLoanApplicationCommand; -import org.mifosng.oauth.ConsumerUserDetails; import org.mifosng.ui.CommonRestOperations; import org.mifosng.ui.loanproduct.ClientValidationException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.security.access.AccessDeniedException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @@ -97,20 +91,6 @@ public class LoanController { } } - @RequestMapping(value = "/portfolio/client/{clientId}/loan/new", method = RequestMethod.GET) - public String loadLoanCreationWorkflow(final Model model, @PathVariable("clientId") final Long clientId, final Principal principal) { - - UsernamePasswordAuthenticationToken authenticationToken = (UsernamePasswordAuthenticationToken) principal; - ConsumerUserDetails user = (ConsumerUserDetails) authenticationToken.getPrincipal(); - if (user.hasNoAuthorityToSumitLoanApplication()) { - throw new AccessDeniedException(""); - } - - model.addAttribute("clientId", clientId); - - return "newloanapplication"; - } - @RequestMapping(consumes="application/x-www-form-urlencoded", produces="application/json", value = "/portfolio/client/{clientId}/loan/new", method = RequestMethod.POST) public @ResponseBody EntityIdentifier submitNewLoanApplication( @RequestParam(value="clientId", required=false) Long applicantId, @@ -196,16 +176,4 @@ public class LoanController { return this.commonRestOperations.calculateLoanSchedule(command); } - - @RequestMapping(consumes="application/json", produces="application/json", value = "/portfolio/client/{clientId}/product/{productId}/new", method = RequestMethod.GET) - public @ResponseBody NewLoanWorkflowStepOneData retrieveNewLoan(@PathVariable("clientId") Long clientId, @PathVariable("productId") Long productId) { - - return this.commonRestOperations.retrieveNewLoanApplicationDetails(clientId, productId); - } - - @RequestMapping(consumes="application/json", produces="application/json", value = "/portfolio/client/{clientId}/loan/new/workflow/one", method = RequestMethod.GET) - public @ResponseBody NewLoanWorkflowStepOneData retrieveNewLoan(@PathVariable("clientId") Long clientId) { - - return this.commonRestOperations.retrieveNewLoanApplicationStepOneDetails(clientId); - } } \ No newline at end of file diff --git a/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/client/viewClientAccount.jsp b/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/client/viewClientAccount.jsp index 561698151..91fadb97e 100644 --- a/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/client/viewClientAccount.jsp +++ b/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/client/viewClientAccount.jsp @@ -461,6 +461,7 @@ $(document).ready(function() { $('.newloanbtn').button().click(function(e) { var linkId = this.id; var clientId = linkId.replace("newloanbtn", ""); + // switch to jsp page focussed on new loan application flow. var url = '${rootContext}portfolio/client/' + clientId + '/loan/new'; window.location.href = url; e.preventDefault(); diff --git a/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/newloanapplication.jsp b/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/newloanapplication.jsp index 47d771947..df8090c32 100644 --- a/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/newloanapplication.jsp +++ b/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/newloanapplication.jsp @@ -10,11 +10,10 @@ -