remove need for undo resource - align undo of state transitions with state transitions allowing for note to be added through ui.
This commit is contained in:
@@ -1,25 +0,0 @@
|
|||||||
package org.mifosng.data.command;
|
|
||||||
|
|
||||||
import javax.xml.bind.annotation.XmlRootElement;
|
|
||||||
|
|
||||||
@XmlRootElement
|
|
||||||
public class UndoLoanApprovalCommand {
|
|
||||||
|
|
||||||
private Long loanId;
|
|
||||||
|
|
||||||
protected UndoLoanApprovalCommand() {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
public UndoLoanApprovalCommand(final Long loanId) {
|
|
||||||
this.loanId = loanId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getLoanId() {
|
|
||||||
return this.loanId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLoanId(final Long loanId) {
|
|
||||||
this.loanId = loanId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
package org.mifosng.data.command;
|
|
||||||
|
|
||||||
import javax.xml.bind.annotation.XmlRootElement;
|
|
||||||
|
|
||||||
@XmlRootElement
|
|
||||||
public class UndoLoanDisbursalCommand {
|
|
||||||
|
|
||||||
private Long loanId;
|
|
||||||
|
|
||||||
protected UndoLoanDisbursalCommand() {
|
|
||||||
//
|
|
||||||
}
|
|
||||||
|
|
||||||
public UndoLoanDisbursalCommand(final Long loanId) {
|
|
||||||
this.loanId = loanId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long getLoanId() {
|
|
||||||
return this.loanId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLoanId(final Long loanId) {
|
|
||||||
this.loanId = loanId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package org.mifosng.data.command;
|
||||||
|
|
||||||
|
|
||||||
|
public class UndoStateTransitionCommand {
|
||||||
|
|
||||||
|
private Long loanId;
|
||||||
|
private String comment;
|
||||||
|
|
||||||
|
protected UndoStateTransitionCommand() {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
public UndoStateTransitionCommand(final Long loanId, final String comment) {
|
||||||
|
this.loanId = loanId;
|
||||||
|
this.comment = comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getLoanId() {
|
||||||
|
return this.loanId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoanId(final Long loanId) {
|
||||||
|
this.loanId = loanId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getComment() {
|
||||||
|
return comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setComment(String comment) {
|
||||||
|
this.comment = comment;
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-4
@@ -115,16 +115,13 @@ validation.msg.loan.repayment.must.be.greater.than.zero=The repayment amount mus
|
|||||||
validation.msg.loan.adjustment.must.be.zero.or.greater=The repayment amount must be a number greater than or equal to zero.
|
validation.msg.loan.adjustment.must.be.zero.or.greater=The repayment amount must be a number greater than or equal to zero.
|
||||||
|
|
||||||
# loan event and transactions screens
|
# loan event and transactions screens
|
||||||
|
label.loan.on=On:
|
||||||
label.loan.action.note=Note:
|
label.loan.action.note=Note:
|
||||||
dialog.title.reject.loan=Reject loan
|
dialog.title.reject.loan=Reject loan
|
||||||
label.loan.rejected.on=Rejected on:
|
|
||||||
dialog.title.loan.withdrawn.by.client=Withdrawn by client
|
dialog.title.loan.withdrawn.by.client=Withdrawn by client
|
||||||
label.loan.withdrawn.by.client.on=Withdrawn on:
|
|
||||||
dialog.title.approve.loan=Approve loan
|
dialog.title.approve.loan=Approve loan
|
||||||
label.loan.approved.on=Approved on:
|
|
||||||
dialog.title.undo.loan.approval=Undo loan approval: confirmation required
|
dialog.title.undo.loan.approval=Undo loan approval: confirmation required
|
||||||
dialog.title.disburse.loan=Disburse loan
|
dialog.title.disburse.loan=Disburse loan
|
||||||
label.loan.disbursed.on=Disbursed on:
|
|
||||||
dialog.title.undo.loan.disbursal=Undo loan disbursal: confirmation required
|
dialog.title.undo.loan.disbursal=Undo loan disbursal: confirmation required
|
||||||
dialog.title.loan.repayment=Loan repayment
|
dialog.title.loan.repayment=Loan repayment
|
||||||
dialog.title.adjust.loan.repayment=Adjust loan repayment
|
dialog.title.adjust.loan.repayment=Adjust loan repayment
|
||||||
|
|||||||
+1
-4
@@ -114,16 +114,13 @@ validation.msg.loan.repayment.must.be.greater.than.zero=The repayment amount mus
|
|||||||
validation.msg.loan.adjustment.must.be.zero.or.greater=The repayment amount must be a number greater than or equal to zero.(fr)
|
validation.msg.loan.adjustment.must.be.zero.or.greater=The repayment amount must be a number greater than or equal to zero.(fr)
|
||||||
|
|
||||||
# loan event and transactions screens
|
# loan event and transactions screens
|
||||||
|
label.loan.on=On:(fr)
|
||||||
label.loan.action.note=Note:(fr)
|
label.loan.action.note=Note:(fr)
|
||||||
dialog.title.reject.loan=Reject loan(fr)
|
dialog.title.reject.loan=Reject loan(fr)
|
||||||
label.loan.rejected.on=Rejected on:(fr)
|
|
||||||
dialog.title.loan.withdrawn.by.client=Withdrawn by client(fr)
|
dialog.title.loan.withdrawn.by.client=Withdrawn by client(fr)
|
||||||
label.loan.withdrawn.by.client.on=Withdrawn on:(fr)
|
|
||||||
dialog.title.approve.loan=Approve loan(fr)
|
dialog.title.approve.loan=Approve loan(fr)
|
||||||
label.loan.approved.on=Approved on:(fr)
|
|
||||||
dialog.title.undo.loan.approval=Undo loan approval: confirmation required(fr)
|
dialog.title.undo.loan.approval=Undo loan approval: confirmation required(fr)
|
||||||
dialog.title.disburse.loan=Disburse loan(fr)
|
dialog.title.disburse.loan=Disburse loan(fr)
|
||||||
label.loan.disbursed.on=Disbursed on:(fr)
|
|
||||||
dialog.title.undo.loan.disbursal=Undo loan disbursal: confirmation required(fr)
|
dialog.title.undo.loan.disbursal=Undo loan disbursal: confirmation required(fr)
|
||||||
dialog.title.loan.repayment=Loan repayment(fr)
|
dialog.title.loan.repayment=Loan repayment(fr)
|
||||||
dialog.title.adjust.loan.repayment=Adjust loan repayment(fr)
|
dialog.title.adjust.loan.repayment=Adjust loan repayment(fr)
|
||||||
|
|||||||
+28
-26
@@ -240,7 +240,6 @@ $(document).ready(function() {
|
|||||||
contentType: 'application/json',
|
contentType: 'application/json',
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
beforeSend: function(xhr) {
|
beforeSend: function(xhr) {
|
||||||
console.log("base64: " + base64);
|
|
||||||
xhr.setRequestHeader("Authorization", "Basic " + base64);
|
xhr.setRequestHeader("Authorization", "Basic " + base64);
|
||||||
},
|
},
|
||||||
success: function(data, textStatus, jqXHR) {
|
success: function(data, textStatus, jqXHR) {
|
||||||
@@ -594,8 +593,21 @@ $(document).ready(function() {
|
|||||||
});
|
});
|
||||||
$('button.approveloan span').text(jQuery.i18n.prop('dialog.button.approve.loan'));
|
$('button.approveloan span').text(jQuery.i18n.prop('dialog.button.approve.loan'));
|
||||||
|
|
||||||
$('.deleteloan').button().click(function(e) {
|
$('.undoapproveloan').button().click(function(e) {
|
||||||
|
|
||||||
|
var linkId = this.id;
|
||||||
|
var loanId = linkId.replace("undoapprovebtn", "");
|
||||||
|
var postUrl = baseApiUrl + 'loans/' + loanId + '?command=undoapproval';
|
||||||
|
var templateSelector = "#undoStateTransitionLoanFormTemplate";
|
||||||
|
var width = 500;
|
||||||
|
var height = 350;
|
||||||
|
var defaultOffset = offsetToSubmittedDate;
|
||||||
|
popupDialogWithPostOnlyFormView(postUrl, 'dialog.title.undo.loan.approval', templateSelector, width, height, currentTabIndex, offsetToSubmittedDate, defaultOffset, maxOffset)
|
||||||
|
e.preventDefault();
|
||||||
|
});
|
||||||
|
$('button.undoapproveloan span').text(jQuery.i18n.prop('dialog.button.undo.loan.approval'));
|
||||||
|
|
||||||
|
$('.deleteloan').button().click(function(e) {
|
||||||
var linkId = this.id;
|
var linkId = this.id;
|
||||||
var loanId = linkId.replace("deletebtn", "");
|
var loanId = linkId.replace("deletebtn", "");
|
||||||
var url = baseApiUrl + 'loans/' + loanId;
|
var url = baseApiUrl + 'loans/' + loanId;
|
||||||
@@ -609,30 +621,6 @@ $(document).ready(function() {
|
|||||||
});
|
});
|
||||||
$('button.deleteloan span').text(jQuery.i18n.prop('dialog.button.delete.loan'));
|
$('button.deleteloan span').text(jQuery.i18n.prop('dialog.button.delete.loan'));
|
||||||
|
|
||||||
$('.undoapproveloan').button().click(function(e) {
|
|
||||||
|
|
||||||
var linkId = this.id;
|
|
||||||
var loanId = linkId.replace("undoapprovebtn", "");
|
|
||||||
var postUrl = baseApiUrl + 'loans/' + loanId + '/undo?command=undoapproval';
|
|
||||||
var width = 400;
|
|
||||||
var height = 225;
|
|
||||||
popupConfirmationDialogAndPost(postUrl, 'POST', 'dialog.title.undo.loan.approval', width, height, currentTabIndex);
|
|
||||||
e.preventDefault();
|
|
||||||
});
|
|
||||||
$('button.undoapproveloan span').text(jQuery.i18n.prop('dialog.button.undo.loan.approval'));
|
|
||||||
|
|
||||||
$('.undodisbursalloan').button().click(function(e) {
|
|
||||||
|
|
||||||
var linkId = this.id;
|
|
||||||
var loanId = linkId.replace("undodisbursalbtn", "");
|
|
||||||
var postUrl = baseApiUrl + 'loans/' + loanId + '/undo?command=undodisbursal';
|
|
||||||
var width = 400;
|
|
||||||
var height = 150;
|
|
||||||
popupConfirmationDialogAndPost(postUrl, 'POST', 'dialog.title.undo.loan.disbursal', width, height, currentTabIndex);
|
|
||||||
e.preventDefault();
|
|
||||||
});
|
|
||||||
$('button.undodisbursalloan span').text(jQuery.i18n.prop('dialog.button.undo.loan.disbursal'));
|
|
||||||
|
|
||||||
$('.disburseloan').button().click(function(e) {
|
$('.disburseloan').button().click(function(e) {
|
||||||
|
|
||||||
var linkId = this.id;
|
var linkId = this.id;
|
||||||
@@ -647,6 +635,20 @@ $(document).ready(function() {
|
|||||||
});
|
});
|
||||||
$('button.disburseloan span').text(jQuery.i18n.prop('dialog.button.disburse.loan'));
|
$('button.disburseloan span').text(jQuery.i18n.prop('dialog.button.disburse.loan'));
|
||||||
|
|
||||||
|
$('.undodisbursalloan').button().click(function(e) {
|
||||||
|
|
||||||
|
var linkId = this.id;
|
||||||
|
var loanId = linkId.replace("undodisbursalbtn", "");
|
||||||
|
var postUrl = baseApiUrl + 'loans/' + loanId + '?command=undodisbursal';
|
||||||
|
var templateSelector = "#undoStateTransitionLoanFormTemplate";
|
||||||
|
var width = 500;
|
||||||
|
var height = 350;
|
||||||
|
var defaultOffset = offsetToApprovalDate;
|
||||||
|
popupDialogWithPostOnlyFormView(postUrl, 'dialog.title.undo.loan.disbursal', templateSelector, width, height, currentTabIndex, offsetToSubmittedDate, defaultOffset, maxOffset)
|
||||||
|
e.preventDefault();
|
||||||
|
});
|
||||||
|
$('button.undodisbursalloan span').text(jQuery.i18n.prop('dialog.button.undo.loan.disbursal'));
|
||||||
|
|
||||||
$('.repaymentloan').button().click(function(e) {
|
$('.repaymentloan').button().click(function(e) {
|
||||||
|
|
||||||
var linkId = this.id;
|
var linkId = this.id;
|
||||||
|
|||||||
@@ -804,7 +804,7 @@
|
|||||||
<div id="formerrors"></div>
|
<div id="formerrors"></div>
|
||||||
|
|
||||||
<input type="hidden" id="dateFormat" name="dateFormat" value="dd MMMM yyyy" />
|
<input type="hidden" id="dateFormat" name="dateFormat" value="dd MMMM yyyy" />
|
||||||
<label for="eventDateFormatted"><spring:message code="label.loan.rejected.on"/></label>
|
<label for="eventDateFormatted"><spring:message code="label.loan.on"/></label>
|
||||||
<input id="eventDateFormatted" name="eventDateFormatted" title="" class="datepickerfield" />
|
<input id="eventDateFormatted" name="eventDateFormatted" title="" class="datepickerfield" />
|
||||||
|
|
||||||
<label for="comment"><spring:message code="label.loan.action.note"/></label>
|
<label for="comment"><spring:message code="label.loan.action.note"/></label>
|
||||||
@@ -812,6 +812,15 @@
|
|||||||
</form>
|
</form>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<script id="undoStateTransitionLoanFormTemplate" type="text/x-jquery-tmpl">
|
||||||
|
<form id="entityform">
|
||||||
|
<div id="formerrors"></div>
|
||||||
|
|
||||||
|
<label for="comment"><spring:message code="label.loan.action.note"/></label>
|
||||||
|
<textarea rows="6" cols="53" id="comment" name="comment"></textarea>
|
||||||
|
</form>
|
||||||
|
</script>
|
||||||
|
|
||||||
<script id="transactionLoanFormTemplate" type="text/x-jquery-tmpl">
|
<script id="transactionLoanFormTemplate" type="text/x-jquery-tmpl">
|
||||||
<form id="entityform">
|
<form id="entityform">
|
||||||
<div id="formerrors"></div>
|
<div id="formerrors"></div>
|
||||||
|
|||||||
@@ -29,10 +29,10 @@ import org.mifosng.data.command.CalculateLoanScheduleCommand;
|
|||||||
import org.mifosng.data.command.LoanStateTransitionCommand;
|
import org.mifosng.data.command.LoanStateTransitionCommand;
|
||||||
import org.mifosng.data.command.LoanTransactionCommand;
|
import org.mifosng.data.command.LoanTransactionCommand;
|
||||||
import org.mifosng.data.command.SubmitLoanApplicationCommand;
|
import org.mifosng.data.command.SubmitLoanApplicationCommand;
|
||||||
import org.mifosng.data.command.UndoLoanApprovalCommand;
|
import org.mifosng.data.command.UndoStateTransitionCommand;
|
||||||
import org.mifosng.data.command.UndoLoanDisbursalCommand;
|
|
||||||
import org.mifosng.platform.api.infrastructure.ApiDataConversionService;
|
import org.mifosng.platform.api.infrastructure.ApiDataConversionService;
|
||||||
import org.mifosng.platform.api.infrastructure.ApiJSONFormattingService;
|
import org.mifosng.platform.api.infrastructure.ApiJSONFormattingService;
|
||||||
|
import org.mifosng.platform.exceptions.UnrecognizedQueryParamException;
|
||||||
import org.mifosng.platform.loan.service.CalculationPlatformService;
|
import org.mifosng.platform.loan.service.CalculationPlatformService;
|
||||||
import org.mifosng.platform.loan.service.LoanReadPlatformService;
|
import org.mifosng.platform.loan.service.LoanReadPlatformService;
|
||||||
import org.mifosng.platform.loan.service.LoanWritePlatformService;
|
import org.mifosng.platform.loan.service.LoanWritePlatformService;
|
||||||
@@ -70,8 +70,8 @@ public class LoansApiResource {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("template")
|
@Path("template")
|
||||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||||
@Produces({ MediaType.APPLICATION_JSON })
|
@Produces({ MediaType.APPLICATION_JSON})
|
||||||
public String retrieveDetailsForNewLoanApplicationStepOne(
|
public String retrieveDetailsForNewLoanApplicationStepOne(
|
||||||
@QueryParam("clientId") final Long clientId,
|
@QueryParam("clientId") final Long clientId,
|
||||||
@QueryParam("productId") final Long productId,
|
@QueryParam("productId") final Long productId,
|
||||||
@@ -88,8 +88,8 @@ public class LoansApiResource {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("{loanId}")
|
@Path("{loanId}")
|
||||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||||
@Produces({ MediaType.APPLICATION_JSON })
|
@Produces({ MediaType.APPLICATION_JSON})
|
||||||
public String retrieveLoanAccountDetails(
|
public String retrieveLoanAccountDetails(
|
||||||
@PathParam("loanId") final Long loanId, @Context UriInfo uriInfo) {
|
@PathParam("loanId") final Long loanId, @Context UriInfo uriInfo) {
|
||||||
|
|
||||||
@@ -103,8 +103,8 @@ public class LoansApiResource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||||
@Produces({ MediaType.APPLICATION_JSON })
|
@Produces({ MediaType.APPLICATION_JSON})
|
||||||
public Response calculateLoanSchedule(
|
public Response calculateLoanSchedule(
|
||||||
@QueryParam("command") final String commandParam,
|
@QueryParam("command") final String commandParam,
|
||||||
final SubmitLoanApplicationCommand command) {
|
final SubmitLoanApplicationCommand command) {
|
||||||
@@ -170,8 +170,8 @@ public class LoansApiResource {
|
|||||||
|
|
||||||
@DELETE
|
@DELETE
|
||||||
@Path("{loanId}")
|
@Path("{loanId}")
|
||||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||||
@Produces({ MediaType.APPLICATION_JSON })
|
@Produces({ MediaType.APPLICATION_JSON})
|
||||||
public Response deleteLoanApplication(@PathParam("loanId") final Long loanId) {
|
public Response deleteLoanApplication(@PathParam("loanId") final Long loanId) {
|
||||||
|
|
||||||
EntityIdentifier identifier = this.loanWritePlatformService
|
EntityIdentifier identifier = this.loanWritePlatformService
|
||||||
@@ -182,10 +182,9 @@ public class LoansApiResource {
|
|||||||
|
|
||||||
@POST
|
@POST
|
||||||
@Path("{loanId}")
|
@Path("{loanId}")
|
||||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||||
@Produces({ MediaType.APPLICATION_JSON })
|
@Produces({ MediaType.APPLICATION_JSON})
|
||||||
public Response stateTransitions(@PathParam("loanId") final Long loanId,
|
public Response stateTransitions(@PathParam("loanId") final Long loanId, @QueryParam("command") final String commandParam,
|
||||||
@QueryParam("command") final String commandParam,
|
|
||||||
final LoanStateTransitionCommand command) {
|
final LoanStateTransitionCommand command) {
|
||||||
|
|
||||||
LocalDate eventDate = this.apiDataConversionService.convertFrom(
|
LocalDate eventDate = this.apiDataConversionService.convertFrom(
|
||||||
@@ -194,63 +193,47 @@ public class LoansApiResource {
|
|||||||
|
|
||||||
command.setLoanId(loanId);
|
command.setLoanId(loanId);
|
||||||
command.setEventDate(eventDate);
|
command.setEventDate(eventDate);
|
||||||
|
|
||||||
|
Response response = null;
|
||||||
|
|
||||||
if (StringUtils.isNotBlank(commandParam)
|
if (is(commandParam, "reject")) {
|
||||||
&& commandParam.trim().equalsIgnoreCase("reject")) {
|
EntityIdentifier identifier = this.loanWritePlatformService.rejectLoan(command);
|
||||||
EntityIdentifier identifier = this.loanWritePlatformService
|
response = Response.ok().entity(identifier).build();
|
||||||
.rejectLoan(command);
|
} else if (is(commandParam, "withdrewbyclient")) {
|
||||||
return Response.ok().entity(identifier).build();
|
EntityIdentifier identifier = this.loanWritePlatformService.withdrawLoan(command);
|
||||||
} else if (StringUtils.isNotBlank(commandParam)
|
response = Response.ok().entity(identifier).build();
|
||||||
&& commandParam.trim().equalsIgnoreCase("withdrewbyclient")) {
|
} else if (is(commandParam, "approve")) {
|
||||||
EntityIdentifier identifier = this.loanWritePlatformService
|
EntityIdentifier identifier = this.loanWritePlatformService.approveLoanApplication(command);
|
||||||
.withdrawLoan(command);
|
response = Response.ok().entity(identifier).build();
|
||||||
return Response.ok().entity(identifier).build();
|
} else if (is(commandParam, "disburse")) {
|
||||||
} else if (StringUtils.isNotBlank(commandParam)
|
EntityIdentifier identifier = this.loanWritePlatformService.disburseLoan(command);
|
||||||
&& commandParam.trim().equalsIgnoreCase("approve")) {
|
response = Response.ok().entity(identifier).build();
|
||||||
EntityIdentifier identifier = this.loanWritePlatformService
|
}
|
||||||
.approveLoanApplication(command);
|
|
||||||
return Response.ok().entity(identifier).build();
|
UndoStateTransitionCommand undoCommand = new UndoStateTransitionCommand(loanId, command.getComment());
|
||||||
} else if (StringUtils.isNotBlank(commandParam)
|
if (is(commandParam, "undoapproval")) {
|
||||||
&& commandParam.trim().equalsIgnoreCase("disburse")) {
|
EntityIdentifier identifier = this.loanWritePlatformService.undoLoanApproval(undoCommand);
|
||||||
EntityIdentifier identifier = this.loanWritePlatformService
|
response = Response.ok().entity(identifier).build();
|
||||||
.disburseLoan(command);
|
} else if (is(commandParam, "undodisbursal")) {
|
||||||
return Response.ok().entity(identifier).build();
|
EntityIdentifier identifier = this.loanWritePlatformService.undoLoanDisbursal(undoCommand);
|
||||||
|
response = Response.ok().entity(identifier).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response == null) {
|
||||||
|
throw new UnrecognizedQueryParamException("command", commandParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Response.ok().build();
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
@POST
|
private boolean is(final String commandParam, final String commandValue) {
|
||||||
@Path("{loanId}/undo")
|
return StringUtils.isNotBlank(commandParam) && commandParam.trim().equalsIgnoreCase(commandValue);
|
||||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
|
||||||
@Produces({ MediaType.APPLICATION_JSON })
|
|
||||||
public Response undoStateTransitions(
|
|
||||||
@PathParam("loanId") final Long loanId,
|
|
||||||
@QueryParam("command") final String commandParam) {
|
|
||||||
|
|
||||||
if (StringUtils.isNotBlank(commandParam)
|
|
||||||
&& commandParam.trim().equalsIgnoreCase("undoapproval")) {
|
|
||||||
UndoLoanApprovalCommand undoCommand = new UndoLoanApprovalCommand(
|
|
||||||
loanId);
|
|
||||||
EntityIdentifier identifier = this.loanWritePlatformService
|
|
||||||
.undoLoanApproval(undoCommand);
|
|
||||||
return Response.ok().entity(identifier).build();
|
|
||||||
} else if (StringUtils.isNotBlank(commandParam)
|
|
||||||
&& commandParam.trim().equalsIgnoreCase("undodisbursal")) {
|
|
||||||
UndoLoanDisbursalCommand undoCommand = new UndoLoanDisbursalCommand(
|
|
||||||
loanId);
|
|
||||||
EntityIdentifier identifier = this.loanWritePlatformService
|
|
||||||
.undloLoanDisbursal(undoCommand);
|
|
||||||
return Response.ok().entity(identifier).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
return Response.ok().build();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
@Path("{loanId}/transactions")
|
@Path("{loanId}/transactions")
|
||||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||||
@Produces({ MediaType.APPLICATION_JSON })
|
@Produces({ MediaType.APPLICATION_JSON})
|
||||||
public Response executeLoanTransaction(
|
public Response executeLoanTransaction(
|
||||||
@PathParam("loanId") final Long loanId,
|
@PathParam("loanId") final Long loanId,
|
||||||
@QueryParam("transactionType") final String transactionType,
|
@QueryParam("transactionType") final String transactionType,
|
||||||
@@ -282,8 +265,8 @@ public class LoansApiResource {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("{loanId}/transactions/template")
|
@Path("{loanId}/transactions/template")
|
||||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||||
@Produces({ MediaType.APPLICATION_JSON })
|
@Produces({ MediaType.APPLICATION_JSON})
|
||||||
public String retrieveNewRepaymentDetails(
|
public String retrieveNewRepaymentDetails(
|
||||||
@PathParam("loanId") final Long loanId,
|
@PathParam("loanId") final Long loanId,
|
||||||
@QueryParam("type") final String transactionType,
|
@QueryParam("type") final String transactionType,
|
||||||
@@ -308,8 +291,8 @@ public class LoansApiResource {
|
|||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("{loanId}/transactions/{repaymentId}")
|
@Path("{loanId}/transactions/{repaymentId}")
|
||||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||||
@Produces({ MediaType.APPLICATION_JSON })
|
@Produces({ MediaType.APPLICATION_JSON})
|
||||||
public String retrieveRepaymentDetails(
|
public String retrieveRepaymentDetails(
|
||||||
@PathParam("loanId") final Long loanId,
|
@PathParam("loanId") final Long loanId,
|
||||||
@PathParam("repaymentId") final Long repaymentId,
|
@PathParam("repaymentId") final Long repaymentId,
|
||||||
@@ -326,8 +309,8 @@ public class LoansApiResource {
|
|||||||
|
|
||||||
@PUT
|
@PUT
|
||||||
@Path("{loanId}/transactions/{repaymentId}")
|
@Path("{loanId}/transactions/{repaymentId}")
|
||||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
@Produces({ MediaType.APPLICATION_JSON})
|
||||||
public Response adjustLoanTransaction(
|
public Response adjustLoanTransaction(
|
||||||
@PathParam("loanId") final Long loanId,
|
@PathParam("loanId") final Long loanId,
|
||||||
@PathParam("repaymentId") final Long repaymentId,
|
@PathParam("repaymentId") final Long repaymentId,
|
||||||
|
|||||||
+2
-2
@@ -29,9 +29,9 @@ public class UnrecognizedPropertyExceptionMapper implements ExceptionMapper<Unre
|
|||||||
|
|
||||||
String parameterName = exception.getUnrecognizedPropertyName();
|
String parameterName = exception.getUnrecognizedPropertyName();
|
||||||
|
|
||||||
StringBuilder validationErrorCode = new StringBuilder("error.msg.parameter.").append(parameterName).append(".unsupported");
|
StringBuilder validationErrorCode = new StringBuilder("error.msg.parameter.unsupported");
|
||||||
StringBuilder defaultEnglishMessage = new StringBuilder("The parameter ").append(parameterName).append(" is not supported.");
|
StringBuilder defaultEnglishMessage = new StringBuilder("The parameter ").append(parameterName).append(" is not supported.");
|
||||||
ApiParameterError error = ApiParameterError.parameterError(validationErrorCode.toString(), defaultEnglishMessage.toString(), parameterName);
|
ApiParameterError error = ApiParameterError.parameterError(validationErrorCode.toString(), defaultEnglishMessage.toString(), parameterName, parameterName);
|
||||||
|
|
||||||
List<ApiParameterError> errors = new ArrayList<ApiParameterError>();
|
List<ApiParameterError> errors = new ArrayList<ApiParameterError>();
|
||||||
errors.add(error);
|
errors.add(error);
|
||||||
|
|||||||
+47
@@ -0,0 +1,47 @@
|
|||||||
|
package org.mifosng.platform.api.errorhandling;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
import javax.ws.rs.core.Response.Status;
|
||||||
|
import javax.ws.rs.ext.ExceptionMapper;
|
||||||
|
import javax.ws.rs.ext.Provider;
|
||||||
|
|
||||||
|
import org.codehaus.jackson.map.exc.UnrecognizedPropertyException;
|
||||||
|
import org.mifosng.data.ApiGlobalErrorResponse;
|
||||||
|
import org.mifosng.data.ApiParameterError;
|
||||||
|
import org.mifosng.platform.exceptions.UnrecognizedQueryParamException;
|
||||||
|
import org.springframework.context.annotation.Scope;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An {@link ExceptionMapper} to map {@link UnrecognizedPropertyException} thrown by platform into a HTTP API friendly format.
|
||||||
|
*
|
||||||
|
* The {@link UnrecognizedPropertyException} is typically thrown when a parameter is passed during and post or put that is not expected.
|
||||||
|
*/
|
||||||
|
@Provider
|
||||||
|
@Component
|
||||||
|
@Scope("singleton")
|
||||||
|
public class UnrecognizedQueryParamExceptionMapper implements ExceptionMapper<UnrecognizedQueryParamException> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Response toResponse(UnrecognizedQueryParamException exception) {
|
||||||
|
|
||||||
|
String parameterName = exception.getQueryParamKey();
|
||||||
|
String parameterValue = exception.getQueryParamValue();
|
||||||
|
|
||||||
|
StringBuilder validationErrorCode = new StringBuilder("error.msg.query.parameter.value.unsupported");
|
||||||
|
StringBuilder defaultEnglishMessage = new StringBuilder("The query parameter ").append(parameterName).append(" has an unsupported value of: ").append(parameterValue);
|
||||||
|
ApiParameterError error = ApiParameterError.parameterError(validationErrorCode.toString(), defaultEnglishMessage.toString(), parameterName, parameterName, parameterValue);
|
||||||
|
|
||||||
|
List<ApiParameterError> errors = new ArrayList<ApiParameterError>();
|
||||||
|
errors.add(error);
|
||||||
|
|
||||||
|
ApiGlobalErrorResponse invalidParameterError = ApiGlobalErrorResponse.badClientRequest(
|
||||||
|
"validation.msg.validation.errors.exist",
|
||||||
|
"Validation errors exist.", errors);
|
||||||
|
|
||||||
|
return Response.status(Status.BAD_REQUEST).entity(invalidParameterError).build();
|
||||||
|
}
|
||||||
|
}
|
||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
package org.mifosng.platform.exceptions;
|
||||||
|
|
||||||
|
public class UnrecognizedQueryParamException extends RuntimeException {
|
||||||
|
|
||||||
|
private final String queryParamKey;
|
||||||
|
private final String queryParamValue;
|
||||||
|
|
||||||
|
public UnrecognizedQueryParamException(String queryParamKey, String queryParamValue) {
|
||||||
|
this.queryParamKey = queryParamKey;
|
||||||
|
this.queryParamValue = queryParamValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getQueryParamKey() {
|
||||||
|
return queryParamKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getQueryParamValue() {
|
||||||
|
return queryParamValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
-4
@@ -5,8 +5,7 @@ import org.mifosng.data.command.AdjustLoanTransactionCommand;
|
|||||||
import org.mifosng.data.command.LoanStateTransitionCommand;
|
import org.mifosng.data.command.LoanStateTransitionCommand;
|
||||||
import org.mifosng.data.command.LoanTransactionCommand;
|
import org.mifosng.data.command.LoanTransactionCommand;
|
||||||
import org.mifosng.data.command.SubmitLoanApplicationCommand;
|
import org.mifosng.data.command.SubmitLoanApplicationCommand;
|
||||||
import org.mifosng.data.command.UndoLoanApprovalCommand;
|
import org.mifosng.data.command.UndoStateTransitionCommand;
|
||||||
import org.mifosng.data.command.UndoLoanDisbursalCommand;
|
|
||||||
import org.springframework.security.access.prepost.PreAuthorize;
|
import org.springframework.security.access.prepost.PreAuthorize;
|
||||||
|
|
||||||
public interface LoanWritePlatformService {
|
public interface LoanWritePlatformService {
|
||||||
@@ -21,7 +20,7 @@ public interface LoanWritePlatformService {
|
|||||||
EntityIdentifier approveLoanApplication(LoanStateTransitionCommand command);
|
EntityIdentifier approveLoanApplication(LoanStateTransitionCommand command);
|
||||||
|
|
||||||
@PreAuthorize(value = "hasAnyRole('PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE', 'CAN_UNDO_LOAN_APPROVAL_ROLE')")
|
@PreAuthorize(value = "hasAnyRole('PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE', 'CAN_UNDO_LOAN_APPROVAL_ROLE')")
|
||||||
EntityIdentifier undoLoanApproval(UndoLoanApprovalCommand command);
|
EntityIdentifier undoLoanApproval(UndoStateTransitionCommand command);
|
||||||
|
|
||||||
@PreAuthorize(value = "hasAnyRole('PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE', 'CAN_REJECT_LOAN_ROLE', 'CAN_REJECT_LOAN_IN_THE_PAST_ROLE')")
|
@PreAuthorize(value = "hasAnyRole('PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE', 'CAN_REJECT_LOAN_ROLE', 'CAN_REJECT_LOAN_IN_THE_PAST_ROLE')")
|
||||||
EntityIdentifier rejectLoan(LoanStateTransitionCommand command);
|
EntityIdentifier rejectLoan(LoanStateTransitionCommand command);
|
||||||
@@ -33,7 +32,7 @@ public interface LoanWritePlatformService {
|
|||||||
EntityIdentifier disburseLoan(LoanStateTransitionCommand command);
|
EntityIdentifier disburseLoan(LoanStateTransitionCommand command);
|
||||||
|
|
||||||
@PreAuthorize(value = "hasAnyRole('PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE', 'CAN_UNDO_LOAN_DISBURSAL_ROLE')")
|
@PreAuthorize(value = "hasAnyRole('PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE', 'CAN_UNDO_LOAN_DISBURSAL_ROLE')")
|
||||||
public EntityIdentifier undloLoanDisbursal(UndoLoanDisbursalCommand command);
|
public EntityIdentifier undoLoanDisbursal(UndoStateTransitionCommand command);
|
||||||
|
|
||||||
@PreAuthorize(value = "hasAnyRole('PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE', 'CAN_MAKE_LOAN_REPAYMENT_ROLE', 'CAN_MAKE_LOAN_REPAYMENT_IN_THE_PAST_ROLE')")
|
@PreAuthorize(value = "hasAnyRole('PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE', 'CAN_MAKE_LOAN_REPAYMENT_ROLE', 'CAN_MAKE_LOAN_REPAYMENT_IN_THE_PAST_ROLE')")
|
||||||
public EntityIdentifier makeLoanRepayment(LoanTransactionCommand command);
|
public EntityIdentifier makeLoanRepayment(LoanTransactionCommand command);
|
||||||
|
|||||||
+11
-9
@@ -17,8 +17,7 @@ import org.mifosng.data.command.CalculateLoanScheduleCommand;
|
|||||||
import org.mifosng.data.command.LoanStateTransitionCommand;
|
import org.mifosng.data.command.LoanStateTransitionCommand;
|
||||||
import org.mifosng.data.command.LoanTransactionCommand;
|
import org.mifosng.data.command.LoanTransactionCommand;
|
||||||
import org.mifosng.data.command.SubmitLoanApplicationCommand;
|
import org.mifosng.data.command.SubmitLoanApplicationCommand;
|
||||||
import org.mifosng.data.command.UndoLoanApprovalCommand;
|
import org.mifosng.data.command.UndoStateTransitionCommand;
|
||||||
import org.mifosng.data.command.UndoLoanDisbursalCommand;
|
|
||||||
import org.mifosng.platform.client.domain.Client;
|
import org.mifosng.platform.client.domain.Client;
|
||||||
import org.mifosng.platform.client.domain.ClientRepository;
|
import org.mifosng.platform.client.domain.ClientRepository;
|
||||||
import org.mifosng.platform.client.domain.Note;
|
import org.mifosng.platform.client.domain.Note;
|
||||||
@@ -213,7 +212,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
|
|||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
@Override
|
@Override
|
||||||
public EntityIdentifier undoLoanApproval(final UndoLoanApprovalCommand command) {
|
public EntityIdentifier undoLoanApproval(final UndoStateTransitionCommand command) {
|
||||||
|
|
||||||
AppUser currentUser = context.authenticatedUser();
|
AppUser currentUser = context.authenticatedUser();
|
||||||
|
|
||||||
@@ -225,8 +224,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
|
|||||||
loan.undoApproval(defaultLoanLifecycleStateMachine());
|
loan.undoApproval(defaultLoanLifecycleStateMachine());
|
||||||
this.loanRepository.save(loan);
|
this.loanRepository.save(loan);
|
||||||
|
|
||||||
Note note = Note.loanNote(currentUser.getOrganisation(), loan, "Undo of approval.");
|
if (StringUtils.isNotBlank(command.getComment())) {
|
||||||
this.noteRepository.save(note);
|
Note note = Note.loanNote(currentUser.getOrganisation(), loan, command.getComment());
|
||||||
|
this.noteRepository.save(note);
|
||||||
|
}
|
||||||
|
|
||||||
return new EntityIdentifier(loan.getClient().getId());
|
return new EntityIdentifier(loan.getClient().getId());
|
||||||
}
|
}
|
||||||
@@ -381,7 +382,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
|
|||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
@Override
|
@Override
|
||||||
public EntityIdentifier undloLoanDisbursal(final UndoLoanDisbursalCommand command) {
|
public EntityIdentifier undoLoanDisbursal(final UndoStateTransitionCommand command) {
|
||||||
|
|
||||||
AppUser currentUser = context.authenticatedUser();
|
AppUser currentUser = context.authenticatedUser();
|
||||||
|
|
||||||
@@ -398,9 +399,10 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
|
|||||||
|
|
||||||
this.loanRepository.save(loan);
|
this.loanRepository.save(loan);
|
||||||
|
|
||||||
// TODO - this may not be wanted.
|
if (StringUtils.isNotBlank(command.getComment())) {
|
||||||
Note note = Note.loanNote(currentUser.getOrganisation(), loan, "Undo of disbursal.");
|
Note note = Note.loanNote(currentUser.getOrganisation(), loan, command.getComment());
|
||||||
this.noteRepository.save(note);
|
this.noteRepository.save(note);
|
||||||
|
}
|
||||||
|
|
||||||
return new EntityIdentifier(loan.getClient().getId());
|
return new EntityIdentifier(loan.getClient().getId());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user