finish off integration of organisation admin functions in UI with backend services through cross origin request from jQuery.

This commit is contained in:
Keith Woodlock
2012-05-11 14:24:16 +01:00
parent 525831db04
commit f82c87de78
34 changed files with 544 additions and 1946 deletions
@@ -32,5 +32,4 @@ public class ConfigurationData implements Serializable {
public void setCurrencyOptions(List<CurrencyData> currencyOptions) {
this.currencyOptions = currencyOptions;
}
}
@@ -5,177 +5,32 @@ import java.math.BigDecimal;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class LoanProductCommand implements LoanProductCommandData {
public class LoanProductCommand {
private Long id;
private String name;
private String description;
private String externalId;
private CommonLoanProperties commonLoanProperties;
private String currencyCode;
private Integer digitsAfterDecimal;
private BigDecimal principal;
private BigDecimal inArrearsToleranceAmount;
public LoanProductCommand() {
this.commonLoanProperties = new CommonLoanProperties();
}
public LoanProductCommand(final String currencyCode,
final Integer digitsAfterDecimal, final Number principal,
final String name, final String description,
final Number interestRatePerPeriod, Integer interestRateFrequencyMethod, final Integer interestMethod, final Integer interestCalculationPeriodMethod,
final Integer repaymentEvery, final Integer repaymentFrequency, final Integer numberOfRepayments, Integer amortizationMethod, final Number toleranceAmount,
final boolean flexibleRepaymentSchedule,
final boolean interestRebateAllowed) {
this.name = name;
this.description = description;
commonLoanProperties = new CommonLoanProperties(currencyCode, digitsAfterDecimal, principal, interestRatePerPeriod, interestRateFrequencyMethod,
interestMethod, interestCalculationPeriodMethod,
repaymentEvery, repaymentFrequency, numberOfRepayments, amortizationMethod, toleranceAmount, flexibleRepaymentSchedule, interestRebateAllowed);
}
private Integer repaymentEvery;
private Integer repaymentFrequency;
private Integer numberOfRepayments;
@Override
public String getName() {
return this.name;
}
public void setName(final String name) {
this.name = name;
}
@Override
public String getDescription() {
return this.description;
}
public void setDescription(final String description) {
this.description = description;
}
@Override
public String getCurrencyCode() {
return this.commonLoanProperties.getCurrencyCode();
}
public void setCurrencyCode(final String currencyCode) {
this.commonLoanProperties.setCurrencyCode(currencyCode);
}
@Override
public Integer getDigitsAfterDecimal() {
return this.commonLoanProperties.getDigitsAfterDecimal();
}
public void setDigitsAfterDecimal(final Integer digitsAfterDecimal) {
this.commonLoanProperties.setDigitsAfterDecimal(digitsAfterDecimal);
}
@Override
public Integer getRepaymentEvery() {
return this.commonLoanProperties.getRepaymentEvery();
}
public void setRepaymentEvery(final Integer repaymentEvery) {
this.commonLoanProperties.setRepaymentEvery(repaymentEvery);
}
@Override
public Integer getRepaymentFrequency() {
return this.commonLoanProperties.getRepaymentFrequency();
}
public void setRepaymentFrequency(final Integer repaymentFrequency) {
this.commonLoanProperties.setRepaymentFrequency(repaymentFrequency);
}
@Override
public Boolean isFlexibleRepaymentSchedule() {
return this.commonLoanProperties.isFlexibleRepaymentSchedule();
}
public void setFlexibleRepaymentSchedule(
final Boolean flexibleRepaymentSchedule) {
this.commonLoanProperties.setFlexibleRepaymentSchedule(flexibleRepaymentSchedule);
}
@Override
public Boolean isInterestRebateAllowed() {
return this.commonLoanProperties.isInterestRebateAllowed();
}
public void setInterestRebateAllowed(final Boolean interestRebateAllowed) {
this.commonLoanProperties.setInterestRebateAllowed(interestRebateAllowed);
}
@Override
public BigDecimal getPrincipal() {
return this.commonLoanProperties.getPrincipal();
}
public void setPrincipal(final BigDecimal principal) {
this.commonLoanProperties.setPrincipal(principal);
}
@Override
public Integer getInterestRateFrequencyMethod() {
return commonLoanProperties.getInterestRateFrequencyMethod();
}
public void setInterestRateFrequencyMethod(Integer interestRateFrequencyMethod) {
this.commonLoanProperties.setInterestRateFrequencyMethod(interestRateFrequencyMethod);
}
@Override
public Integer getInterestMethod() {
return commonLoanProperties.getInterestMethod();
}
public void setInterestMethod(Integer interestMethod) {
this.commonLoanProperties.setInterestMethod(interestMethod);
}
@Override
public Integer getAmortizationMethod() {
return commonLoanProperties.getAmortizationMethod();
}
public void setAmortizationMethod(Integer amortizationMethod) {
this.commonLoanProperties.setAmortizationMethod(amortizationMethod);
}
@Override
public Integer getNumberOfRepayments() {
return commonLoanProperties.getNumberOfRepayments();
}
public void setNumberOfRepayments(Integer numberOfRepayments) {
this.commonLoanProperties.setNumberOfRepayments(numberOfRepayments);
}
@Override
public BigDecimal getInterestRatePerPeriod() {
return commonLoanProperties.getInterestRatePerPeriod();
}
public void setInterestRatePerPeriod(BigDecimal interestRatePerPeriod) {
this.commonLoanProperties.setInterestRatePerPeriod(interestRatePerPeriod);
}
@Override
public CommonLoanProperties getCommonLoanProperties() {
return commonLoanProperties;
}
public void setCommonLoanProperties(CommonLoanProperties commonLoanProperties) {
this.commonLoanProperties = commonLoanProperties;
}
private BigDecimal interestRatePerPeriod;
private Integer interestRateFrequencyMethod;
private Integer amortizationMethod;
private Integer interestMethod;
private Integer interestCalculationPeriodMethod;
private boolean flexibleRepaymentSchedule = false;
private boolean interestRebateAllowed = false;
@Override
public BigDecimal getInArrearsToleranceAmount() {
return this.commonLoanProperties.getInArrearsToleranceAmount();
}
public void setInArrearsToleranceAmount(BigDecimal inArrearsToleranceAmount) {
this.commonLoanProperties.setInArrearsToleranceAmount(inArrearsToleranceAmount);
protected LoanProductCommand() {
//
}
public Long getId() {
@@ -186,6 +41,22 @@ public class LoanProductCommand implements LoanProductCommandData {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getExternalId() {
return externalId;
}
@@ -193,13 +64,117 @@ public class LoanProductCommand implements LoanProductCommandData {
public void setExternalId(String externalId) {
this.externalId = externalId;
}
@Override
public Integer getInterestCalculationPeriodMethod() {
return this.commonLoanProperties.getInterestCalculationPeriodMethod();
public String getCurrencyCode() {
return currencyCode;
}
public void setInterestCalculationPeriodMethod(final Integer interestCalculationPeriodMethod) {
this.commonLoanProperties.setInterestCalculationPeriodMethod(interestCalculationPeriodMethod);
public void setCurrencyCode(String currencyCode) {
this.currencyCode = currencyCode;
}
public Integer getDigitsAfterDecimal() {
return digitsAfterDecimal;
}
public void setDigitsAfterDecimal(Integer digitsAfterDecimal) {
this.digitsAfterDecimal = digitsAfterDecimal;
}
public BigDecimal getPrincipal() {
return principal;
}
public void setPrincipal(BigDecimal principal) {
this.principal = principal;
}
public BigDecimal getInArrearsToleranceAmount() {
return inArrearsToleranceAmount;
}
public void setInArrearsToleranceAmount(BigDecimal inArrearsToleranceAmount) {
this.inArrearsToleranceAmount = inArrearsToleranceAmount;
}
public Integer getRepaymentEvery() {
return repaymentEvery;
}
public void setRepaymentEvery(Integer repaymentEvery) {
this.repaymentEvery = repaymentEvery;
}
public Integer getRepaymentFrequency() {
return repaymentFrequency;
}
public void setRepaymentFrequency(Integer repaymentFrequency) {
this.repaymentFrequency = repaymentFrequency;
}
public Integer getNumberOfRepayments() {
return numberOfRepayments;
}
public void setNumberOfRepayments(Integer numberOfRepayments) {
this.numberOfRepayments = numberOfRepayments;
}
public BigDecimal getInterestRatePerPeriod() {
return interestRatePerPeriod;
}
public void setInterestRatePerPeriod(BigDecimal interestRatePerPeriod) {
this.interestRatePerPeriod = interestRatePerPeriod;
}
public Integer getInterestRateFrequencyMethod() {
return interestRateFrequencyMethod;
}
public void setInterestRateFrequencyMethod(Integer interestRateFrequencyMethod) {
this.interestRateFrequencyMethod = interestRateFrequencyMethod;
}
public Integer getAmortizationMethod() {
return amortizationMethod;
}
public void setAmortizationMethod(Integer amortizationMethod) {
this.amortizationMethod = amortizationMethod;
}
public Integer getInterestMethod() {
return interestMethod;
}
public void setInterestMethod(Integer interestMethod) {
this.interestMethod = interestMethod;
}
public Integer getInterestCalculationPeriodMethod() {
return interestCalculationPeriodMethod;
}
public void setInterestCalculationPeriodMethod(
Integer interestCalculationPeriodMethod) {
this.interestCalculationPeriodMethod = interestCalculationPeriodMethod;
}
public boolean isFlexibleRepaymentSchedule() {
return flexibleRepaymentSchedule;
}
public void setFlexibleRepaymentSchedule(boolean flexibleRepaymentSchedule) {
this.flexibleRepaymentSchedule = flexibleRepaymentSchedule;
}
public boolean isInterestRebateAllowed() {
return interestRebateAllowed;
}
public void setInterestRebateAllowed(boolean interestRebateAllowed) {
this.interestRebateAllowed = interestRebateAllowed;
}
}
@@ -14,9 +14,12 @@ public class OfficeCommand {
private String name;
private String externalId;
private String dateFormat;
private String openingDateFormatted;
private LocalDate openingDate;
private Long parentId;
private boolean rootOffice = false;
protected OfficeCommand() {
//
@@ -79,4 +82,28 @@ public class OfficeCommand {
public void setId(final Long id) {
this.id = id;
}
public String getDateFormat() {
return dateFormat;
}
public void setDateFormat(String dateFormat) {
this.dateFormat = dateFormat;
}
public String getOpeningDateFormatted() {
return openingDateFormatted;
}
public void setOpeningDateFormatted(String openingDateFormatted) {
this.openingDateFormatted = openingDateFormatted;
}
public boolean isRootOffice() {
return rootOffice;
}
public void setRootOffice(boolean rootOffice) {
this.rootOffice = rootOffice;
}
}
@@ -0,0 +1,39 @@
package org.mifosng.data.command;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class OrganisationCurrencyCommand implements Serializable {
private Collection<String> notSelectedItems = new ArrayList<String>();
private Collection<String> selectedItems = new ArrayList<String>();
public OrganisationCurrencyCommand() {
//
}
public OrganisationCurrencyCommand(final List<String> selectedCurrencyCodes) {
this.selectedItems = selectedCurrencyCodes;
}
public Collection<String> getSelectedItems() {
return selectedItems;
}
public void setSelectedItems(Collection<String> selectedItems) {
this.selectedItems = selectedItems;
}
public Collection<String> getNotSelectedItems() {
return notSelectedItems;
}
public void setNotSelectedItems(Collection<String> notSelectedItems) {
this.notSelectedItems = notSelectedItems;
}
}
@@ -1,30 +0,0 @@
package org.mifosng.data.command;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class UpdateOrganisationCurrencyCommand implements Serializable {
private Collection<String> codes = new ArrayList<String>();
public UpdateOrganisationCurrencyCommand() {
//
}
public UpdateOrganisationCurrencyCommand(final List<String> currencyCodes) {
this.codes = currencyCodes;
}
public Collection<String> getCodes() {
return this.codes;
}
public void setCodes(final Collection<String> codes) {
this.codes = codes;
}
}
@@ -6,7 +6,6 @@ import java.util.Map;
import org.mifosng.data.AppUserData;
import org.mifosng.data.ClientData;
import org.mifosng.data.ClientDataWithAccountsData;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.EntityIdentifier;
import org.mifosng.data.EnumOptionReadModel;
import org.mifosng.data.LoanAccountData;
@@ -15,23 +14,19 @@ import org.mifosng.data.LoanRepaymentData;
import org.mifosng.data.LoanSchedule;
import org.mifosng.data.NewLoanWorkflowStepOneData;
import org.mifosng.data.NoteData;
import org.mifosng.data.OfficeData;
import org.mifosng.data.PermissionData;
import org.mifosng.data.RoleData;
import org.mifosng.data.command.AdjustLoanTransactionCommand;
import org.mifosng.data.command.CalculateLoanScheduleCommand;
import org.mifosng.data.command.ChangePasswordCommand;
import org.mifosng.data.command.EnrollClientCommand;
import org.mifosng.data.command.LoanProductCommand;
import org.mifosng.data.command.LoanStateTransitionCommand;
import org.mifosng.data.command.LoanTransactionCommand;
import org.mifosng.data.command.NoteCommand;
import org.mifosng.data.command.OfficeCommand;
import org.mifosng.data.command.RoleCommand;
import org.mifosng.data.command.SubmitLoanApplicationCommand;
import org.mifosng.data.command.UndoLoanApprovalCommand;
import org.mifosng.data.command.UndoLoanDisbursalCommand;
import org.mifosng.data.command.UpdateOrganisationCurrencyCommand;
import org.mifosng.data.command.UserCommand;
import org.mifosng.data.reports.GenericResultset;
import org.springframework.security.oauth.consumer.ProtectedResourceDetails;
@@ -43,12 +38,6 @@ public interface CommonRestOperations {
void updateProtectedResource(
ProtectedResourceDetails loadProtectedResourceDetailsById);
void updateOrganisationCurrencies(UpdateOrganisationCurrencyCommand command);
Collection<OfficeData> retrieveAllOffices();
OfficeData retrieveOffice(Long officeId);
Collection<AppUserData> retrieveAllUsers();
AppUserData retrieveNewUserDetails();
@@ -79,34 +68,10 @@ public interface CommonRestOperations {
EntityIdentifier createRole(RoleCommand command);
EntityIdentifier createOffice(OfficeCommand command);
EntityIdentifier updateOffice(OfficeCommand command);
Collection<ClientData> retrieveAllIndividualClients();
Collection<LoanProductData> retrieveAllLoanProducts();
Collection<CurrencyData> retrieveAllowedCurrencies();
Collection<CurrencyData> retrieveAllPlatformCurrencies();
Collection<EnumOptionReadModel> retrieveAllowedLoanAmortizationMethodOptions();
Collection<EnumOptionReadModel> retrieveAllowedLoanInterestMethodOptions();
Collection<EnumOptionReadModel> retrieveAllowedRepaymentFrequencyOptions();
Collection<EnumOptionReadModel> retrieveAllowedNominalInterestFrequencyOptions();
EntityIdentifier createLoanProduct(LoanProductCommand command);
EntityIdentifier updateLoanProduct(LoanProductCommand command);
LoanProductData retrieveLoanProductDetails(Long selectedLoanProductOption);
LoanProductData retrieveNewLoanProductDetails();
LoanSchedule calculateLoanSchedule(CalculateLoanScheduleCommand command);
NewLoanWorkflowStepOneData retrieveNewLoanApplicationStepOneDetails(
@@ -13,8 +13,6 @@ import org.mifosng.data.AppUserData;
import org.mifosng.data.ClientData;
import org.mifosng.data.ClientDataWithAccountsData;
import org.mifosng.data.ClientList;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.CurrencyList;
import org.mifosng.data.EntityIdentifier;
import org.mifosng.data.EnumOptionList;
import org.mifosng.data.EnumOptionReadModel;
@@ -28,8 +26,6 @@ import org.mifosng.data.LoanSchedule;
import org.mifosng.data.NewLoanWorkflowStepOneData;
import org.mifosng.data.NoteData;
import org.mifosng.data.NoteDataList;
import org.mifosng.data.OfficeData;
import org.mifosng.data.OfficeList;
import org.mifosng.data.PermissionData;
import org.mifosng.data.PermissionList;
import org.mifosng.data.RoleData;
@@ -39,16 +35,13 @@ import org.mifosng.data.command.AdjustLoanTransactionCommand;
import org.mifosng.data.command.CalculateLoanScheduleCommand;
import org.mifosng.data.command.ChangePasswordCommand;
import org.mifosng.data.command.EnrollClientCommand;
import org.mifosng.data.command.LoanProductCommand;
import org.mifosng.data.command.LoanStateTransitionCommand;
import org.mifosng.data.command.LoanTransactionCommand;
import org.mifosng.data.command.NoteCommand;
import org.mifosng.data.command.OfficeCommand;
import org.mifosng.data.command.RoleCommand;
import org.mifosng.data.command.SubmitLoanApplicationCommand;
import org.mifosng.data.command.UndoLoanApprovalCommand;
import org.mifosng.data.command.UndoLoanDisbursalCommand;
import org.mifosng.data.command.UpdateOrganisationCurrencyCommand;
import org.mifosng.data.command.UserCommand;
import org.mifosng.data.reports.GenericResultset;
import org.mifosng.ui.loanproduct.ClientValidationException;
@@ -129,38 +122,7 @@ public class CommonRestOperationsImpl implements CommonRestOperations {
return s.getBody().getProducts();
}
@Override
public EntityIdentifier createLoanProduct(final LoanProductCommand command) {
try {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/product/loan/new"));
ResponseEntity<EntityIdentifier> s = this.oauthRestServiceTemplate.postForEntity(restUri,
updateLoanProductRequest(command), EntityIdentifier.class);
return s.getBody();
} catch (HttpStatusCodeException e) {
ErrorResponseList errorList = parseErrors(e);
throw new ClientValidationException(errorList.getErrors());
}
}
@Override
public EntityIdentifier updateLoanProduct(LoanProductCommand command) {
try {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/product/loan/update"));
ResponseEntity<EntityIdentifier> s = this.oauthRestServiceTemplate
.postForEntity(restUri, updateLoanProductRequest(command),
EntityIdentifier.class);
return s.getBody();
} catch (HttpStatusCodeException e) {
ErrorResponseList errorList = parseErrors(e);
throw new ClientValidationException(errorList.getErrors());
}
}
private ErrorResponseList parseErrors(HttpStatusCodeException e) {
@@ -184,53 +146,6 @@ public class CommonRestOperationsImpl implements CommonRestOperations {
}
return errorList;
}
private HttpEntity<LoanProductCommand> updateLoanProductRequest(
final LoanProductCommand command) {
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("Accept", "application/xml");
requestHeaders.set("Content-Type", "application/xml");
HttpEntity<LoanProductCommand> requestEntity = new HttpEntity<LoanProductCommand>(
command, requestHeaders);
return requestEntity;
}
@Override
public LoanProductData retrieveLoanProductDetails(
final Long selectedLoanProductOption) {
try {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/product/loan/"
+ selectedLoanProductOption));
ResponseEntity<LoanProductData> s = this.oauthRestServiceTemplate
.exchange(restUri, HttpMethod.GET, emptyRequest(),
LoanProductData.class);
return s.getBody();
} catch (HttpStatusCodeException e) {
ErrorResponseList errorList = parseErrors(e);
throw new ClientValidationException(errorList.getErrors());
}
}
@Override
public LoanProductData retrieveNewLoanProductDetails() {
try {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/product/loan/empty"));
ResponseEntity<LoanProductData> s = this.oauthRestServiceTemplate
.exchange(restUri, HttpMethod.GET, emptyRequest(),
LoanProductData.class);
return s.getBody();
} catch (HttpStatusCodeException e) {
ErrorResponseList errorList = parseErrors(e);
throw new ClientValidationException(errorList.getErrors());
}
}
@Override
public LoanSchedule calculateLoanSchedule(
@@ -587,116 +502,7 @@ public class CommonRestOperationsImpl implements CommonRestOperations {
return new HttpEntity<CalculateLoanScheduleCommand>(command,
requestHeaders);
}
@Override
public Collection<CurrencyData> retrieveAllowedCurrencies() {
try {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/config/currency/allowed"));
ResponseEntity<CurrencyList> s = this.oauthRestServiceTemplate
.exchange(restUri, HttpMethod.GET, emptyRequest(),
CurrencyList.class);
return s.getBody().getCurrencies();
} catch (HttpStatusCodeException e) {
ErrorResponseList errorList = parseErrors(e);
throw new ClientValidationException(errorList.getErrors());
}
}
@Override
public Collection<EnumOptionReadModel> retrieveAllowedLoanAmortizationMethodOptions() {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/config/loan/amortization/allowed"));
ResponseEntity<EnumOptionList> s = this.oauthRestServiceTemplate
.exchange(restUri, HttpMethod.GET, emptyRequest(),
EnumOptionList.class);
return s.getBody().getOptions();
}
@Override
public Collection<EnumOptionReadModel> retrieveAllowedLoanInterestMethodOptions() {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/config/loan/interestcalculation/allowed"));
ResponseEntity<EnumOptionList> s = this.oauthRestServiceTemplate
.exchange(restUri, HttpMethod.GET, emptyRequest(),
EnumOptionList.class);
return s.getBody().getOptions();
}
@Override
public Collection<EnumOptionReadModel> retrieveAllowedRepaymentFrequencyOptions() {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/config/loan/repaymentfrequency/allowed"));
ResponseEntity<EnumOptionList> s = this.oauthRestServiceTemplate
.exchange(restUri, HttpMethod.GET, emptyRequest(),
EnumOptionList.class);
return s.getBody().getOptions();
}
@Override
public Collection<EnumOptionReadModel> retrieveAllowedNominalInterestFrequencyOptions() {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/config/loan/interestfrequency/allowed"));
ResponseEntity<EnumOptionList> s = this.oauthRestServiceTemplate
.exchange(restUri, HttpMethod.GET, emptyRequest(),
EnumOptionList.class);
return s.getBody().getOptions();
}
@Override
public Collection<CurrencyData> retrieveAllPlatformCurrencies() {
try {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/config/currency/all"));
ResponseEntity<CurrencyList> s = this.oauthRestServiceTemplate
.exchange(restUri, HttpMethod.GET, emptyRequest(),
CurrencyList.class);
return s.getBody().getCurrencies();
} catch (HttpStatusCodeException e) {
ErrorResponseList errorList = parseErrors(e);
throw new ClientValidationException(errorList.getErrors());
}
}
@Override
public void updateOrganisationCurrencies(UpdateOrganisationCurrencyCommand command) {
try {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/config/currency/update"));
this.oauthRestServiceTemplate.exchange(restUri, HttpMethod.PUT,
updateCurrencyRequest(command),
UpdateOrganisationCurrencyCommand.class);
} catch (HttpStatusCodeException e) {
ErrorResponseList errorList = parseErrors(e);
throw new ClientValidationException(errorList.getErrors());
}
}
private HttpEntity<UpdateOrganisationCurrencyCommand> updateCurrencyRequest(
final UpdateOrganisationCurrencyCommand command) {
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("Accept", "application/xml");
requestHeaders.set("Content-Type", "application/xml");
HttpEntity<UpdateOrganisationCurrencyCommand> requestEntity = new HttpEntity<UpdateOrganisationCurrencyCommand>(
command, requestHeaders);
return requestEntity;
}
@Override
public EntityIdentifier createUser(final UserCommand command) {
try {
@@ -950,99 +756,6 @@ public class CommonRestOperationsImpl implements CommonRestOperations {
}
}
@Override
public Collection<OfficeData> retrieveAllOffices() {
try {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/office/all"));
ResponseEntity<OfficeList> s = this.oauthRestServiceTemplate
.exchange(restUri, HttpMethod.GET, emptyRequest(),
OfficeList.class);
return s.getBody().getOffices();
} catch (HttpStatusCodeException e) {
ErrorResponseList errorList = parseErrors(e);
throw new ClientValidationException(errorList.getErrors());
}
}
@Override
public OfficeData retrieveOffice(final Long officeId) {
try {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/office/"
+ officeId));
ResponseEntity<OfficeData> s = this.oauthRestServiceTemplate
.exchange(restUri, HttpMethod.GET, emptyRequest(),
OfficeData.class);
return s.getBody();
} catch (HttpStatusCodeException e) {
ErrorResponseList errorList = parseErrors(e);
throw new ClientValidationException(errorList.getErrors());
}
}
@Override
public EntityIdentifier createOffice(final OfficeCommand command) {
try {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/office/new"));
ResponseEntity<EntityIdentifier> s = this.oauthRestServiceTemplate
.postForEntity(restUri, createOfficeRequest(command),
EntityIdentifier.class);
return s.getBody();
} catch (HttpStatusCodeException e) {
ErrorResponseList errorList = parseErrors(e);
throw new ClientValidationException(errorList.getErrors());
}
}
@Override
public EntityIdentifier updateOffice(final OfficeCommand command) {
try {
URI restUri = URI
.create(getBaseServerUrl().concat("api/protected/office/update"));
ResponseEntity<EntityIdentifier> s = this.oauthRestServiceTemplate
.postForEntity(restUri, updateOfficeRequest(command),
EntityIdentifier.class);
return s.getBody();
} catch (HttpStatusCodeException e) {
ErrorResponseList errorList = parseErrors(e);
throw new ClientValidationException(errorList.getErrors());
}
}
private HttpEntity<OfficeCommand> createOfficeRequest(
final OfficeCommand command) {
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("Accept", "application/xml");
requestHeaders.set("Content-Type", "application/xml");
HttpEntity<OfficeCommand> requestEntity = new HttpEntity<OfficeCommand>(
command, requestHeaders);
return requestEntity;
}
private HttpEntity<OfficeCommand> updateOfficeRequest(
final OfficeCommand command) {
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("Accept", "application/xml");
requestHeaders.set("Content-Type", "application/xml");
HttpEntity<OfficeCommand> requestEntity = new HttpEntity<OfficeCommand>(
command, requestHeaders);
return requestEntity;
}
@Override
public ClientData retrieveNewIndividualClient() {
URI restUri = URI.create(getBaseServerUrl().concat("api/protected/client/new"));
@@ -1,35 +1,24 @@
package org.mifosng.ui.configuration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.mifosng.configuration.ApplicationConfigurationService;
import org.mifosng.configuration.OAuthProviderDetails;
import org.mifosng.data.ConfigurationData;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.EntityIdentifier;
import org.mifosng.data.ErrorResponse;
import org.mifosng.data.command.UpdateOrganisationCurrencyCommand;
import org.mifosng.oauth.RefreshableProtectedResourceDetailsService;
import org.mifosng.ui.CommonRestOperations;
import org.mifosng.ui.loanproduct.ClientValidationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.oauth.consumer.ProtectedResourceDetailsService;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;
@@ -66,38 +55,6 @@ public class ConfigurationController {
return ex.getValidationErrors();
}
@RequestMapping(consumes="application/json", produces="application/json", value = "org/configuration/edit", method = RequestMethod.GET)
public @ResponseBody ConfigurationData viewConfigurationDetails() {
List<CurrencyData> selectedCurrencyOptions = new ArrayList<CurrencyData>(this.commonRestOperations.retrieveAllowedCurrencies());
List<CurrencyData> currencyOptions = new ArrayList<CurrencyData>(this.commonRestOperations.retrieveAllPlatformCurrencies());
// remove selected currency options
currencyOptions.removeAll(selectedCurrencyOptions);
ConfigurationData configurationData = new ConfigurationData();
configurationData.setCurrencyOptions(currencyOptions);
configurationData.setSelectedCurrencyOptions(selectedCurrencyOptions);
return configurationData;
}
@RequestMapping(consumes="application/x-www-form-urlencoded", produces="application/json", value = "org/configuration/edit", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody EntityIdentifier updateOrganisationCurrencies(@RequestParam(value="selectedItems", required=false) String[] selectedCurrencies) {
List<String> codes = new ArrayList<String>();
if (selectedCurrencies != null) {
codes = Arrays.asList(selectedCurrencies);
}
UpdateOrganisationCurrencyCommand command = new UpdateOrganisationCurrencyCommand(codes);
this.commonRestOperations.updateOrganisationCurrencies(command);
return new EntityIdentifier(Long.valueOf(1));
}
@ModelAttribute("oauthSettingsFormBean")
@RequestMapping(value = "oauth/configuration/edit", method = RequestMethod.GET)
public ModelAndView showOAuthConfiguration() {
@@ -114,9 +71,7 @@ public class ConfigurationController {
}
@RequestMapping(value = "oauth/configuration/edit", method = RequestMethod.POST)
public ModelAndView updateOAuthConfiguration(
@ModelAttribute final OauthSettingsFormBean oauthSettingsFormBean,
final BindingResult result) {
public ModelAndView updateOAuthConfiguration(@ModelAttribute final OauthSettingsFormBean oauthSettingsFormBean) {
ModelAndView mav = new ModelAndView("redirect:/");
@@ -1,195 +0,0 @@
package org.mifosng.ui.loanproduct;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.mifosng.data.EntityIdentifier;
import org.mifosng.data.ErrorResponse;
import org.mifosng.data.LoanProductData;
import org.mifosng.data.command.LoanProductCommand;
import org.mifosng.ui.CommonRestOperations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Controller;
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;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
@Controller
public class LoanProductController {
private final CommonRestOperations commonRestOperations;
@Autowired
public LoanProductController(final CommonRestOperations commonRestOperations) {
this.commonRestOperations = commonRestOperations;
}
@ExceptionHandler(AccessDeniedException.class)
public String accessDeniedException() {
return "unAuthorizedAction";
}
@ExceptionHandler(ClientValidationException.class)
public @ResponseBody Collection<ErrorResponse> validationException(ClientValidationException ex, HttpServletResponse response) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.setContentType("application/json");
return ex.getValidationErrors();
}
private BigDecimal parseStringToBigDecimal(String source) {
try {
BigDecimal number = null;
if (StringUtils.isNotBlank(source)) {
String sourceWithoutSpaces = source.replaceAll(" ", "");
Locale locale = LocaleContextHolder.getLocale();
NumberFormat format = NumberFormat.getNumberInstance(locale);
Number parsedNumber = format.parse(sourceWithoutSpaces);
number = BigDecimal.valueOf(Double.valueOf(parsedNumber
.doubleValue()));
}
return number;
} catch (ParseException e) {
List<ErrorResponse> validationErrors = new ArrayList<ErrorResponse>();
validationErrors.add(new ErrorResponse("validation.msg.invalid.number.format", "amount", source));
throw new ClientValidationException(validationErrors);
}
}
@RequestMapping(consumes="application/json", produces="application/json", value = "/portfolio/product/loan/all", method = RequestMethod.GET)
public @ResponseBody Collection<LoanProductData> viewAllLoanProducts() {
return this.commonRestOperations.retrieveAllLoanProducts();
}
@RequestMapping(consumes="application/json", produces="application/json", value = "/portfolio/product/loan/new", method = RequestMethod.GET)
public @ResponseBody LoanProductData viewNewLoanProductForm() {
return this.commonRestOperations.retrieveNewLoanProductDetails();
}
@RequestMapping(consumes="application/x-www-form-urlencoded", produces="application/json", value = "/portfolio/product/loan/new", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody EntityIdentifier createLoanProduct(
@RequestParam("name") String name,
@RequestParam("description") String description,
@RequestParam("selectedCurrency") String currencyCode, @RequestParam("selectedDigitsAfterDecimal") Integer digitsAfterDecimal,
@RequestParam("amount") String principalAsNumber,
@RequestParam("repaidEvery") Integer repaymentEvery,
@RequestParam("selectedRepaymentFrequencyOption") Integer repaymentFrequency,
@RequestParam("numberOfRepayments") Integer numberOfRepayments,
@RequestParam("selectedAmortizationMethodOption") Integer amortizationMethod,
@RequestParam("inArrearsTolerance") String inArrearsToleranceAsNumber,
@RequestParam("nominalInterestRate") String nominalInterestRatePerPeriodAsNumber,
@RequestParam("selectedInterestFrequencyOption") Integer nominalInterestRatePerPeriodFrequency,
@RequestParam("selectedInterestMethodOption") Integer interestMethod,
@RequestParam(value="interestRateCalculatedInPeriod", required=false) Integer interestCalculationPeriodMethod
) {
LoanProductCommand command = new LoanProductCommand();
command.setName(name);
command.setDescription(description);
command.setCurrencyCode(currencyCode);
command.setDigitsAfterDecimal(digitsAfterDecimal);
if (StringUtils.isNotBlank(principalAsNumber)) {
BigDecimal principal = parseStringToBigDecimal(principalAsNumber);
command.setPrincipal(principal);
}
command.setRepaymentEvery(repaymentEvery);
command.setRepaymentFrequency(repaymentFrequency);
command.setNumberOfRepayments(numberOfRepayments);
command.setAmortizationMethod(amortizationMethod);
if (StringUtils.isNotBlank(inArrearsToleranceAsNumber)) {
BigDecimal inArrearsToleranceAmount = parseStringToBigDecimal(inArrearsToleranceAsNumber);
command.setInArrearsToleranceAmount(inArrearsToleranceAmount);
}
if (StringUtils.isNotBlank(nominalInterestRatePerPeriodAsNumber)) {
BigDecimal interestRatePerPeriod = parseStringToBigDecimal(nominalInterestRatePerPeriodAsNumber);
command.setInterestRatePerPeriod(interestRatePerPeriod);
}
command.setInterestRateFrequencyMethod(nominalInterestRatePerPeriodFrequency);
command.setInterestMethod(interestMethod);
command.setInterestCalculationPeriodMethod(interestCalculationPeriodMethod);
return this.commonRestOperations.createLoanProduct(command);
}
@RequestMapping(consumes="application/json", produces="application/json", value = "/portfolio/product/loan/{productId}", method = RequestMethod.GET)
public @ResponseBody LoanProductData viewLoanProduct(@PathVariable("productId") final Long productId) {
return this.commonRestOperations.retrieveLoanProductDetails(productId);
}
@RequestMapping(consumes="application/x-www-form-urlencoded", produces="application/json", value = "/portfolio/product/loan/{productId}", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody EntityIdentifier updateLoanProduct(@PathVariable("productId") final Long productId,
@RequestParam("name") String name, @RequestParam("description") String description,
@RequestParam("selectedCurrency") String currencyCode, @RequestParam("selectedDigitsAfterDecimal") Integer digitsAfterDecimal,
@RequestParam("amount") String principalAsNumber,
@RequestParam("repaidEvery") Integer repaymentEvery,
@RequestParam("selectedRepaymentFrequencyOption") Integer repaymentFrequency,
@RequestParam("numberOfRepayments") Integer numberOfRepayments,
@RequestParam("selectedAmortizationMethodOption") Integer amortizationMethod,
@RequestParam("inArrearsTolerance") String inArrearsToleranceAsNumber,
@RequestParam("nominalInterestRate") String nominalInterestRatePerPeriodAsNumber,
@RequestParam("selectedInterestFrequencyOption") Integer nominalInterestRatePerPeriodFrequency,
@RequestParam("selectedInterestMethodOption") Integer interestMethod,
@RequestParam(value="interestRateCalculatedInPeriod", required=false) Integer interestCalculationPeriodMethod
) {
LoanProductCommand command = new LoanProductCommand();
command.setId(productId);
command.setName(name);
command.setDescription(description);
command.setExternalId(null);
command.setCurrencyCode(currencyCode);
command.setDigitsAfterDecimal(digitsAfterDecimal);
if (StringUtils.isNotBlank(principalAsNumber)) {
BigDecimal principal = parseStringToBigDecimal(principalAsNumber);
command.setPrincipal(principal);
}
command.setRepaymentEvery(repaymentEvery);
command.setRepaymentFrequency(repaymentFrequency);
command.setNumberOfRepayments(numberOfRepayments);
command.setAmortizationMethod(amortizationMethod);
if (StringUtils.isNotBlank(inArrearsToleranceAsNumber)) {
BigDecimal inArrearsToleranceAmount = parseStringToBigDecimal(inArrearsToleranceAsNumber);
command.setInArrearsToleranceAmount(inArrearsToleranceAmount);
}
if (StringUtils.isNotBlank(nominalInterestRatePerPeriodAsNumber)) {
BigDecimal interestRatePerPeriod = parseStringToBigDecimal(nominalInterestRatePerPeriodAsNumber);
command.setInterestRatePerPeriod(interestRatePerPeriod);
}
command.setInterestRateFrequencyMethod(nominalInterestRatePerPeriodFrequency);
command.setInterestMethod(interestMethod);
command.setInterestCalculationPeriodMethod(interestCalculationPeriodMethod);
return this.commonRestOperations.updateLoanProduct(command);
}
}
@@ -1,127 +0,0 @@
package org.mifosng.ui.office;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.mifosng.data.EntityIdentifier;
import org.mifosng.data.ErrorResponse;
import org.mifosng.data.OfficeData;
import org.mifosng.data.command.OfficeCommand;
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.http.HttpStatus;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Controller;
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;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
@Controller
public class OfficeController {
private final CommonRestOperations commonRestOperations;
@Autowired
public OfficeController(final CommonRestOperations commonRestOperations) {
this.commonRestOperations = commonRestOperations;
}
@ExceptionHandler(AccessDeniedException.class)
public String accessDeniedException() {
return "unAuthorizedAction";
}
@ExceptionHandler(ClientValidationException.class)
public @ResponseBody
Collection<ErrorResponse> validationException(ClientValidationException ex,
HttpServletResponse response) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.setContentType("application/json");
return ex.getValidationErrors();
}
private LocalDate parseStringToLocalDate(String eventDate, String dateFieldIdentifier) {
LocalDate eventLocalDate = null;
if (StringUtils.isNotBlank(eventDate)) {
try {
Locale locale = LocaleContextHolder.getLocale();
eventLocalDate = DateTimeFormat.forPattern("dd MMMM yyyy").withLocale(locale).parseLocalDate(eventDate.toLowerCase(locale));
} catch (IllegalArgumentException e) {
List<ErrorResponse> validationErrors = new ArrayList<ErrorResponse>();
validationErrors.add(new ErrorResponse("validation.msg.invalid.date.format", dateFieldIdentifier, eventDate));
throw new ClientValidationException(validationErrors);
}
}
return eventLocalDate;
}
@RequestMapping(consumes="application/json", produces="application/json", value = "/org/office/all", method = RequestMethod.GET)
public @ResponseBody Collection<OfficeData> viewAllOffices() {
return this.commonRestOperations.retrieveAllOffices();
}
@RequestMapping(consumes="application/json", produces="application/json", value = "/org/office/new", method = RequestMethod.GET)
public @ResponseBody OfficeData viewNewOfficeForm() {
OfficeData newOffice = new OfficeData();
newOffice.setOpeningDate(new LocalDate());
Collection<OfficeData> allOffices = this.commonRestOperations.retrieveAllOffices();
List<OfficeData> allowedParents = new ArrayList<OfficeData>(allOffices);
newOffice.setAllowedParents(allowedParents);
return newOffice;
}
@RequestMapping(consumes="application/x-www-form-urlencoded", produces="application/json", value = "/org/office/new", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody EntityIdentifier createOffice(
@RequestParam("name") String name,
@RequestParam(value="parentId", required=false) Long parentId,
@RequestParam("openingDate") String openingDate,
@RequestParam(value="externalId", required=false) String externalId) {
LocalDate openingLocalDate = parseStringToLocalDate(openingDate, "openingDate");
OfficeCommand command = new OfficeCommand(name, externalId, parentId, openingLocalDate);
return this.commonRestOperations.createOffice(command);
}
@RequestMapping(consumes="application/json", produces="application/json", value = "/org/office/{officeId}", method = RequestMethod.GET)
public @ResponseBody OfficeData viewOffice(@PathVariable("officeId") final Long officeId) {
return this.commonRestOperations.retrieveOffice(officeId);
}
@RequestMapping(consumes="application/x-www-form-urlencoded", produces="application/json", value = "/org/office/{officeId}", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody EntityIdentifier updateOffice(@PathVariable("officeId") final Long officeId,
@RequestParam("name") String name,
@RequestParam(value="parentId", required=false) Long parentId,
@RequestParam("openingDate") String openingDate,
@RequestParam(value="externalId", required=false) String externalId) {
LocalDate openingLocalDate = parseStringToLocalDate(openingDate, "openingDate");
OfficeCommand command = new OfficeCommand(officeId, name, externalId, parentId, openingLocalDate);
return this.commonRestOperations.updateOffice(command);
}
}
@@ -250,7 +250,7 @@ validation.msg.product.interest.rate.per.period.amount.cannot.be.empty=Nominal i
validation.msg.product.currency.digitsAfterDecimal.must.be.between.zero.and.six.inclusive=Decimal places must be a number between zero and six inclusive.
validation.msg.product.principal.amount.must.be.greater.than.zero=Loan amount must be greater than zero.
validation.msg.product.repayment.repaidEvery.outside.allowed.range=Repaid every is out of allowed range for selected repayment frequency type.
validation.msg.product.repayment.repaidEvery.outside.allowed.range=Repaid every must be between {0} and {1} inclusive given the selected repayment frequency type.
validation.msg.product.number.of.repayments.is.out.of.range=# of repayments is out of allowed range for selected repayment frequency type.
validation.msg.product.arrears.tolerance.amount.cannot.be.negative=Arrears tolerance cannot be negative.
validation.msg.product.interest.rate.per.period.amount.cannot.be.negative=Nominal interest rate % cannot be negative.
@@ -112,17 +112,28 @@
removeErrors(placeholderDiv);
var jsonErrors = JSON.parse(jqXHR.responseText);
console.log(jsonErrors);
var valErrors = jsonErrors.errors;
console.log(valErrors);
var errorArray = new Array();
var arrayIndex = 0;
$.each(jsonErrors, function() {
var fieldId = '#' + this.field;
$.each(valErrors, function() {
var fieldId = '#' + this.parameterName;
$(fieldId).addClass("ui-state-error");
var errorObj = new Object();
errorObj.field = this.field;
errorObj.code = this.code;
errorObj.message = jQuery.i18n.prop(this.code, this.args);
errorObj.field = this.parameterName;
errorObj.code = this.userMessageGlobalisationCode;
var argArray = new Array();
var argArrayIndex = 0;
$.each(this.args, function() {
argArray[argArrayIndex] = this.value;
argArrayIndex++;
});
console.log(argArray);
// hardcoded support for six arguments
errorObj.message = jQuery.i18n.prop(this.userMessageGlobalisationCode, argArray[0], argArray[1], argArray[2], argArray[3], argArray[4], argArray[5]);
errorObj.value = this.value;
errorArray[arrayIndex] = errorObj;
@@ -182,7 +193,7 @@
return o;
};
function popupDialogWithFormView(getUrl, postUrl, titleCode, templateSelector, width, height, saveSuccessFunction) {
function popupDialogWithFormView(getUrl, postUrl, submitType, titleCode, templateSelector, width, height, saveSuccessFunction) {
var dialogDiv = $("<div id='dialog-form'></div>");
var jqxhr = $.ajax({
url: getUrl,
@@ -218,7 +229,7 @@
var jqxhr = $.ajax({
url: postUrl,
type: 'POST',
type: submitType,
contentType: 'application/json',
dataType: 'json',
data: newFormData,
@@ -273,7 +284,6 @@
$('#addloanproduct').click(function(e) {
var getUrl = 'http://localhost:8085/mifosng-provider/api/v1/loanproducts/template';
var postUrl = 'http://localhost:8085/mifosng-provider/api/v1/loanproducts';
//var url = '${rootContext}portfolio/product/loan/new';
var templateSelector = "#productFormTemplate";
var width = 800;
var height = 550;
@@ -283,13 +293,13 @@
refreshLoanProductsView();
}
popupDialogWithFormView(getUrl, postUrl, "dialog.title.add.loan.product", templateSelector, width, height, saveSuccessFunction);
popupDialogWithFormView(getUrl, postUrl, 'POST', "dialog.title.add.loan.product", templateSelector, width, height, saveSuccessFunction);
e.preventDefault();
});
function refreshLoanProductsView() {
var jqxhr = $.ajax({
url: '${allLoanProductsUrl}',
url: 'http://localhost:8085/mifosng-provider/api/v1/loanproducts', //'${allLoanProductsUrl}',
type: 'GET',
contentType: 'application/json',
dataType: 'json',
@@ -297,7 +307,7 @@
success: function(data, textStatus, jqXHR) {
var productlistParent = new Object();
productlistParent.items = data;
productlistParent.items = data.products;
var productListHtml = $("#productListTemplate").render(productlistParent);
$("#listplaceholder").html(productListHtml);
@@ -305,7 +315,8 @@
$("a.editproduct").click( function(e) {
var linkId = this.id;
var productId = linkId.replace("editproduct", "");
var url = '${rootContext}portfolio/product/loan/' + productId;
var getUrl = 'http://localhost:8085/mifosng-provider/api/v1/loanproducts/' + productId;
var putUrl = 'http://localhost:8085/mifosng-provider/api/v1/loanproducts/' + productId;
var templateSelector = "#productFormTemplate";
var width = 800;
@@ -316,7 +327,7 @@
refreshLoanProductsView();
}
popupDialogWithFormView(url, "dialog.title.product.details", templateSelector, width, height, saveSuccessFunction);
popupDialogWithFormView(getUrl, putUrl, 'PUT', "dialog.title.product.details", templateSelector, width, height, saveSuccessFunction);
e.preventDefault();
});
@@ -374,7 +385,7 @@
refreshOfficesView();
}
popupDialogWithFormView(url, "dialog.title.add.office", templateSelector, width, height, saveSuccessFunction);
popupDialogWithFormView(getUrl, postUrl, 'POST', "dialog.title.add.office", templateSelector, width, height, saveSuccessFunction);
e.preventDefault();
});
@@ -399,7 +410,9 @@
$("a.edit").click( function(e) {
var linkId = this.id;
var entityId = linkId.replace("edit", "");
var url = '${rootContext}org/office/' + entityId;
var getUrl = 'http://localhost:8085/mifosng-provider/api/v1/offices/' + entityId;
var putUrl = 'http://localhost:8085/mifosng-provider/api/v1/offices/' + entityId;
var templateSelector = "#officeFormTemplate";
var width = 600;
var height = 400;
@@ -409,7 +422,7 @@
refreshOfficesView();
}
popupDialogWithFormView(url, "dialog.title.office.details", templateSelector, width, height, saveSuccessFunction);
popupDialogWithFormView(getUrl, putUrl, 'PUT', "dialog.title.office.details", templateSelector, width, height, saveSuccessFunction);
e.preventDefault();
});
@@ -444,7 +457,8 @@
// currency configuration
$('#editconfiguration').click(function(e) {
var url = '${rootContext}org/configuration/edit';
var getUrl = 'http://localhost:8085/mifosng-provider/api/v1/configurations/currency';
var putUrl = 'http://localhost:8085/mifosng-provider/api/v1/configurations/currency';
var templateSelector = "#configurationFormTemplate";
var width = 900;
var height = 400;
@@ -453,7 +467,7 @@
$("#dialog-form").dialog("close");
}
popupDialogWithFormView(url, "dialog.title.configuration.currencies", templateSelector, width, height, saveSuccessFunction);
popupDialogWithFormView(getUrl, putUrl, 'PUT', "dialog.title.configuration.currencies", templateSelector, width, height, saveSuccessFunction);
e.preventDefault();
});
@@ -34,8 +34,8 @@
</fieldset>
<fieldset>
<legend><spring:message code="form.legend.loan.product.currency"/></legend>
<label for="selectedCurrency"><spring:message code="form.label.loan.product.currency"/></label>
<select id="selectedCurrency" name="selectedCurrency" title="" style="width: 300px;">
<label for="currencyCode"><spring:message code="form.label.loan.product.currency"/></label>
<select id="currencyCode" name="currencyCode" title="" style="width: 300px;">
{{#each possibleCurrencies}}
{{#if $parent.parent.data.principalMoney.currencyCode===code}}
<option value="{{=code}}" selected="selected">{{=name}}</option>
@@ -44,8 +44,8 @@
{{/if}}
{{/each}}
</select>
<label for="selectedDigitsAfterDecimal"><spring:message code="form.label.loan.product.decimalplaces"/></label>
<input id="selectedDigitsAfterDecimal" name="selectedDigitsAfterDecimal" title="" style="width: 300px;" value="{{=$ctx.number(principalMoney.currencyDigitsAfterDecimal)}}" />
<label for="digitsAfterDecimal"><spring:message code="form.label.loan.product.decimalplaces"/></label>
<input id="digitsAfterDecimal" name="digitsAfterDecimal" title="" style="width: 300px;" value="{{=$ctx.number(principalMoney.currencyDigitsAfterDecimal)}}" />
</fieldset>
<fieldset>
<legend><spring:message code="form.legend.loan.product.loan.terms"/></legend>
@@ -57,15 +57,15 @@
<tr>
<td><spring:message code="form.label.loan.product.loan.amount"/></td>
<td>
<input id="amount" name="amount" title="" style="width: 125px;" value="{{=$ctx.money(principalMoney)}}" />
<input id="principal" name="principal" title="" style="width: 125px;" value="{{=$ctx.money(principalMoney)}}" />
</td>
</tr>
<tr>
<td><spring:message code="form.label.loan.product.repaidevery"/></td>
<td>
<input id="repaidEvery" name="repaidEvery" title="" style="width: 50px;" value="{{=$ctx.number(repaidEvery)}}"/>
<input id="repaymentEvery" name="repaymentEvery" title="" style="width: 50px;" value="{{=$ctx.number(repaidEvery)}}"/>
<select id="selectedRepaymentFrequencyOption" name="selectedRepaymentFrequencyOption" title="" style="width: 121px;">
<select id="repaymentFrequency" name="repaymentFrequency" title="" style="width: 121px;">
{{#each repaymentFrequencyOptions}}
{{#if $ctx.number($parent.parent.data.repaymentPeriodFrequency)===$ctx.number(id)}}
<option value="{{=$ctx.number(id)}}" selected="selected">{{=value}}</option>
@@ -89,9 +89,9 @@
<tr>
<td><spring:message code="form.label.loan.product.nominal.interestrate"/></td>
<td>
<input id="nominalInterestRate" name="nominalInterestRate" title="" style="width: 70px;" value="{{=$ctx.decimal(interestRatePerPeriod, 4)}}" />
<input id="interestRatePerPeriod" name="interestRatePerPeriod" title="" style="width: 70px;" value="{{=$ctx.decimal(interestRatePerPeriod, 4)}}" />
<select id="selectedInterestFrequencyOption" name="selectedInterestFrequencyOption" title="" style="width: 139px;">
<select id="interestRateFrequencyMethod" name="interestRateFrequencyMethod" title="" style="width: 139px;">
{{#each interestFrequencyOptions}}
{{#if $ctx.number($parent.parent.data.interestRatePeriod)===$ctx.number(id)}}
<option value="{{=$ctx.number(id)}}" selected="selected">{{=value}}</option>
@@ -105,7 +105,7 @@
<tr>
<td><spring:message code="form.label.loan.product.amortization"/></td>
<td>
<select id="selectedAmortizationMethodOption" name="selectedAmortizationMethodOption" title="" style="width: 220px;">
<select id="amortizationMethod" name="amortizationMethod" title="" style="width: 220px;">
{{#each possibleAmortizationOptions}}
{{#if $ctx.number($parent.parent.data.amortizationMethod)===$ctx.number(id)}}
<option value="{{=$ctx.number(id)}}" selected="selected">{{=value}}</option>
@@ -119,7 +119,7 @@
<tr>
<td><spring:message code="form.label.loan.product.interest.method"/></td>
<td>
<select id="selectedInterestMethodOption" name="selectedInterestMethodOption" title="" style="width: 220px;">
<select id="interestMethod" name="interestMethod" title="" style="width: 220px;">
{{#each possibleInterestOptions}}
{{#if $ctx.number($parent.parent.data.interestMethod)===$ctx.number(id)}}
<option value="{{=$ctx.number(id)}}" selected="selected">{{=value}}</option>
@@ -133,7 +133,7 @@
<tr>
<td><spring:message code="form.label.loan.product.interest.rate.calcutated.in.period"/></td>
<td>
<select id="interestRateCalculatedInPeriod" name="interestRateCalculatedInPeriod" title="" style="width: 220px;">
<select id="interestCalculationPeriodMethod" name="interestCalculationPeriodMethod" title="" style="width: 220px;">
{{#each possibleInterestRateCalculatedInPeriodOptions}}
{{#if $ctx.number($parent.parent.data.interestRateCalculatedInPeriod)===$ctx.number(id)}}
<option value="{{=$ctx.number(id)}}" selected="selected">{{=value}}</option>
@@ -147,7 +147,7 @@
<tr>
<td><spring:message code="form.label.loan.product.arrears.tolerance"/></td>
<td>
<input id="inArrearsTolerance" name="inArrearsTolerance" title="" style="width: 215px;" value="{{=$ctx.money(inArrearsTolerance)}}" />
<input id="inArrearsToleranceAmount" name="inArrearsToleranceAmount" title="" style="width: 215px;" value="{{=$ctx.money(inArrearsTolerance)}}" />
</td>
</tr>
</table>
@@ -240,10 +240,13 @@
{{/if}}
{{/each}}
</select>
{{#else}}
<input type="hidden" id="rootOffice" name="rootOffice" value="true" />
{{/if}}
<label for="openingDate"><spring:message code="form.label.office.openedon"/></label>
<input id="openingDate" name="openingDate" title="" type="text" value="{{=$ctx.globalDate(openingDate)}}" size="75" class="datepickerfield" />
<input type="hidden" id="dateFormat" name="dateFormat" value="dd MMMM yyyy" />
<label for="openingDateFormatted"><spring:message code="form.label.office.openedon"/></label>
<input id="openingDateFormatted" name="openingDateFormatted" title="" type="text" value="{{=$ctx.globalDate(openingDate)}}" size="75" class="datepickerfield" />
<label for="externalId"><spring:message code="form.label.office.externalid"/></label>
<input id="externalId" name="externalId" title="" type="text" value="{{=externalId}}" size="75"/>
@@ -10,16 +10,13 @@ import org.mifosng.data.ClientDataWithAccountsData;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.EnumOptionReadModel;
import org.mifosng.data.LoanAccountData;
import org.mifosng.data.LoanProductData;
import org.mifosng.data.LoanRepaymentData;
import org.mifosng.data.NewLoanWorkflowStepOneData;
import org.mifosng.data.NoteData;
import org.mifosng.data.OfficeData;
import org.mifosng.data.OrganisationReadModel;
import org.mifosng.data.PermissionData;
import org.mifosng.data.RoleData;
import org.mifosng.data.reports.GenericResultset;
import org.springframework.security.access.prepost.PreAuthorize;
public interface ReadPlatformService {
@@ -27,8 +24,6 @@ public interface ReadPlatformService {
Collection<ClientData> retrieveAllIndividualClients();
Collection<OfficeData> retrieveAllOffices();
ClientData retrieveIndividualClient(Long clientId);
ClientDataWithAccountsData retrieveClientAccountDetails(Long clientId);
@@ -43,28 +38,10 @@ public interface ReadPlatformService {
LoanRepaymentData retrieveLoanRepaymentDetails(Long loanId, Long repaymentId);
Collection<LoanProductData> retrieveAllLoanProducts();
List<CurrencyData> retrieveAllowedCurrencies();
List<CurrencyData> retrieveAllPlatformCurrencies();
List<EnumOptionReadModel> retrieveLoanAmortizationMethodOptions();
List<EnumOptionReadModel> retrieveLoanInterestMethodOptions();
List<EnumOptionReadModel> retrieveLoanInterestRateCalculatedInPeriodOptions();
List<EnumOptionReadModel> retrieveRepaymentFrequencyOptions();
List<EnumOptionReadModel> retrieveInterestFrequencyOptions();
LoanProductData retrieveLoanProduct(Long productId);
LoanProductData retrieveNewLoanProductDetails();
OfficeData retrieveOffice(Long officeId);
Collection<AppUserData> retrieveAllUsers();
AppUserData retrieveNewUserDetails();
@@ -5,14 +5,12 @@ import static org.mifosng.platform.Specifications.loanTransactionsThatMatch;
import static org.mifosng.platform.Specifications.loansThatMatch;
import static org.mifosng.platform.Specifications.usersThatMatch;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -53,12 +51,11 @@ import org.mifosng.platform.currency.domain.ApplicationCurrencyRepository;
import org.mifosng.platform.currency.domain.Money;
import org.mifosng.platform.exceptions.PlatformResourceNotFoundException;
import org.mifosng.platform.exceptions.UnAuthenticatedUserException;
import org.mifosng.platform.loan.domain.AmortizationMethod;
import org.mifosng.platform.loan.domain.Loan;
import org.mifosng.platform.loan.domain.LoanRepository;
import org.mifosng.platform.loan.domain.LoanTransaction;
import org.mifosng.platform.loan.domain.LoanTransactionRepository;
import org.mifosng.platform.loan.domain.PeriodFrequencyType;
import org.mifosng.platform.loanproduct.service.LoanProductReadPlatformService;
import org.mifosng.platform.organisation.domain.Organisation;
import org.mifosng.platform.user.domain.AppUser;
import org.mifosng.platform.user.domain.AppUserRepository;
@@ -91,14 +88,18 @@ public class ReadPlatformServiceImpl implements ReadPlatformService {
private final AppUserRepository appUserRepository;
private final RoleRepository roleRepository;
private final LoanProductReadPlatformService loanProductReadPlatformService;
@Autowired
public ReadPlatformServiceImpl(final DataSource dataSource,
public ReadPlatformServiceImpl(final LoanProductReadPlatformService loanProductReadPlatformService,
final DataSource dataSource,
final ClientRepository clientRepository,
final LoanRepository loanRepository,
final LoanTransactionRepository loanTransactionRepository,
final ApplicationCurrencyRepository applicationCurrencyRepository,
final AppUserRepository appUserRepository,
final RoleRepository roleRepository) {
this.loanProductReadPlatformService = loanProductReadPlatformService;
this.loanTransactionRepository = loanTransactionRepository;
this.applicationCurrencyRepository = applicationCurrencyRepository;
this.appUserRepository = appUserRepository;
@@ -360,47 +361,6 @@ public class ReadPlatformServiceImpl implements ReadPlatformService {
}
}
@Override
public Collection<OfficeData> retrieveAllOffices() {
return retrieveOffices();
}
@Override
public OfficeData retrieveOffice(final Long officeId) {
try {
AppUser currentUser = extractAuthenticatedUser();
OfficeMapper rm = new OfficeMapper();
String sql = "select " + rm.officeSchema()
+ " where o.org_id = ? and o.id = ?";
OfficeData selectedOffice = this.jdbcTemplate.queryForObject(sql,
rm, new Object[] { currentUser.getOrganisation().getId(),
officeId });
List<OfficeData> allowedParents = new ArrayList<OfficeData>();
if (StringUtils.isNotBlank(selectedOffice.getParentName())) {
Collection<OfficeData> allOffices = retrieveAllOffices();
for (OfficeData office : allOffices) {
if (!office.getId().equals(selectedOffice.getId())) {
allowedParents.add(office);
}
}
}
selectedOffice.setAllowedParents(allowedParents);
return selectedOffice;
} catch (EmptyResultDataAccessException e) {
throw new PlatformResourceNotFoundException("error.msg.office.id.invalid", "Office with identifier {0} does not exist", officeId);
}
}
@Override
public ClientData retrieveIndividualClient(final Long clientId) {
@@ -571,12 +531,12 @@ public class ReadPlatformServiceImpl implements ReadPlatformService {
workflowData.setOrganisationName(currentUser.getOrganisation()
.getName());
Collection<LoanProductData> loanProducts = retrieveAllLoanProducts();
Collection<LoanProductData> loanProducts = this.loanProductReadPlatformService.retrieveAllLoanProducts();
workflowData.setAllowedProducts(new ArrayList<LoanProductData>(
loanProducts));
if (loanProducts.size() == 1) {
LoanProductData selectedProduct = retrieveLoanProduct(workflowData.getAllowedProducts().get(0).getId());
LoanProductData selectedProduct = this.loanProductReadPlatformService.retrieveLoanProduct(workflowData.getAllowedProducts().get(0).getId());
workflowData.setProductId(selectedProduct.getId());
workflowData.setProductName(selectedProduct.getName());
@@ -597,10 +557,10 @@ public class ReadPlatformServiceImpl implements ReadPlatformService {
}
private LoanProductData findLoanProductById(Collection<LoanProductData> loanProducts, Long productId) {
LoanProductData match = retrieveNewLoanProductDetails();
LoanProductData match = this.loanProductReadPlatformService.retrieveNewLoanProductDetails();
for (LoanProductData loanProductData : loanProducts) {
if (loanProductData.getId().equals(productId)) {
match = retrieveLoanProduct(loanProductData.getId());
match = this.loanProductReadPlatformService.retrieveLoanProduct(loanProductData.getId());
break;
}
}
@@ -707,165 +667,6 @@ public class ReadPlatformServiceImpl implements ReadPlatformService {
tolerance, loanData, waiveAllowed, interestRebateOwed);
}
@Override
public Collection<LoanProductData> retrieveAllLoanProducts() {
AppUser currentUser = extractAuthenticatedUser();
List<CurrencyData> allowedCurrencies = retrieveAllowedCurrencies();
LoanProductMapper rm = new LoanProductMapper(allowedCurrencies);
String sql = "select " + rm.loanProductSchema()
+ " where lp.org_id = ?";
return this.jdbcTemplate.query(sql, rm, new Object[] { currentUser
.getOrganisation().getId() });
}
protected static final class LoanProductMapper implements
RowMapper<LoanProductData> {
private final List<CurrencyData> allowedCurrencies;
public LoanProductMapper(List<CurrencyData> allowedCurrencies) {
this.allowedCurrencies = allowedCurrencies;
}
public String loanProductSchema() {
return "lp.id as id, lp.name as name, lp.description as description, lp.flexible_repayment_schedule as isFlexible, lp.interest_rebate as isInterestRebateAllowed, "
+ "lp.principal_amount as principal, lp.currency_code as currencyCode, lp.currency_digits as currencyDigits, "
+ "lp.nominal_interest_rate_per_period as interestRatePerPeriod, lp.interest_period_frequency_enum as interestRatePerPeriodFreq, "
+ "lp.annual_nominal_interest_rate as annualInterestRate, lp.interest_method_enum as interestMethod, lp.interest_calculated_in_period_enum as interestCalculationInPeriodMethod,"
+ "lp.repay_every as repaidEvery, lp.repayment_period_frequency_enum as repaymentPeriodFrequency, lp.number_of_repayments as numberOfRepayments, "
+ "lp.amortization_method_enum as amortizationMethod, lp.arrearstolerance_amount as tolerance, "
+ "lp.created_date as createdon, lp.lastmodified_date as modifiedon "
+ " from portfolio_product_loan lp";
}
@Override
public LoanProductData mapRow(final ResultSet rs, final int rowNum)
throws SQLException {
Long id = rs.getLong("id");
String name = rs.getString("name");
String description = rs.getString("description");
boolean isFlexible = rs.getBoolean("isFlexible");
boolean isInterestRebateAllowed = rs
.getBoolean("isInterestRebateAllowed");
String currencyCode = rs.getString("currencyCode");
int currencyDigits = rs.getInt("currencyDigits");
CurrencyData currencyData = findCurrencyByCode(currencyCode, allowedCurrencies);
currencyData.setDecimalPlaces(currencyDigits);
BigDecimal principal = rs.getBigDecimal("principal");
BigDecimal tolerance = rs.getBigDecimal("tolerance");
MoneyData principalMoney = MoneyData.of(currencyData, principal);
MoneyData toleranceMoney = MoneyData.of(currencyData, tolerance);
BigDecimal interestRatePerPeriod = rs
.getBigDecimal("interestRatePerPeriod");
int interestRatePeriod = rs.getInt("interestRatePerPeriodFreq");
BigDecimal annualInterestRate = rs
.getBigDecimal("annualInterestRate");
int interestMethod = rs.getInt("interestMethod");
int interestCalculationInPeriodMethod = rs.getInt("interestCalculationInPeriodMethod");
int repaidEvery = rs.getInt("repaidEvery");
int repaymentFrequency = rs.getInt("repaymentPeriodFrequency");
int numberOfRepayments = rs.getInt("numberOfRepayments");
int amortizationMethod = rs.getInt("amortizationMethod");
DateTime createdOn = new DateTime(rs.getDate("createdOn"));
DateTime lastModifedOn = new DateTime(rs.getDate("modifiedon"));
return new LoanProductData(id, name, description, isFlexible,
isInterestRebateAllowed, principalMoney,
interestRatePerPeriod, interestRatePeriod,
annualInterestRate, interestMethod, interestCalculationInPeriodMethod,
repaidEvery,
repaymentFrequency, numberOfRepayments, amortizationMethod,
toleranceMoney, createdOn, lastModifedOn);
}
private CurrencyData findCurrencyByCode(String currencyCode, List<CurrencyData> allowedCurrencies) {
CurrencyData match = null;
for (CurrencyData currencyData : allowedCurrencies) {
if (currencyData.getCode().equalsIgnoreCase(currencyCode)) {
match = currencyData;
break;
}
}
return match;
}
}
@Override
public LoanProductData retrieveLoanProduct(final Long loanProductId) {
// TODO - switch back to retrieve all allowed organisation currencies
List<CurrencyData> allowedCurrencies = retrieveAllPlatformCurrencies();
LoanProductMapper rm = new LoanProductMapper(allowedCurrencies);
String sql = "select " + rm.loanProductSchema() + " where lp.id = ?";
LoanProductData productData = this.jdbcTemplate.queryForObject(sql, rm,
new Object[] { loanProductId });
populateProductDataWithDropdownOptions(productData);
return productData;
}
private void populateProductDataWithDropdownOptions(
LoanProductData productData) {
List<CurrencyData> possibleCurrencies = retrieveAllowedCurrencies();
List<EnumOptionReadModel> possibleAmortizationOptions = retrieveLoanAmortizationMethodOptions();
List<EnumOptionReadModel> possibleInterestOptions = retrieveLoanInterestMethodOptions();
List<EnumOptionReadModel> possibleInterestRateCalculatedInPeriodOptions = retrieveLoanInterestRateCalculatedInPeriodOptions();
List<EnumOptionReadModel> repaymentFrequencyOptions = retrieveRepaymentFrequencyOptions();
List<EnumOptionReadModel> interestFrequencyOptions = retrieveInterestFrequencyOptions();
productData.setPossibleCurrencies(possibleCurrencies);
productData.setPossibleAmortizationOptions(possibleAmortizationOptions);
productData.setPossibleInterestOptions(possibleInterestOptions);
productData.setPossibleInterestRateCalculatedInPeriodOptions(possibleInterestRateCalculatedInPeriodOptions);
productData.setRepaymentFrequencyOptions(repaymentFrequencyOptions);
productData.setInterestFrequencyOptions(interestFrequencyOptions);
}
@Override
public LoanProductData retrieveNewLoanProductDetails() {
LoanProductData productData = new LoanProductData();
populateProductDataWithDropdownOptions(productData);
if (productData.getPossibleCurrencies().size() >= 1) {
CurrencyData currency = productData.getPossibleCurrencies().get(0);
MoneyData zero = MoneyData.zero(currency);
productData.setPrincipalMoney(zero);
productData.setInArrearsTolerance(zero);
}
productData.setAmortizationMethod(Integer.valueOf(1));
productData.setInterestMethod(Integer.valueOf(0));
productData.setRepaymentPeriodFrequency(2);
productData.setInterestRatePeriod(2);
productData.setInterestRateCalculatedInPeriod(1);
productData.setRepaidEvery(1);
productData.setNumberOfRepayments(0);
return productData;
}
@Override
public List<CurrencyData> retrieveAllowedCurrencies() {
@@ -906,71 +707,7 @@ public class ReadPlatformServiceImpl implements ReadPlatformService {
nameCode);
}
}
@Override
public List<EnumOptionReadModel> retrieveLoanAmortizationMethodOptions() {
EnumOptionReadModel equalInstallments = new EnumOptionReadModel(
"Equal installments", AmortizationMethod.EQUAL_INSTALLMENTS
.getValue().longValue());
EnumOptionReadModel equalPrinciplePayments = new EnumOptionReadModel(
"Equal principle payments", AmortizationMethod.EQUAL_PRINCIPAL
.getValue().longValue());
List<EnumOptionReadModel> allowedAmortizationMethods = Arrays.asList(
equalInstallments, equalPrinciplePayments);
return allowedAmortizationMethods;
}
@Override
public List<EnumOptionReadModel> retrieveLoanInterestMethodOptions() {
EnumOptionReadModel interestRateCalculationMethod2 = new EnumOptionReadModel(
"Declining Balance", Long.valueOf(0));
EnumOptionReadModel interestRateCalculationMethod1 = new EnumOptionReadModel(
"Flat", Long.valueOf(1));
List<EnumOptionReadModel> allowedRepaymentScheduleCalculationMethods = Arrays
.asList(interestRateCalculationMethod2,
interestRateCalculationMethod1);
return allowedRepaymentScheduleCalculationMethods;
}
@Override
public List<EnumOptionReadModel> retrieveLoanInterestRateCalculatedInPeriodOptions() {
EnumOptionReadModel option1 = new EnumOptionReadModel("Daily", Long.valueOf(0));
EnumOptionReadModel option2 = new EnumOptionReadModel("Same as repayment period", Long.valueOf(1));
List<EnumOptionReadModel> allowedOptions = Arrays.asList(option1,option2);
return allowedOptions;
}
@Override
public List<EnumOptionReadModel> retrieveRepaymentFrequencyOptions() {
EnumOptionReadModel frequency1 = new EnumOptionReadModel("Days",
Long.valueOf(0));
EnumOptionReadModel frequency2 = new EnumOptionReadModel("Weeks",
Long.valueOf(1));
EnumOptionReadModel frequency3 = new EnumOptionReadModel("Months",
Long.valueOf(2));
List<EnumOptionReadModel> repaymentFrequencyOptions = Arrays.asList(
frequency1, frequency2, frequency3);
return repaymentFrequencyOptions;
}
@Override
public List<EnumOptionReadModel> retrieveInterestFrequencyOptions() {
// support for monthly and annual percentage rate (MPR) and (APR)
EnumOptionReadModel perMonth = new EnumOptionReadModel("Per month",
PeriodFrequencyType.MONTHS.getValue().longValue());
EnumOptionReadModel perYear = new EnumOptionReadModel("Per year",
PeriodFrequencyType.YEARS.getValue().longValue());
List<EnumOptionReadModel> repaymentFrequencyOptions = Arrays.asList(perMonth, perYear);
return repaymentFrequencyOptions;
}
@Override
public Collection<AppUserData> retrieveAllUsers() {
@@ -4,17 +4,14 @@ import org.mifosng.data.EntityIdentifier;
import org.mifosng.data.command.AdjustLoanTransactionCommand;
import org.mifosng.data.command.ChangePasswordCommand;
import org.mifosng.data.command.EnrollClientCommand;
import org.mifosng.data.command.LoanProductCommand;
import org.mifosng.data.command.LoanStateTransitionCommand;
import org.mifosng.data.command.LoanTransactionCommand;
import org.mifosng.data.command.NoteCommand;
import org.mifosng.data.command.OfficeCommand;
import org.mifosng.data.command.RoleCommand;
import org.mifosng.data.command.SignupCommand;
import org.mifosng.data.command.SubmitLoanApplicationCommand;
import org.mifosng.data.command.UndoLoanApprovalCommand;
import org.mifosng.data.command.UndoLoanDisbursalCommand;
import org.mifosng.data.command.UpdateOrganisationCurrencyCommand;
import org.mifosng.data.command.UpdateUsernamePasswordCommand;
import org.mifosng.data.command.UserCommand;
import org.mifosng.platform.exceptions.InvalidSignupException;
@@ -22,10 +19,6 @@ import org.springframework.security.access.prepost.PreAuthorize;
public interface WritePlatformService {
Long createOffice(OfficeCommand command);
Long updateOffice(OfficeCommand command);
Long createUser(UserCommand command);
Long updateUser(UserCommand command);
@@ -50,12 +43,6 @@ public interface WritePlatformService {
@PreAuthorize(value = "hasAnyRole('PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE', 'CAN_ENROLL_NEW_CLIENT_ROLE')")
Long enrollClient(EnrollClientCommand command);
void updateOrganisationCurrencies(UpdateOrganisationCurrencyCommand command);
EntityIdentifier createLoanProduct(LoanProductCommand command);
EntityIdentifier updateLoanProduct(LoanProductCommand command);
@PreAuthorize(value = "hasAnyRole('PORTFOLIO_MANAGEMENT_SUPER_USER_ROLE', 'CAN_DELETE_LOAN_THAT_IS_SUBMITTED_AND_NOT_APPROVED')")
EntityIdentifier deleteLoan(Long loanId);
@@ -2,7 +2,6 @@ package org.mifosng.platform;
import static org.mifosng.platform.Specifications.loansThatMatch;
import static org.mifosng.platform.Specifications.officesThatMatch;
import static org.mifosng.platform.Specifications.productThatMatches;
import static org.mifosng.platform.Specifications.rolesThatMatch;
import static org.mifosng.platform.Specifications.usersThatMatch;
@@ -25,32 +24,26 @@ import org.mifosng.data.command.AdjustLoanTransactionCommand;
import org.mifosng.data.command.CalculateLoanScheduleCommand;
import org.mifosng.data.command.ChangePasswordCommand;
import org.mifosng.data.command.EnrollClientCommand;
import org.mifosng.data.command.LoanProductCommand;
import org.mifosng.data.command.LoanStateTransitionCommand;
import org.mifosng.data.command.LoanTransactionCommand;
import org.mifosng.data.command.NoteCommand;
import org.mifosng.data.command.OfficeCommand;
import org.mifosng.data.command.RoleCommand;
import org.mifosng.data.command.SignupCommand;
import org.mifosng.data.command.SubmitLoanApplicationCommand;
import org.mifosng.data.command.UndoLoanApprovalCommand;
import org.mifosng.data.command.UndoLoanDisbursalCommand;
import org.mifosng.data.command.UpdateOrganisationCurrencyCommand;
import org.mifosng.data.command.UpdateUsernamePasswordCommand;
import org.mifosng.data.command.UserCommand;
import org.mifosng.platform.client.domain.Client;
import org.mifosng.platform.client.domain.ClientRepository;
import org.mifosng.platform.client.domain.Note;
import org.mifosng.platform.client.domain.NoteRepository;
import org.mifosng.platform.currency.domain.ApplicationCurrency;
import org.mifosng.platform.currency.domain.ApplicationCurrencyRepository;
import org.mifosng.platform.currency.domain.MonetaryCurrency;
import org.mifosng.platform.currency.domain.Money;
import org.mifosng.platform.exceptions.ApplicationDomainRuleException;
import org.mifosng.platform.exceptions.InvalidSignupException;
import org.mifosng.platform.exceptions.NewDataValidationException;
import org.mifosng.platform.exceptions.NoAuthorizationException;
import org.mifosng.platform.exceptions.PlatformDataIntegrityException;
import org.mifosng.platform.exceptions.UnAuthenticatedUserException;
import org.mifosng.platform.infrastructure.BasicPasswordEncodablePlatformUser;
import org.mifosng.platform.infrastructure.PlatformPasswordEncoder;
@@ -73,13 +66,11 @@ import org.mifosng.platform.loan.domain.LoanStatusRepository;
import org.mifosng.platform.loan.domain.LoanTransaction;
import org.mifosng.platform.loan.domain.LoanTransactionRepository;
import org.mifosng.platform.loan.domain.PeriodFrequencyType;
import org.mifosng.platform.loanproduct.service.LoanProductCommandValidator;
import org.mifosng.platform.organisation.domain.Office;
import org.mifosng.platform.organisation.domain.OfficeRepository;
import org.mifosng.platform.organisation.domain.Organisation;
import org.mifosng.platform.organisation.domain.OrganisationCurrency;
import org.mifosng.platform.organisation.domain.OrganisationRepository;
import org.mifosng.platform.organisation.service.OfficeCommandValidator;
import org.mifosng.platform.user.domain.AppUser;
import org.mifosng.platform.user.domain.AppUserRepository;
import org.mifosng.platform.user.domain.Permission;
@@ -88,8 +79,6 @@ import org.mifosng.platform.user.domain.PlatformUserRepository;
import org.mifosng.platform.user.domain.Role;
import org.mifosng.platform.user.domain.RoleRepository;
import org.mifosng.platform.user.domain.UserDomainService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.security.core.Authentication;
@@ -99,19 +88,14 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class WritePlatformServiceJpaRepositoryImpl implements
WritePlatformService {
public class WritePlatformServiceJpaRepositoryImpl implements WritePlatformService {
private final static Logger logger = LoggerFactory
.getLogger(WritePlatformServiceJpaRepositoryImpl.class);
private final OrganisationRepository organisationRepository;
private final OfficeRepository officeRepository;
private final UserDomainService userDomainService;
private final PlatformUserRepository platformUserRepository;
private final PlatformPasswordEncoder platformPasswordEncoder;
private final ClientRepository clientRepository;
private final ApplicationCurrencyRepository applicationCurrencyRepository;
private final LoanProductRepository loanProductRepository;
private final LoanRepository loanRepository;
private final LoanStatusRepository loanStatusRepository;
@@ -131,7 +115,6 @@ public class WritePlatformServiceJpaRepositoryImpl implements
final PlatformPasswordEncoder platformPasswordEncoder,
final ClientRepository clientRepository,
final NoteRepository noteRepository,
final ApplicationCurrencyRepository applicationCurrencyRepository,
final LoanProductRepository loanProductRepository,
final LoanRepository loanRepository,
final LoanTransactionRepository loanTransactionRepository,
@@ -147,7 +130,6 @@ public class WritePlatformServiceJpaRepositoryImpl implements
this.platformPasswordEncoder = platformPasswordEncoder;
this.clientRepository = clientRepository;
this.noteRepository = noteRepository;
this.applicationCurrencyRepository = applicationCurrencyRepository;
this.loanProductRepository = loanProductRepository;
this.loanRepository = loanRepository;
this.loanTransactionRepository = loanTransactionRepository;
@@ -330,94 +312,6 @@ public class WritePlatformServiceJpaRepositoryImpl implements
return role.getId();
}
@Transactional
@Override
public Long createOffice(final OfficeCommand command) {
try {
AppUser currentUser = extractAuthenticatedUser();
OfficeCommandValidator validator = new OfficeCommandValidator(command.getName(), command.getParentId(), command.getOpeningDate(), command.getExternalId());
validator.validate();
Office parent = validateUserPriviledgeOnOfficeAndRetrieve(currentUser, command.getParentId());
Office office = Office.createNew(currentUser.getOrganisation(), parent, command.getName(), command.getOpeningDate(), command.getExternalId());
// pre save to generate id for use in office hierarchy
this.officeRepository.save(office);
office.generateHierarchy();
this.officeRepository.save(office);
return office.getId();
} catch (DataIntegrityViolationException dve) {
handleOfficeDataIntegrityIssues(command, dve);
return Long.valueOf(-1);
}
}
@Transactional
@Override
public Long updateOffice(final OfficeCommand command) {
try {
AppUser currentUser = extractAuthenticatedUser();
OfficeCommandValidator validator = new OfficeCommandValidator(command.getName(), command.getParentId(), command.getOpeningDate(), command.getExternalId());
validator.validate();
Office office = validateUserPriviledgeOnOfficeAndRetrieve(currentUser, command.getId());
office.update(command.getName(), command.getExternalId(), command.getOpeningDate());
this.officeRepository.save(office);
return office.getId();
} catch (DataIntegrityViolationException dve) {
handleOfficeDataIntegrityIssues(command, dve);
return Long.valueOf(-1);
}
}
/*
* Guaranteed to throw an exception no matter what the data integrity issue is.
*/
private void handleOfficeDataIntegrityIssues(final OfficeCommand command, DataIntegrityViolationException dve) {
Throwable realCause = dve.getMostSpecificCause();
if (realCause.getMessage().contains("externalid_org")) {
throw new PlatformDataIntegrityException("error.msg.office.duplicate.externalId", "Office with externalId {0} already exists", "externalId", command.getExternalId());
} else if (realCause.getMessage().contains("name_org")) {
throw new PlatformDataIntegrityException("error.msg.office.duplicate.name", "Office with name {0} already exists", "name", command.getName());
}
logger.error(dve.getMessage(), dve);
throw new PlatformDataIntegrityException("error.msg.office.unknown.data.integrity.issue", "Unknown data integrity issue with resource.");
}
/*
* used to restrict modifying operations to office that are either the users office or lower (child) in the office hierarchy
*/
private Office validateUserPriviledgeOnOfficeAndRetrieve(AppUser currentUser, Long officeId) {
Office userOffice = this.officeRepository.findOne(officesThatMatch(currentUser.getOrganisation(), currentUser.getOffice().getId()));
if (userOffice.doesNotHaveAnOfficeInHierarchyWithId(officeId)) {
ErrorResponse error = new ErrorResponse("error.msg.office.not.authorized", "id", officeId.toString());
throw new ApplicationDomainRuleException(Arrays.asList(error), "Errors exist.");
}
Office officeToReturn = userOffice;
if (!userOffice.identifiedBy(officeId)) {
officeToReturn = this.officeRepository.findOne(officesThatMatch(currentUser.getOrganisation(), officeId));
}
return officeToReturn;
}
@Transactional
@Override
public Long signup(final SignupCommand command) {
@@ -441,75 +335,6 @@ public class WritePlatformServiceJpaRepositoryImpl implements
throw new InvalidSignupException(e);
}
}
@Transactional
@Override
public EntityIdentifier createLoanProduct(final LoanProductCommand command) {
AppUser currentUser = extractAuthenticatedUser();
LoanProductCommandValidator validator = new LoanProductCommandValidator();
validator.validateForCreate(command);
// assemble LoanProduct from data
InterestMethod interestMethod = InterestMethod.fromInt(command.getInterestMethod());
InterestCalculationPeriodMethod interestCalculationPeriodMethod = InterestCalculationPeriodMethod.fromInt(command.getInterestCalculationPeriodMethod());
AmortizationMethod amortizationMethod = AmortizationMethod.fromInt(command.getAmortizationMethod());
PeriodFrequencyType repaymentFrequencyType = PeriodFrequencyType
.fromInt(command.getRepaymentFrequency());
PeriodFrequencyType interestFrequencyType = PeriodFrequencyType
.fromInt(command.getInterestRateFrequencyMethod());
MonetaryCurrency currency = new MonetaryCurrency(command.getCurrencyCode(), command.getDigitsAfterDecimal());
// apr calculator
BigDecimal annualInterestRate = BigDecimal.ZERO;
switch (interestFrequencyType) {
case DAYS:
break;
case WEEKS:
annualInterestRate = command.getInterestRatePerPeriod().multiply(BigDecimal.valueOf(52));
break;
case MONTHS:
annualInterestRate = command.getInterestRatePerPeriod().multiply(BigDecimal.valueOf(12));
break;
case YEARS:
annualInterestRate = command.getInterestRatePerPeriod().multiply(BigDecimal.valueOf(1));
break;
case INVALID:
break;
}
LoanProduct loanproduct = new LoanProduct(currentUser.getOrganisation(), command.getName(), command.getDescription(),
currency, command.getPrincipal(),
command.getInterestRatePerPeriod(), interestFrequencyType, annualInterestRate, interestMethod, interestCalculationPeriodMethod,
command.getRepaymentEvery(), repaymentFrequencyType, command.getNumberOfRepayments(), amortizationMethod, command.getInArrearsToleranceAmount(),
command.isFlexibleRepaymentSchedule(), command.isInterestRebateAllowed());
this.loanProductRepository.save(loanproduct);
return new EntityIdentifier(loanproduct.getId());
}
@Transactional
@Override
public EntityIdentifier updateLoanProduct(LoanProductCommand command) {
AppUser currentUser = extractAuthenticatedUser();
LoanProductCommandValidator validator = new LoanProductCommandValidator();
validator.validateForUpdate(command);
LoanProduct product = this.loanProductRepository.findOne(productThatMatches(currentUser.getOrganisation(), command.getId()));
product.update(command);
this.loanProductRepository.save(product);
return new EntityIdentifier(Long.valueOf(product.getId()));
}
@Transactional
@Override
@@ -565,35 +390,6 @@ public class WritePlatformServiceJpaRepositoryImpl implements
return newClient.getId();
}
@Transactional
@Override
public void updateOrganisationCurrencies(final UpdateOrganisationCurrencyCommand command) {
AppUser currentUser = extractAuthenticatedUser();
if (command.getCodes().isEmpty()) {
List<ErrorResponse> dataValidationErrors = Arrays.asList(new ErrorResponse("validation.msg.organisation.allowed.currencies.cannot.be.blank", "selectedItems"));
throw new NewDataValidationException(dataValidationErrors, "Data validation errors exist.");
}
Set<OrganisationCurrency> allowedCurrencies = new HashSet<OrganisationCurrency>();
for (String currencyCode : command.getCodes()) {
ApplicationCurrency currency = this.applicationCurrencyRepository.findOneByCode(currencyCode);
OrganisationCurrency allowedCurrency = new OrganisationCurrency(
currency.getCode(), currency.getName(),
currency.getDecimalPlaces(), currency.getNameCode(), currency.getDisplaySymbol());
allowedCurrencies.add(allowedCurrency);
}
Organisation org = currentUser.getOrganisation();
org.setAllowedCurrencies(allowedCurrencies);
this.organisationRepository.save(org);
}
private AppUser extractAuthenticatedUser() {
AppUser currentUser = null;
SecurityContext context = SecurityContextHolder.getContext();
@@ -0,0 +1,51 @@
package org.mifosng.platform.api.configuration;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.mifosng.data.ConfigurationData;
import org.mifosng.data.command.OrganisationCurrencyCommand;
import org.mifosng.platform.configuration.service.ConfigurationReadPlatformService;
import org.mifosng.platform.configuration.service.ConfigurationWritePlatformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Path("/v1/configurations")
@Component
@Scope("singleton")
public class ConfigurationApiResource {
@Autowired
private ConfigurationReadPlatformService configurationReadPlatformService;
@Autowired
private ConfigurationWritePlatformService configurationWritePlatformService;
@GET
@Path("currency")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Produces({MediaType.APPLICATION_JSON})
public Response retrieveCurrencyDataForConfiguration() {
ConfigurationData configurationData = this.configurationReadPlatformService.retrieveCurrencyConfiguration();
return Response.ok().entity(configurationData).build();
}
@PUT
@Path("currency")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Produces({ MediaType.APPLICATION_JSON})
public Response updateAllowedCurrenciesForOrganisation(OrganisationCurrencyCommand command) {
this.configurationWritePlatformService.updateOrganisationCurrencies(command);
return Response.ok().entity(command).build();
}
}
@@ -2,7 +2,6 @@ package org.mifosng.platform.api.loanproduct;
import java.util.Collection;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
@@ -10,7 +9,6 @@ import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@@ -74,13 +72,11 @@ public class LoanProductApiResource {
@POST
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON})
public Response createLoanProduct(@Context HttpServletRequest request) {
public Response createLoanProduct(LoanProductCommand command) {
hardcodeUserIntoSecurityContext();
// TODO - FIX mapping to command object on post and also fix error handling of this when it fails.
EntityIdentifier entityIdentifier = new EntityIdentifier(Long.valueOf(-1));
// this.loanProductWritePlatformService.createLoanProduct(command);
EntityIdentifier entityIdentifier = this.loanProductWritePlatformService.createLoanProduct(command);
return Response.ok().entity(entityIdentifier).build();
}
@@ -1,6 +1,9 @@
package org.mifosng.platform.api.office;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
@@ -12,16 +15,22 @@ import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.mifosng.data.ApiParameterError;
import org.mifosng.data.EntityIdentifier;
import org.mifosng.data.OfficeData;
import org.mifosng.data.OfficeList;
import org.mifosng.data.command.OfficeCommand;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
import org.mifosng.platform.organisation.service.OfficeReadPlatformService;
import org.mifosng.platform.organisation.service.OfficeWritePlatformService;
import org.mifosng.platform.user.domain.AppUser;
import org.mifosng.platform.user.domain.AppUserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
@@ -61,12 +70,27 @@ public class OfficeApiResource {
return Response.ok().entity(new OfficeList(offices)).build();
}
@GET
@Path("template")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({MediaType.APPLICATION_JSON})
public Response retrieveOfficeTemplate() {
hardcodeUserIntoSecurityContext();
OfficeData newOfficeTemplate = this.readPlatformService.retrieveNewOfficeTemplate();
return Response.ok().entity(newOfficeTemplate).build();
}
@POST
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON})
public Response createOffice(final OfficeCommand command) {
hardcodeUserIntoSecurityContext();
LocalDate openingDate = parseStringToLocalDate(command.getOpeningDateFormatted(), "openingDateFormatted", command.getDateFormat());
command.setOpeningDate(openingDate);
Long officeId = this.writePlatformService.createOffice(command);
return Response.ok().entity(new EntityIdentifier(officeId)).build();
@@ -89,11 +113,33 @@ public class OfficeApiResource {
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON})
public Response updateOffice(@PathParam("officeId") final Long officeId, final OfficeCommand command) {
LocalDate openingDate = parseStringToLocalDate(command.getOpeningDateFormatted(), "openingDateFormatted", command.getDateFormat());
hardcodeUserIntoSecurityContext();
command.setId(officeId);
command.setOpeningDate(openingDate);
Long entityId = this.writePlatformService.updateOffice(command);
return Response.ok().entity(new EntityIdentifier(entityId)).build();
}
private LocalDate parseStringToLocalDate(String eventDate, String dateFieldIdentifier, String dateFormat) {
LocalDate eventLocalDate = null;
if (StringUtils.isNotBlank(eventDate)) {
try {
Locale locale = LocaleContextHolder.getLocale();
eventLocalDate = DateTimeFormat.forPattern(dateFormat).withLocale(locale).parseLocalDate(eventDate.toLowerCase(locale));
} catch (IllegalArgumentException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError("validation.msg.invalid.date.format", "The parameter " + dateFieldIdentifier + " is invalid.", dateFieldIdentifier, eventDate);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
}
}
return eventLocalDate;
}
}
@@ -0,0 +1,9 @@
package org.mifosng.platform.configuration.service;
import org.mifosng.data.ConfigurationData;
public interface ConfigurationReadPlatformService {
ConfigurationData retrieveCurrencyConfiguration();
}
@@ -0,0 +1,36 @@
package org.mifosng.platform.configuration.service;
import java.util.ArrayList;
import java.util.List;
import org.mifosng.data.ConfigurationData;
import org.mifosng.data.CurrencyData;
import org.mifosng.platform.currency.service.CurrencyReadPlatformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ConfigurationReadPlatformServiceImpl implements ConfigurationReadPlatformService {
private final CurrencyReadPlatformService currencyReadPlatformService;
@Autowired
public ConfigurationReadPlatformServiceImpl(final CurrencyReadPlatformService currencyReadPlatformService) {
this.currencyReadPlatformService = currencyReadPlatformService;
}
@Override
public ConfigurationData retrieveCurrencyConfiguration() {
List<CurrencyData> selectedCurrencyOptions = new ArrayList<CurrencyData>(this.currencyReadPlatformService.retrieveAllowedCurrencies());
List<CurrencyData> currencyOptions = new ArrayList<CurrencyData>(this.currencyReadPlatformService.retrieveAllPlatformCurrencies());
// remove selected currency options
currencyOptions.removeAll(selectedCurrencyOptions);
ConfigurationData configurationData = new ConfigurationData();
configurationData.setCurrencyOptions(currencyOptions);
configurationData.setSelectedCurrencyOptions(selectedCurrencyOptions);
return configurationData;
}
}
@@ -0,0 +1,9 @@
package org.mifosng.platform.configuration.service;
import org.mifosng.data.command.OrganisationCurrencyCommand;
public interface ConfigurationWritePlatformService {
void updateOrganisationCurrencies(OrganisationCurrencyCommand command);
}
@@ -0,0 +1,76 @@
package org.mifosng.platform.configuration.service;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.mifosng.data.ApiParameterError;
import org.mifosng.data.command.OrganisationCurrencyCommand;
import org.mifosng.platform.currency.domain.ApplicationCurrency;
import org.mifosng.platform.currency.domain.ApplicationCurrencyRepository;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
import org.mifosng.platform.organisation.domain.Organisation;
import org.mifosng.platform.organisation.domain.OrganisationCurrency;
import org.mifosng.platform.organisation.domain.OrganisationRepository;
import org.mifosng.platform.security.PlatformSecurityContext;
import org.mifosng.platform.user.domain.AppUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class ConfigurationWritePlatformServiceJpaRepositoryImpl implements ConfigurationWritePlatformService {
private final PlatformSecurityContext context;
private final OrganisationRepository organisationRepository;
private final ApplicationCurrencyRepository applicationCurrencyRepository;
@Autowired
public ConfigurationWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final OrganisationRepository organisationRepository,
final ApplicationCurrencyRepository applicationCurrencyRepository) {
this.context = context;
this.organisationRepository = organisationRepository;
this.applicationCurrencyRepository = applicationCurrencyRepository;
}
@Transactional
@Override
public void updateOrganisationCurrencies(final OrganisationCurrencyCommand command) {
AppUser currentUser = context.authenticatedUser();
if (command.getSelectedItems().isEmpty()) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError("validation.msg.organisation.allowed.currencies.cannot.be.blank", "The parameter selectedItems is invalid.", "selectedItems");
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
}
Set<OrganisationCurrency> allowedCurrencies = new HashSet<OrganisationCurrency>();
for (String currencyCode : command.getSelectedItems()) {
ApplicationCurrency currency = this.applicationCurrencyRepository.findOneByCode(currencyCode);
if (currency == null) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError("validation.msg.currency.code.invalid", "The parameter selectedItems contains an invalid currency code entry.", "selectedItems", currencyCode);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
}
OrganisationCurrency allowedCurrency = new OrganisationCurrency(
currency.getCode(), currency.getName(),
currency.getDecimalPlaces(), currency.getNameCode(), currency.getDisplaySymbol());
allowedCurrencies.add(allowedCurrency);
}
Organisation org = currentUser.getOrganisation();
org.setAllowedCurrencies(allowedCurrencies);
this.organisationRepository.save(org);
}
}
@@ -17,7 +17,7 @@ public class ResponseCorsFilter implements ContainerResponseFilter {
ResponseBuilder resp = Response.fromResponse(response.getResponse());
resp.header("Access-Control-Allow-Origin", "*").header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
resp.header("Access-Control-Allow-Origin", "*").header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
String reqHead = request.getHeaderValue("Access-Control-Request-Headers");
@@ -6,7 +6,6 @@ import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.mifosng.data.ApiParameterError;
import org.mifosng.data.command.LoanProductCommand;
import org.mifosng.data.command.LoanProductCommandData;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
import org.mifosng.platform.loan.domain.AmortizationMethod;
import org.mifosng.platform.loan.domain.InterestMethod;
@@ -33,7 +32,7 @@ public class LoanProductCommandValidator {
validateRemainingAttributes(command, dataValidationErrors);
}
private void validateRemainingAttributes(LoanProductCommandData command, List<ApiParameterError> dataValidationErrors) {
private void validateRemainingAttributes(LoanProductCommand command, List<ApiParameterError> dataValidationErrors) {
if (StringUtils.isBlank(command.getName())) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.product.name.cannot.be.blank", "The parameter name cannot be blank.", "name");
@@ -38,7 +38,7 @@ public class Office extends AbstractAuditableCustom<AppUser, Long> {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private final Office parent;
private Office parent;
@Column(name = "name", nullable = false, length=100)
private String name;
@@ -109,6 +109,10 @@ public class Office extends AbstractAuditableCustom<AppUser, Long> {
this.openingDate = newOpeningDate.toDateMidnight().toDate();
}
public void update(Office newParent) {
this.parent = newParent;
}
public boolean identifiedBy(String identifier) {
return identifier.equalsIgnoreCase(this.name) || identifier.equalsIgnoreCase(this.externalId);
}
@@ -4,45 +4,39 @@ import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate;
import org.mifosng.data.ApiParameterError;
import org.mifosng.data.command.OfficeCommand;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
public class OfficeCommandValidator {
private final String name;
private final Long parentId;
private final LocalDate openingDate;
private final String externalId;
private final OfficeCommand command;
public OfficeCommandValidator(String name, Long parentId, LocalDate openingDate, String externalId) {
this.name = name;
this.parentId = parentId;
this.openingDate = openingDate;
this.externalId = externalId;
public OfficeCommandValidator(OfficeCommand command) {
this.command = command;
}
public void validate() {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
if (StringUtils.isBlank(this.name)) {
if (StringUtils.isBlank(this.command.getName())) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.office.name.cannot.be.blank", "The parameter name cannot be blank.", "name");
dataValidationErrors.add(error);
}
if (this.parentId == null || parentId.intValue() <= 0) {
if (!command.isRootOffice() && (this.command.getParentId() == null || this.command.getParentId().intValue() <= 0)) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.office.parent.cannot.be.blank", "A valid parentId must be provided.", "parentId");
dataValidationErrors.add(error);
}
if (this.openingDate == null) {
if (this.command.getOpeningDate() == null) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.office.opening.date.cannot.be.blank", "The parameter openingDate cannot be blank", "openingDate");
dataValidationErrors.add(error);
}
if (StringUtils.isNotBlank(this.externalId)) {
if (this.externalId.trim().length() > 100) {
if (StringUtils.isNotBlank(this.command.getExternalId())) {
if (this.command.getExternalId().trim().length() > 100) {
ApiParameterError error = ApiParameterError.parameterError("validation.msg.office.externalId.exceeds.max.length", "The parameter externalId exceeds max length of {0}", "externalId", 100);
dataValidationErrors.add(error);
}
@@ -9,4 +9,6 @@ public interface OfficeReadPlatformService {
Collection<OfficeData> retrieveAllOffices();
OfficeData retrieveOffice(Long officeId);
OfficeData retrieveNewOfficeTemplate();
}
@@ -103,4 +103,18 @@ public class OfficeReadPlatformServiceImpl implements OfficeReadPlatformService
throw new PlatformResourceNotFoundException("error.msg.office.id.invalid", "Office with identifier {0} does not exist.", officeId);
}
}
@Override
public OfficeData retrieveNewOfficeTemplate() {
context.authenticatedUser();
List<OfficeData> allowedParents = new ArrayList<OfficeData>(retrieveAllOffices());
OfficeData officeTemplate = new OfficeData();
officeTemplate.setAllowedParents(allowedParents);
officeTemplate.setOpeningDate(new LocalDate());
return officeTemplate;
}
}
@@ -17,15 +17,15 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class OfficePlatformServiceJpaRepositoryImpl implements OfficeWritePlatformService {
public class OfficeWritePlatformServiceJpaRepositoryImpl implements OfficeWritePlatformService {
private final static Logger logger = LoggerFactory.getLogger(OfficePlatformServiceJpaRepositoryImpl.class);
private final static Logger logger = LoggerFactory.getLogger(OfficeWritePlatformServiceJpaRepositoryImpl.class);
private final PlatformSecurityContext context;
private final OfficeRepository officeRepository;
@Autowired
public OfficePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final OfficeRepository officeRepository) {
public OfficeWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final OfficeRepository officeRepository) {
this.context = context;
this.officeRepository = officeRepository;
}
@@ -37,7 +37,7 @@ public class OfficePlatformServiceJpaRepositoryImpl implements OfficeWritePlatfo
try {
AppUser currentUser = context.authenticatedUser();
OfficeCommandValidator validator = new OfficeCommandValidator(command.getName(), command.getParentId(), command.getOpeningDate(), command.getExternalId());
OfficeCommandValidator validator = new OfficeCommandValidator(command);
validator.validate();
Office parent = validateUserPriviledgeOnOfficeAndRetrieve(currentUser, command.getParentId());
@@ -65,12 +65,17 @@ public class OfficePlatformServiceJpaRepositoryImpl implements OfficeWritePlatfo
try {
AppUser currentUser = context.authenticatedUser();
OfficeCommandValidator validator = new OfficeCommandValidator(command.getName(), command.getParentId(), command.getOpeningDate(), command.getExternalId());
OfficeCommandValidator validator = new OfficeCommandValidator(command);
validator.validate();
Office office = validateUserPriviledgeOnOfficeAndRetrieve(currentUser, command.getId());
office.update(command.getName(), command.getExternalId(), command.getOpeningDate());
if (!command.isRootOffice()) {
Office parent = validateUserPriviledgeOnOfficeAndRetrieve(currentUser, command.getParentId());
office.update(parent);
}
this.officeRepository.save(office);
@@ -1,197 +0,0 @@
package org.mifosng.platform.rest;
import java.util.Arrays;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.mifosng.data.CurrencyData;
import org.mifosng.data.CurrencyList;
import org.mifosng.data.EnumOptionList;
import org.mifosng.data.EnumOptionReadModel;
import org.mifosng.data.ErrorResponse;
import org.mifosng.data.ErrorResponseList;
import org.mifosng.data.command.UpdateOrganisationCurrencyCommand;
import org.mifosng.platform.ReadPlatformService;
import org.mifosng.platform.WritePlatformService;
import org.mifosng.platform.exceptions.ApplicationDomainRuleException;
import org.mifosng.platform.exceptions.UnAuthenticatedUserException;
import org.mifosng.platform.exceptions.NewDataValidationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Component;
@Path("/protected/config")
@Component
@Scope("singleton")
public class ApplicationConfigurationResource {
@Autowired
private ReadPlatformService readPlatformService;
@Autowired
private WritePlatformService writePlatformService;
@GET
@Path("currency/allowed")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response retrieveAllowedCurrenciesForOrganisation() {
List<CurrencyData> currencyOptions = this.readPlatformService
.retrieveAllowedCurrencies();
return Response.ok().entity(new CurrencyList(currencyOptions)).build();
}
@PUT
@Path("currency/update")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response updateAllowedCurrenciesForOrganisation(final UpdateOrganisationCurrencyCommand command) {
try {
this.writePlatformService.updateOrganisationCurrencies(command);
return Response.ok().entity(command).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@GET
@Path("currency/all")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response retrieveAllPlatformCurrencies() {
try {
List<CurrencyData> currencyOptions = this.readPlatformService
.retrieveAllPlatformCurrencies();
return Response.ok().entity(new CurrencyList(currencyOptions)).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@GET
@Path("loan/amortization/allowed")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response retrieveAllowedLoanAmortizationMethodOptionsForOrganisation() {
try {
List<EnumOptionReadModel> options = this.readPlatformService
.retrieveLoanAmortizationMethodOptions();
return Response.ok().entity(new EnumOptionList(options)).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@GET
@Path("loan/interestcalculation/allowed")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response retrieveAllowedLoanInterestMethodOptionsForOrganisation() {
try {
List<EnumOptionReadModel> options = this.readPlatformService
.retrieveLoanInterestMethodOptions();
return Response.ok().entity(new EnumOptionList(options)).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@GET
@Path("loan/repaymentfrequency/allowed")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response retrieveAllowedRepaymentFrequencyOptionsForOrganisation() {
try {
List<EnumOptionReadModel> options = this.readPlatformService
.retrieveRepaymentFrequencyOptions();
return Response.ok().entity(new EnumOptionList(options)).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@GET
@Path("loan/interestfrequency/allowed")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response retrieveAllowedNominalInterestFrequencyOptionsForOrganisation() {
try {
List<EnumOptionReadModel> options = this.readPlatformService.retrieveInterestFrequencyOptions();
return Response.ok().entity(new EnumOptionList(options)).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
}
@@ -1,146 +0,0 @@
package org.mifosng.platform.rest;
import java.util.Arrays;
import java.util.Collection;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.mifosng.data.EntityIdentifier;
import org.mifosng.data.ErrorResponse;
import org.mifosng.data.ErrorResponseList;
import org.mifosng.data.LoanProductData;
import org.mifosng.data.LoanProductList;
import org.mifosng.data.command.LoanProductCommand;
import org.mifosng.platform.ReadPlatformService;
import org.mifosng.platform.WritePlatformService;
import org.mifosng.platform.exceptions.ApplicationDomainRuleException;
import org.mifosng.platform.exceptions.NewDataValidationException;
import org.mifosng.platform.exceptions.UnAuthenticatedUserException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Component;
@Path("/protected/product/loan")
@Component
@Scope("singleton")
public class LoanProductResource {
@Autowired
private ReadPlatformService readPlatformService;
@Autowired
private WritePlatformService writePlatformService;
@GET
@Path("all")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response retrieveAllLoanProducts() {
Collection<LoanProductData> products = this.readPlatformService
.retrieveAllLoanProducts();
return Response.ok().entity(new LoanProductList(products)).build();
}
@POST
@Path("new")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response createLoanProduct(final LoanProductCommand command) {
try {
EntityIdentifier entityIdentifier = this.writePlatformService.createLoanProduct(command);
return Response.ok().entity(entityIdentifier).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@POST
@Path("update")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response updateLoanProduct(final LoanProductCommand command) {
try {
EntityIdentifier entityIdentifier = this.writePlatformService.updateLoanProduct(command);
return Response.ok().entity(entityIdentifier).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@GET
@Path("{productId}")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response retrieveLoanProductDetails(@PathParam("productId") final Long productId) {
try {
LoanProductData loanProduct = this.readPlatformService.retrieveLoanProduct(productId);
return Response.ok().entity(loanProduct).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@GET
@Path("empty")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response retrieveNewLoanProductDetails() {
try {
LoanProductData loanProduct = this.readPlatformService.retrieveNewLoanProductDetails();
return Response.ok().entity(loanProduct).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
}
@@ -1,135 +0,0 @@
package org.mifosng.platform.rest;
import java.util.Arrays;
import java.util.Collection;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.mifosng.data.EntityIdentifier;
import org.mifosng.data.ErrorResponse;
import org.mifosng.data.ErrorResponseList;
import org.mifosng.data.OfficeData;
import org.mifosng.data.OfficeList;
import org.mifosng.data.command.OfficeCommand;
import org.mifosng.platform.ReadPlatformService;
import org.mifosng.platform.WritePlatformService;
import org.mifosng.platform.exceptions.ApplicationDomainRuleException;
import org.mifosng.platform.exceptions.UnAuthenticatedUserException;
import org.mifosng.platform.exceptions.NewDataValidationException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Component;
@Path("/protected/office")
@Component
@Scope("singleton")
public class OfficeResource {
@Autowired
private ReadPlatformService readPlatformService;
@Autowired
private WritePlatformService writePlatformService;
@GET
@Path("all")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response retrieveOffices() {
try {
Collection<OfficeData> offices = this.readPlatformService.retrieveAllOffices();
return Response.ok().entity(new OfficeList(offices)).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@GET
@Path("{officeId}")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response retreiveOffice(@PathParam("officeId") final Long officeId) {
try {
OfficeData office = this.readPlatformService.retrieveOffice(officeId);
return Response.ok().entity(office).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@POST
@Path("new")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response createOffice(final OfficeCommand command) {
try {
Long officeId = this.writePlatformService.createOffice(command);
return Response.ok().entity(new EntityIdentifier(officeId)).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
@POST
@Path("update")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response updateOffice(final OfficeCommand command) {
try {
Long officeId = this.writePlatformService.updateOffice(command);
return Response.ok().entity(new EntityIdentifier(officeId)).build();
} catch (UnAuthenticatedUserException e) {
throw new WebApplicationException(Response.status(Status.UNAUTHORIZED).build());
} catch (AccessDeniedException e) {
ErrorResponse errorResponse = new ErrorResponse("error.msg.no.permission", "id");
ErrorResponseList list = new ErrorResponseList(Arrays.asList(errorResponse));
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(list).build());
} catch (ApplicationDomainRuleException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getErrors())).build());
} catch (NewDataValidationException e) {
throw new WebApplicationException(Response.status(Status.BAD_REQUEST).entity(new ErrorResponseList(e.getValidationErrors())).build());
}
}
}