start of client api work.
This commit is contained in:
@@ -14,7 +14,8 @@
|
||||
<c:url value="/" var="rootContext" />
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
// these helpers are registered for the jsViews and jsRender functionality to fix bug with display zero!
|
||||
|
||||
// these helpers are registered for the jsViews and jsRender functionality to fix bug with display zero!
|
||||
$.views.registerHelpers({
|
||||
|
||||
money: function(monetaryObj) {
|
||||
|
||||
+84
-58
@@ -23,49 +23,48 @@ div.notespacer {margin-top: 5px; margin-bottom: 5px;}
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
|
||||
// these helpers are registered for the jsViews and jsRender functionality to fix bug with display zero!
|
||||
$.views.registerHelpers({
|
||||
|
||||
money: function(monetaryObj) {
|
||||
|
||||
Globalize.culture().numberFormat.currency.symbol = monetaryObj.displaySymbol;
|
||||
|
||||
var digits = monetaryObj.currencyDigitsAfterDecimal.toFixed(0);
|
||||
return Globalize.format(monetaryObj.amount, "n" + digits);
|
||||
},
|
||||
moneyWithCurrency: function(monetaryObj) {
|
||||
|
||||
Globalize.culture().numberFormat.currency.symbol = monetaryObj.displaySymbol;
|
||||
|
||||
var digits = monetaryObj.currencyDigitsAfterDecimal.toFixed(0);
|
||||
return Globalize.format(monetaryObj.amount, "c" + digits);
|
||||
},
|
||||
decimal: function(number, digits) {
|
||||
money: function(monetaryObj) {
|
||||
|
||||
Globalize.culture().numberFormat.currency.symbol = monetaryObj.displaySymbol;
|
||||
|
||||
var digits = monetaryObj.currencyDigitsAfterDecimal.toFixed(0);
|
||||
return Globalize.format(monetaryObj.amount, "n" + digits);
|
||||
},
|
||||
moneyWithCurrency: function(monetaryObj) {
|
||||
|
||||
Globalize.culture().numberFormat.currency.symbol = monetaryObj.displaySymbol;
|
||||
|
||||
var digits = monetaryObj.currencyDigitsAfterDecimal.toFixed(0);
|
||||
return Globalize.format(monetaryObj.amount, "c" + digits);
|
||||
},
|
||||
decimal: function(number, digits) {
|
||||
try {
|
||||
return Globalize.format(number, "n" + digits);
|
||||
} catch(e) {
|
||||
return number +"(NaN)";
|
||||
}
|
||||
},
|
||||
number: function(number) {
|
||||
},
|
||||
number: function(number) {
|
||||
try {
|
||||
return Globalize.format(number, "n0");
|
||||
} catch(e) {
|
||||
return number +"(NaN)";
|
||||
}
|
||||
},
|
||||
numberGreaterThanZero: function(number) {
|
||||
try {
|
||||
var num = number.toFixed(0);
|
||||
return num > 0;
|
||||
} catch(e) {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
globalDate: function(dateParts) {
|
||||
try {
|
||||
if (dateParts === null) {
|
||||
return "";
|
||||
} else {
|
||||
},
|
||||
numberGreaterThanZero: function(number) {
|
||||
try {
|
||||
var num = number.toFixed(0);
|
||||
return num > 0;
|
||||
} catch(e) {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
globalDate: function(localDateAsISOString) {
|
||||
try {
|
||||
var dateParts = localDateAsISOString.split("-")
|
||||
var year = dateParts[0];
|
||||
var month = parseInt(dateParts[1]) - 1; // month is zero indexed
|
||||
var day = dateParts[2];
|
||||
@@ -74,27 +73,21 @@ $(document).ready(function() {
|
||||
d.setFullYear(year,month,day);
|
||||
|
||||
return Globalize.format(d,"dd MMMM yyyy");
|
||||
}
|
||||
} catch(e) {
|
||||
return "??";
|
||||
}
|
||||
},
|
||||
globalDateTime: function(dateParts) {
|
||||
try {
|
||||
if (dateParts === null) {
|
||||
return "";
|
||||
} else {
|
||||
var d = new Date(dateParts);
|
||||
} catch(e) {
|
||||
return "??";
|
||||
}
|
||||
},
|
||||
globalDateTime: function(dateInMillis) {
|
||||
try {
|
||||
var d = new Date(dateInMillis);
|
||||
|
||||
return Globalize.format(d,"F");
|
||||
}
|
||||
} catch(e) {
|
||||
return "??";
|
||||
}
|
||||
}
|
||||
|
||||
} catch(e) {
|
||||
return "??";
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
function removeErrors(placeholderDiv) {
|
||||
// remove error class from all input fields
|
||||
var $inputs = $('#entityform :input');
|
||||
@@ -128,17 +121,28 @@ $(document).ready(function() {
|
||||
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;
|
||||
@@ -156,7 +160,7 @@ $(document).ready(function() {
|
||||
|
||||
$(placeholderDiv).append(formErrorsHtml);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function showNotAvailableDialog(titleCode) {
|
||||
var dialogDiv = $("<div id='notavailable-dialog-form'></div>");
|
||||
@@ -181,6 +185,29 @@ $(document).ready(function() {
|
||||
}).dialog('open');
|
||||
}
|
||||
|
||||
$.fn.serializeObject = function()
|
||||
{
|
||||
var o = {};
|
||||
var a = this.serializeArray();
|
||||
$.each(a, function() {
|
||||
if (o[this.name] !== undefined) {
|
||||
if (!o[this.name].push) {
|
||||
o[this.name] = [o[this.name]];
|
||||
}
|
||||
o[this.name].push(this.value || '');
|
||||
} else {
|
||||
|
||||
if (this.name === 'selectedItems' || this.name === 'notSelectedItems') {
|
||||
o[this.name] = new Array();
|
||||
o[this.name].push(this.value || '');
|
||||
} else {
|
||||
o[this.name] = this.value || '';
|
||||
}
|
||||
}
|
||||
});
|
||||
return o;
|
||||
};
|
||||
|
||||
function popupConfirmationDialogAndPost(url, titleCode, width, height, tabIndex, redirectUrl) {
|
||||
var dialogDiv = $("<div id='dialog-form'><div id='formerrors'></div>" + jQuery.i18n.prop('text.confirmation.required') + "</div>");
|
||||
|
||||
@@ -364,7 +391,6 @@ $(document).ready(function() {
|
||||
});
|
||||
}
|
||||
|
||||
// "tabTemplate": '<li><a href="<%= "#" %>{href}"><%= "#" %>{label}</a> <span class="ui-icon ui-icon-close">Remove Tab</span></li>',
|
||||
var tab_counter = 1;
|
||||
var $newtabs = $("#newtabs").tabs({
|
||||
|
||||
@@ -704,7 +730,7 @@ $(document).ready(function() {
|
||||
|
||||
<div id="newtabs">
|
||||
<ul>
|
||||
<li><a href="${clientUrl}" title="clienttab" class="topleveltab">${clientDisplayName}</a></li>
|
||||
<li><a href="http://localhost:8080/mifosng-provider/api/v1/clients/${clientId}" title="clienttab" class="topleveltab">${clientDisplayName}</a></li>
|
||||
</ul>
|
||||
<div id="clienttab">
|
||||
</div>
|
||||
|
||||
@@ -14,10 +14,6 @@ public interface ReadPlatformService {
|
||||
|
||||
Collection<OrganisationReadModel> retrieveAll();
|
||||
|
||||
Collection<ClientData> retrieveAllIndividualClients();
|
||||
|
||||
ClientData retrieveIndividualClient(Long clientId);
|
||||
|
||||
ClientDataWithAccountsData retrieveClientAccountDetails(Long clientId);
|
||||
|
||||
NewLoanWorkflowStepOneData retrieveClientAndProductDetails(Long clientId, Long productId);
|
||||
|
||||
@@ -13,7 +13,6 @@ import java.util.List;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.joda.time.DateTime;
|
||||
import org.joda.time.LocalDate;
|
||||
import org.mifosng.data.AppUserData;
|
||||
@@ -31,6 +30,7 @@ import org.mifosng.data.OfficeData;
|
||||
import org.mifosng.data.OrganisationReadModel;
|
||||
import org.mifosng.platform.client.domain.Client;
|
||||
import org.mifosng.platform.client.domain.ClientRepository;
|
||||
import org.mifosng.platform.client.service.ClientReadPlatformService;
|
||||
import org.mifosng.platform.currency.domain.ApplicationCurrency;
|
||||
import org.mifosng.platform.currency.domain.ApplicationCurrencyRepository;
|
||||
import org.mifosng.platform.currency.domain.Money;
|
||||
@@ -41,7 +41,6 @@ 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.loanproduct.service.LoanProductReadPlatformService;
|
||||
import org.mifosng.platform.organisation.domain.Organisation;
|
||||
import org.mifosng.platform.user.domain.AppUser;
|
||||
import org.mifosng.platform.user.service.AppUserReadPlatformService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -63,11 +62,13 @@ public class ReadPlatformServiceImpl implements ReadPlatformService {
|
||||
private final ApplicationCurrencyRepository applicationCurrencyRepository;
|
||||
private final LoanProductReadPlatformService loanProductReadPlatformService;
|
||||
private final AppUserReadPlatformService appUserReadPlatformService;
|
||||
private final ClientReadPlatformService clientReadPlatformService;
|
||||
|
||||
@Autowired
|
||||
public ReadPlatformServiceImpl(
|
||||
final LoanProductReadPlatformService loanProductReadPlatformService,
|
||||
final AppUserReadPlatformService appUserReadPlatformService,
|
||||
final ClientReadPlatformService clientReadPlatformService,
|
||||
final DataSource dataSource,
|
||||
final ClientRepository clientRepository,
|
||||
final LoanRepository loanRepository,
|
||||
@@ -75,6 +76,7 @@ public class ReadPlatformServiceImpl implements ReadPlatformService {
|
||||
final ApplicationCurrencyRepository applicationCurrencyRepository) {
|
||||
this.loanProductReadPlatformService = loanProductReadPlatformService;
|
||||
this.appUserReadPlatformService = appUserReadPlatformService;
|
||||
this.clientReadPlatformService = clientReadPlatformService;
|
||||
this.loanTransactionRepository = loanTransactionRepository;
|
||||
this.applicationCurrencyRepository = applicationCurrencyRepository;
|
||||
this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
|
||||
@@ -125,37 +127,6 @@ public class ReadPlatformServiceImpl implements ReadPlatformService {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<ClientData> retrieveAllIndividualClients() {
|
||||
|
||||
AppUser currentUser = extractAuthenticatedUser();
|
||||
|
||||
List<OfficeData> offices = retrieveOffices();
|
||||
String officeIdsList = generateOfficeIdInClause(offices);
|
||||
ClientMapper rm = new ClientMapper(offices,
|
||||
currentUser.getOrganisation());
|
||||
|
||||
String sql = "select " + rm.clientSchema()
|
||||
+ " where c.org_id = ? and c.office_id in (" + officeIdsList
|
||||
+ ") order by c.lastname ASC, c.firstname ASC";
|
||||
|
||||
return this.jdbcTemplate.query(sql, rm, new Object[] { currentUser
|
||||
.getOrganisation().getId() });
|
||||
}
|
||||
|
||||
private String generateOfficeIdInClause(List<OfficeData> offices) {
|
||||
String officeIdsList = "";
|
||||
for (int i = 0; i < offices.size(); i++) {
|
||||
Long id = offices.get(i).getId();
|
||||
if (i == 0) {
|
||||
officeIdsList = id.toString();
|
||||
} else {
|
||||
officeIdsList += "," + id.toString();
|
||||
}
|
||||
}
|
||||
return officeIdsList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NoteData retrieveClientNote(Long clientId, Long noteId) {
|
||||
|
||||
@@ -249,60 +220,6 @@ public class ReadPlatformServiceImpl implements ReadPlatformService {
|
||||
}
|
||||
}
|
||||
|
||||
protected static final class ClientMapper implements RowMapper<ClientData> {
|
||||
|
||||
private final List<OfficeData> offices;
|
||||
private final Organisation organisation;
|
||||
|
||||
public ClientMapper(final List<OfficeData> offices,
|
||||
Organisation organisation) {
|
||||
this.offices = offices;
|
||||
this.organisation = organisation;
|
||||
}
|
||||
|
||||
public String clientSchema() {
|
||||
return "c.org_id as orgId, c.office_id as officeId, c.id as id, c.firstname as firstname, c.lastname as lastname, c.external_id as externalId, c.joining_date as joinedDate from portfolio_client c";
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientData mapRow(final ResultSet rs, final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long orgId = rs.getLong("orgId");
|
||||
Long officeId = rs.getLong("officeId");
|
||||
Long id = rs.getLong("id");
|
||||
String firstname = rs.getString("firstname");
|
||||
if (StringUtils.isBlank(firstname)) {
|
||||
firstname = "";
|
||||
}
|
||||
String lastname = rs.getString("lastname");
|
||||
String externalId = rs.getString("externalId");
|
||||
LocalDate joinedDate = new LocalDate(rs.getDate("joinedDate"));
|
||||
|
||||
String officeName = fromOfficeList(this.offices, officeId);
|
||||
|
||||
String orgname = "";
|
||||
if (organisation.getId().equals(orgId)) {
|
||||
orgname = organisation.getName();
|
||||
}
|
||||
|
||||
return new ClientData(orgId, orgname, officeId, officeName, id,
|
||||
firstname, lastname, externalId, joinedDate);
|
||||
}
|
||||
|
||||
private String fromOfficeList(final List<OfficeData> officeList,
|
||||
final Long officeId) {
|
||||
String match = "";
|
||||
for (OfficeData office : officeList) {
|
||||
if (office.getId().equals(officeId)) {
|
||||
match = office.getName();
|
||||
}
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
}
|
||||
|
||||
private List<OfficeData> retrieveOffices() {
|
||||
|
||||
AppUser currentUser = extractAuthenticatedUser();
|
||||
@@ -343,35 +260,13 @@ public class ReadPlatformServiceImpl implements ReadPlatformService {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientData retrieveIndividualClient(final Long clientId) {
|
||||
|
||||
try {
|
||||
AppUser currentUser = extractAuthenticatedUser();
|
||||
|
||||
List<OfficeData> offices = retrieveOffices();
|
||||
ClientMapper rm = new ClientMapper(offices,
|
||||
currentUser.getOrganisation());
|
||||
|
||||
String sql = "select " + rm.clientSchema()
|
||||
+ " where c.id = ? and c.org_id = ?";
|
||||
|
||||
return this.jdbcTemplate.queryForObject(sql, rm, new Object[] {
|
||||
clientId, currentUser.getOrganisation().getId() });
|
||||
} catch (EmptyResultDataAccessException e) {
|
||||
throw new PlatformResourceNotFoundException(
|
||||
"error.msg.client.id.invalid",
|
||||
"Client with identifier {0} does not exist", clientId);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientDataWithAccountsData retrieveClientAccountDetails(
|
||||
final Long clientId) {
|
||||
|
||||
AppUser currentUser = extractAuthenticatedUser();
|
||||
|
||||
ClientData clientAccount = retrieveIndividualClient(clientId);
|
||||
ClientData clientAccount = this.clientReadPlatformService.retrieveIndividualClient(clientId);
|
||||
|
||||
// TODO - rewrite using jdbc sql approach
|
||||
Client client = this.clientRepository.findOne(clientsThatMatch(
|
||||
@@ -539,7 +434,7 @@ public class ReadPlatformServiceImpl implements ReadPlatformService {
|
||||
workflowData.setSelectedProduct(selectedProduct);
|
||||
}
|
||||
|
||||
ClientData clientAccount = retrieveIndividualClient(clientId);
|
||||
ClientData clientAccount = this.clientReadPlatformService.retrieveIndividualClient(clientId);
|
||||
workflowData.setClientId(clientAccount.getId());
|
||||
workflowData.setClientName(clientAccount.getDisplayName());
|
||||
|
||||
|
||||
@@ -0,0 +1,147 @@
|
||||
package org.mifosng.platform.api;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
import javax.ws.rs.Produces;
|
||||
import javax.ws.rs.core.MediaType;
|
||||
import javax.ws.rs.core.Response;
|
||||
|
||||
import org.mifosng.data.ClientData;
|
||||
import org.mifosng.data.ClientList;
|
||||
import org.mifosng.platform.WritePlatformService;
|
||||
import org.mifosng.platform.client.service.ClientReadPlatformService;
|
||||
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.security.authentication.UsernamePasswordAuthenticationToken;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.core.context.SecurityContext;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Path("/v1/clients")
|
||||
@Component
|
||||
@Scope("singleton")
|
||||
public class ClientApiResource {
|
||||
|
||||
@Autowired
|
||||
private ClientReadPlatformService clientReadPlatformService;
|
||||
|
||||
@Autowired
|
||||
private WritePlatformService writePlatformService;
|
||||
|
||||
@Autowired
|
||||
private AppUserRepository appUserRepository;
|
||||
|
||||
private void hardcodeUserIntoSecurityContext() {
|
||||
AppUser currentUser = this.appUserRepository.findOne(Long.valueOf(1));
|
||||
|
||||
Authentication auth = new UsernamePasswordAuthenticationToken(currentUser, currentUser, currentUser.getAuthorities());
|
||||
SecurityContext context = SecurityContextHolder.getContext();
|
||||
context.setAuthentication(auth);
|
||||
}
|
||||
|
||||
@GET
|
||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||
@Produces({ MediaType.APPLICATION_JSON})
|
||||
public Response retrieveAllIndividualClients() {
|
||||
|
||||
hardcodeUserIntoSecurityContext();
|
||||
|
||||
Collection<ClientData> clients = this.clientReadPlatformService.retrieveAllIndividualClients();
|
||||
|
||||
return Response.ok().entity(new ClientList(clients)).build();
|
||||
}
|
||||
|
||||
@GET
|
||||
@Path("{clientId}")
|
||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||
@Produces({ MediaType.APPLICATION_JSON})
|
||||
public Response retrieveClientData(@PathParam("clientId") final Long clientId) {
|
||||
|
||||
hardcodeUserIntoSecurityContext();
|
||||
|
||||
ClientData clientData = this.clientReadPlatformService.retrieveIndividualClient(clientId);
|
||||
|
||||
return Response.ok().entity(clientData).build();
|
||||
}
|
||||
|
||||
// @GET
|
||||
// @Path("template")
|
||||
// @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||
// @Produces({ MediaType.APPLICATION_JSON})
|
||||
// public Response newClientDetails() {
|
||||
//
|
||||
// hardcodeUserIntoSecurityContext();
|
||||
//
|
||||
// ClientData clientData = this.clientReadPlatformService.retrieveNewClientDetails();
|
||||
//
|
||||
// return Response.ok().entity(clientData).build();
|
||||
// }
|
||||
//
|
||||
// @POST
|
||||
// @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
||||
// @Produces({ MediaType.APPLICATION_JSON })
|
||||
// public Response enrollClient(final EnrollClientCommand command) {
|
||||
//
|
||||
// hardcodeUserIntoSecurityContext();
|
||||
//
|
||||
// Long clientId = this.writePlatformService.enrollClient(command);
|
||||
//
|
||||
// return Response.ok().entity(new EntityIdentifier(clientId)).build();
|
||||
// }
|
||||
//
|
||||
//
|
||||
// @GET
|
||||
// @Path("{clientId}/withaccounts")
|
||||
// @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
||||
// @Produces({ MediaType.APPLICATION_JSON })
|
||||
// public Response retrieveClientAccount(@PathParam("clientId") final Long clientId) {
|
||||
//
|
||||
// hardcodeUserIntoSecurityContext();
|
||||
//
|
||||
// ClientDataWithAccountsData clientAccount = this.clientReadPlatformService.retrieveClientAccountDetails(clientId);
|
||||
//
|
||||
// return Response.ok().entity(clientAccount).build();
|
||||
// }
|
||||
//
|
||||
// @POST
|
||||
// @Path("{clientId}/note/new")
|
||||
// @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||
// @Produces({ MediaType.APPLICATION_JSON})
|
||||
// public Response addNewClientNote(@PathParam("clientId") final Long clientId, final NoteCommand command) {
|
||||
//
|
||||
// hardcodeUserIntoSecurityContext();
|
||||
//
|
||||
// EntityIdentifier identifier = this.writePlatformService.addClientNote(command);
|
||||
//
|
||||
// return Response.ok().entity(identifier).build();
|
||||
// }
|
||||
//
|
||||
// @GET
|
||||
// @Path("{clientId}/note/all")
|
||||
// @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||
// @Produces({ MediaType.APPLICATION_JSON})
|
||||
// public Response retrieveAllClientNotes(@PathParam("clientId") final Long clientId) {
|
||||
//
|
||||
// Collection<NoteData> notes = this.clientReadPlatformService.retrieveAllClientNotes(clientId);
|
||||
//
|
||||
// return Response.ok().entity(new NoteDataList(notes)).build();
|
||||
// }
|
||||
//
|
||||
// @GET
|
||||
// @Path("{clientId}/note/{noteId}")
|
||||
// @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
||||
// @Produces({ MediaType.APPLICATION_JSON })
|
||||
// public Response retrieveClientNote(@PathParam("clientId") final Long clientId, @PathParam("noteId") final Long noteId) {
|
||||
//
|
||||
// NoteData note = this.clientReadPlatformService.retrieveClientNote(clientId, noteId);
|
||||
//
|
||||
// return Response.ok().entity(note).build();
|
||||
// }
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
package org.mifosng.platform.client.service;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import org.mifosng.data.ClientData;
|
||||
|
||||
public interface ClientReadPlatformService {
|
||||
|
||||
Collection<ClientData> retrieveAllIndividualClients();
|
||||
|
||||
ClientData retrieveIndividualClient(Long clientId);
|
||||
}
|
||||
+143
@@ -0,0 +1,143 @@
|
||||
package org.mifosng.platform.client.service;
|
||||
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.joda.time.LocalDate;
|
||||
import org.mifosng.data.ClientData;
|
||||
import org.mifosng.data.OfficeData;
|
||||
import org.mifosng.platform.exceptions.PlatformResourceNotFoundException;
|
||||
import org.mifosng.platform.organisation.domain.Organisation;
|
||||
import org.mifosng.platform.organisation.service.OfficeReadPlatformService;
|
||||
import org.mifosng.platform.security.PlatformSecurityContext;
|
||||
import org.mifosng.platform.user.domain.AppUser;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.dao.EmptyResultDataAccessException;
|
||||
import org.springframework.jdbc.core.RowMapper;
|
||||
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class ClientReadPlatformServiceImpl implements ClientReadPlatformService {
|
||||
|
||||
private final SimpleJdbcTemplate jdbcTemplate;
|
||||
private final PlatformSecurityContext context;
|
||||
private final OfficeReadPlatformService officeReadPlatformService;
|
||||
|
||||
@Autowired
|
||||
public ClientReadPlatformServiceImpl(final PlatformSecurityContext context, final DataSource dataSource, final OfficeReadPlatformService officeReadPlatformService) {
|
||||
this.context = context;
|
||||
this.officeReadPlatformService = officeReadPlatformService;
|
||||
this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
|
||||
}
|
||||
|
||||
private String generateOfficeIdInClause(List<OfficeData> offices) {
|
||||
String officeIdsList = "";
|
||||
for (int i = 0; i < offices.size(); i++) {
|
||||
Long id = offices.get(i).getId();
|
||||
if (i == 0) {
|
||||
officeIdsList = id.toString();
|
||||
} else {
|
||||
officeIdsList += "," + id.toString();
|
||||
}
|
||||
}
|
||||
return officeIdsList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<ClientData> retrieveAllIndividualClients() {
|
||||
|
||||
AppUser currentUser = this.context.authenticatedUser();
|
||||
|
||||
List<OfficeData> offices = new ArrayList<OfficeData>(officeReadPlatformService.retrieveAllOffices());
|
||||
String officeIdsList = generateOfficeIdInClause(offices);
|
||||
|
||||
ClientMapper rm = new ClientMapper(offices, currentUser.getOrganisation());
|
||||
|
||||
String sql = "select " + rm.clientSchema()
|
||||
+ " where c.org_id = ? and c.office_id in (" + officeIdsList
|
||||
+ ") order by c.lastname ASC, c.firstname ASC";
|
||||
|
||||
return this.jdbcTemplate.query(sql, rm, new Object[] { currentUser
|
||||
.getOrganisation().getId() });
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientData retrieveIndividualClient(final Long clientId) {
|
||||
|
||||
try {
|
||||
AppUser currentUser = this.context.authenticatedUser();
|
||||
|
||||
List<OfficeData> offices = new ArrayList<OfficeData>(officeReadPlatformService.retrieveAllOffices());
|
||||
ClientMapper rm = new ClientMapper(offices, currentUser.getOrganisation());
|
||||
|
||||
String sql = "select " + rm.clientSchema() + " where c.id = ? and c.org_id = ?";
|
||||
|
||||
return this.jdbcTemplate.queryForObject(sql, rm, new Object[] {clientId, currentUser.getOrganisation().getId() });
|
||||
} catch (EmptyResultDataAccessException e) {
|
||||
throw new PlatformResourceNotFoundException(
|
||||
"error.msg.client.id.invalid",
|
||||
"Client with identifier {0} does not exist", clientId);
|
||||
}
|
||||
}
|
||||
|
||||
private static final class ClientMapper implements RowMapper<ClientData> {
|
||||
|
||||
private final List<OfficeData> offices;
|
||||
private final Organisation organisation;
|
||||
|
||||
public ClientMapper(final List<OfficeData> offices,
|
||||
Organisation organisation) {
|
||||
this.offices = offices;
|
||||
this.organisation = organisation;
|
||||
}
|
||||
|
||||
public String clientSchema() {
|
||||
return "c.org_id as orgId, c.office_id as officeId, c.id as id, c.firstname as firstname, c.lastname as lastname, c.external_id as externalId, c.joining_date as joinedDate from portfolio_client c";
|
||||
}
|
||||
|
||||
@Override
|
||||
public ClientData mapRow(final ResultSet rs, final int rowNum)
|
||||
throws SQLException {
|
||||
|
||||
Long orgId = rs.getLong("orgId");
|
||||
Long officeId = rs.getLong("officeId");
|
||||
Long id = rs.getLong("id");
|
||||
String firstname = rs.getString("firstname");
|
||||
if (StringUtils.isBlank(firstname)) {
|
||||
firstname = "";
|
||||
}
|
||||
String lastname = rs.getString("lastname");
|
||||
String externalId = rs.getString("externalId");
|
||||
LocalDate joinedDate = new LocalDate(rs.getDate("joinedDate"));
|
||||
|
||||
String officeName = fromOfficeList(this.offices, officeId);
|
||||
|
||||
String orgname = "";
|
||||
if (organisation.getId().equals(orgId)) {
|
||||
orgname = organisation.getName();
|
||||
}
|
||||
|
||||
return new ClientData(orgId, orgname, officeId, officeName, id,
|
||||
firstname, lastname, externalId, joinedDate);
|
||||
}
|
||||
|
||||
private String fromOfficeList(final List<OfficeData> officeList,
|
||||
final Long officeId) {
|
||||
String match = "";
|
||||
for (OfficeData office : officeList) {
|
||||
if (office.getId().equals(officeId)) {
|
||||
match = office.getName();
|
||||
}
|
||||
}
|
||||
|
||||
return match;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,6 +26,7 @@ import org.mifosng.data.command.EnrollClientCommand;
|
||||
import org.mifosng.data.command.NoteCommand;
|
||||
import org.mifosng.platform.ReadPlatformService;
|
||||
import org.mifosng.platform.WritePlatformService;
|
||||
import org.mifosng.platform.client.service.ClientReadPlatformService;
|
||||
import org.mifosng.platform.exceptions.ApplicationDomainRuleException;
|
||||
import org.mifosng.platform.exceptions.UnAuthenticatedUserException;
|
||||
import org.mifosng.platform.exceptions.NewDataValidationException;
|
||||
@@ -41,6 +42,9 @@ public class ClientResource {
|
||||
|
||||
@Autowired
|
||||
private ReadPlatformService readPlatformService;
|
||||
|
||||
@Autowired
|
||||
private ClientReadPlatformService clientReadPlatformService;
|
||||
|
||||
@Autowired
|
||||
private WritePlatformService writePlatformService;
|
||||
@@ -51,21 +55,9 @@ public class ClientResource {
|
||||
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||
public Response retrieveAllIndividualClients() {
|
||||
|
||||
try {
|
||||
Collection<ClientData> clients = this.readPlatformService.retrieveAllIndividualClients();
|
||||
Collection<ClientData> clients = this.clientReadPlatformService.retrieveAllIndividualClients();
|
||||
|
||||
return Response.ok().entity(new ClientList(clients)).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
|
||||
@@ -118,23 +110,13 @@ public class ClientResource {
|
||||
@Path("{clientId}")
|
||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
||||
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
||||
public Response retrieveClientData(@PathParam("clientId") final Long clientId) {
|
||||
|
||||
try {
|
||||
ClientData clientData = this.readPlatformService.retrieveIndividualClient(clientId);
|
||||
public Response retrieveClientData(
|
||||
@PathParam("clientId") final Long clientId) {
|
||||
|
||||
return Response.ok().entity(clientData).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());
|
||||
}
|
||||
ClientData clientData = this.clientReadPlatformService
|
||||
.retrieveIndividualClient(clientId);
|
||||
|
||||
return Response.ok().entity(clientData).build();
|
||||
}
|
||||
|
||||
@GET
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
package org.mifosng.platform.rest;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import javax.ws.rs.Consumes;
|
||||
import javax.ws.rs.GET;
|
||||
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.OrganisationList;
|
||||
import org.mifosng.data.OrganisationReadModel;
|
||||
import org.mifosng.platform.ReadPlatformService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Scope;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Path("/protected/org")
|
||||
@Component
|
||||
@Scope("singleton")
|
||||
public class TenantResource {
|
||||
|
||||
@Autowired
|
||||
private ReadPlatformService readPlatformService;
|
||||
|
||||
@GET
|
||||
@Path("view")
|
||||
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
|
||||
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
|
||||
public Response retrieveExistingOrganisations() {
|
||||
|
||||
Collection<OrganisationReadModel> organisations = this.readPlatformService
|
||||
.retrieveAll();
|
||||
return Response.ok().entity(new OrganisationList(organisations))
|
||||
.build();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user