MIFOSX-75: Bulk loan reassignment.

This commit is contained in:
Michal Dudzinski
2012-10-31 15:45:49 +01:00
parent a3200a8bc7
commit 390964f361
19 changed files with 501 additions and 5 deletions
@@ -18,13 +18,17 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.apache.commons.lang.StringUtils;
import org.mifosng.platform.api.commands.BulkLoanReassignmentCommand;
import org.mifosng.platform.api.commands.StaffCommand;
import org.mifosng.platform.api.data.EntityIdentifier;
import org.mifosng.platform.api.data.LoanReassignmentData;
import org.mifosng.platform.api.data.OfficeLookup;
import org.mifosng.platform.api.data.StaffAccountSummaryCollectionData;
import org.mifosng.platform.api.data.StaffData;
import org.mifosng.platform.api.infrastructure.ApiDataConversionService;
import org.mifosng.platform.api.infrastructure.ApiJsonSerializerService;
import org.mifosng.platform.api.infrastructure.ApiParameterHelper;
import org.mifosng.platform.loan.service.LoanWritePlatformService;
import org.mifosng.platform.organisation.service.OfficeReadPlatformService;
import org.mifosng.platform.staff.service.StaffReadPlatformService;
import org.mifosng.platform.staff.service.StaffWritePlatformService;
@@ -54,6 +58,9 @@ public class StaffApiResource {
@Autowired
private OfficeReadPlatformService officeReadPlatformService;
@Autowired
private LoanWritePlatformService loanWritePlatformService;
private final static Logger logger = LoggerFactory
.getLogger(StaffApiResource.class);
@@ -131,6 +138,53 @@ public class StaffApiResource {
return Response.ok().entity(new EntityIdentifier(entityId)).build();
}
@POST
@Path("loanreassignment")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public Response loanReassignment(final String jsonRequestBody){
BulkLoanReassignmentCommand command =
this.apiDataConversionService.convertJsonToBulkLoanReassignmentCommand(jsonRequestBody);
EntityIdentifier loanOfficerIdentifier = this.loanWritePlatformService.bulkLoanReassignment(command);
return Response.ok().entity(loanOfficerIdentifier).build();
}
@GET
@Path("loanreassignment/template")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String loanReassignmentTemplate(@QueryParam("officeId") final Long officeId,
@QueryParam("fromLoanOfficerId") final Long loanOfficerId,
@Context final UriInfo uriInfo){
final Set<String> responseParameters = ApiParameterHelper
.extractFieldsForResponseIfProvided(uriInfo
.getQueryParameters());
final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo
.getQueryParameters());
Collection<OfficeLookup> offices = this.officeReadPlatformService.retrieveAllOfficesForLookup();
Collection<StaffData> loanOfficers = null;
StaffAccountSummaryCollectionData staffAccountSummaryCollectionData = null;
if (officeId != null){
loanOfficers = this.readPlatformService.retrieveAllLoanOfficersByOffice(officeId);
}
if (loanOfficerId != null){
staffAccountSummaryCollectionData = this.readPlatformService.retrieveLoanOfficerAccountSummary(loanOfficerId);
}
LoanReassignmentData loanReassignmentData = new LoanReassignmentData(officeId, loanOfficerId, offices,
loanOfficers, staffAccountSummaryCollectionData);
return this.apiJsonSerializerService.serializeLoanReassignmentDataToJson(prettyPrint, responseParameters, loanReassignmentData);
}
private String getStaffCriteria(String sqlSearch, Integer officeId) {
String extraCriteria = "";
@@ -0,0 +1,35 @@
package org.mifosng.platform.api.commands;
import java.util.Set;
public class BulkLoanReassignmentCommand {
private final Long fromLoanOfficerId;
private final Long toLoanOfficerId;
private final String[] loans;
private final Set<String> modifiedParameters;
public BulkLoanReassignmentCommand(Set<String> modifiedParameters, Long fromLoanOfficerId,
Long toLoanOfficerId, String[] loans) {
this.fromLoanOfficerId = fromLoanOfficerId;
this.toLoanOfficerId = toLoanOfficerId;
this.loans = loans;
this.modifiedParameters = modifiedParameters;
}
public Long getFromLoanOfficerId() {
return fromLoanOfficerId;
}
public Long getToLoanOfficerId() {
return toLoanOfficerId;
}
public String[] getLoans() {
return loans;
}
}
@@ -0,0 +1,46 @@
package org.mifosng.platform.api.data;
import java.util.Collection;
public class LoanReassignmentData {
private final Long officeId;
private final Long fromLoanOfficerId;
//template
private final Collection<OfficeLookup> officeOptions;
private final Collection<StaffData> loanOfficerOptions;
private final StaffAccountSummaryCollectionData accountSummaryCollection;
public LoanReassignmentData(Long officeId, Long fromLoanOfficerId,
Collection<OfficeLookup> officeOptions, Collection<StaffData> loanOfficerOptions,
StaffAccountSummaryCollectionData accountSummaryCollection) {
this.officeId = officeId;
this.fromLoanOfficerId = fromLoanOfficerId;
this.officeOptions = officeOptions;
this.loanOfficerOptions = loanOfficerOptions;
this.accountSummaryCollection = accountSummaryCollection;
}
public Long getOfficeId() {
return officeId;
}
public Long getFromLoanOfficerId() {
return fromLoanOfficerId;
}
public Collection<OfficeLookup> getOfficeOptions() {
return officeOptions;
}
public Collection<StaffData> getLoanOfficerOptions() {
return loanOfficerOptions;
}
public StaffAccountSummaryCollectionData getAccountSummaryCollection() {
return accountSummaryCollection;
}
}
@@ -0,0 +1,83 @@
package org.mifosng.platform.api.data;
import java.util.Collection;
import java.util.List;
public class StaffAccountSummaryCollectionData {
private final List<ClientSummary> clients;
private final List<GroupSummary> groups;
public StaffAccountSummaryCollectionData(List<ClientSummary> clients, List<GroupSummary> groups) {
this.clients = clients;
this.groups = groups;
}
public List<ClientSummary> getClients() {
return clients;
}
public List<GroupSummary> getGroups() {
return groups;
}
public static final class ClientSummary {
private final Long id;
private final String displayName;
private Collection<ClientAccountSummaryData> loans;
public ClientSummary(Long id, String displayName) {
this.id = id;
this.displayName = displayName;
}
public Long getId() {
return id;
}
public String getDisplayName() {
return displayName;
}
public Collection<ClientAccountSummaryData> getLoans() {
return loans;
}
public void setLoans(Collection<ClientAccountSummaryData> loans) {
this.loans = loans;
}
}
public static final class GroupSummary {
private final Long id;
private final String name;
private Collection<GroupAccountSummaryData> loans;
public GroupSummary(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public Collection<GroupAccountSummaryData> getLoans() {
return loans;
}
public void setLoans(Collection<GroupAccountSummaryData> loans) {
this.loans = loans;
}
}
}
@@ -2,6 +2,7 @@ package org.mifosng.platform.api.infrastructure;
import org.mifosng.platform.api.commands.AdjustLoanTransactionCommand;
import org.mifosng.platform.api.commands.BranchMoneyTransferCommand;
import org.mifosng.platform.api.commands.BulkLoanReassignmentCommand;
import org.mifosng.platform.api.commands.ChargeCommand;
import org.mifosng.platform.api.commands.ClientCommand;
import org.mifosng.platform.api.commands.ClientIdentifierCommand;
@@ -73,7 +74,9 @@ public interface ApiDataConversionService {
DepositStateTransitionApprovalCommand convertJsonToDepositStateTransitionApprovalCommand(Long resourceIdentifier, String jsonRequestBody);
StaffCommand convertJsonToStaffCommand(Long resourceIdentifier, String json);
BulkLoanReassignmentCommand convertJsonToBulkLoanReassignmentCommand(String jsonRequestBody);
DepositAccountWithdrawalCommand convertJsonToDepositWithdrawalCommand(Long resourceIdentifier, String jsonRequestBody);
DepositAccountWithdrawInterestCommand convertJsonToDepositAccountWithdrawInterestCommand(Long resourceIdentifier, String jsonRequestBody);
@@ -19,6 +19,7 @@ import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.mifosng.platform.api.commands.AdjustLoanTransactionCommand;
import org.mifosng.platform.api.commands.BranchMoneyTransferCommand;
import org.mifosng.platform.api.commands.BulkLoanReassignmentCommand;
import org.mifosng.platform.api.commands.ChargeCommand;
import org.mifosng.platform.api.commands.ClientCommand;
import org.mifosng.platform.api.commands.ClientIdentifierCommand;
@@ -152,7 +153,49 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService {
return new StaffCommand(modifiedParameters, resourceIdentifier, officeId,firstname, lastname, isLoanOfficer);
}
@Override
public BulkLoanReassignmentCommand convertJsonToBulkLoanReassignmentCommand(String json) {
if (StringUtils.isBlank(json)) {
throw new InvalidJsonException();
}
Type typeOfMap = new TypeToken<Map<String, Object>>(){}.getType();
Map<String, String> requestMap = gsonConverter.fromJson(json, typeOfMap);
Set<String> supportedParams = new HashSet<String>(
Arrays.asList("fromLoanOfficerId", "toLoanOfficerId","loans")
);
checkForUnsupportedParameters(requestMap, supportedParams);
Set<String> modifiedParameters = new HashSet<String>();
Long fromLoanOfficerId = extractLongParameter("fromLoanOfficerId", requestMap, modifiedParameters);
Long toLoanOfficerId = extractLongParameter("toLoanOfficerId", requestMap, modifiedParameters);
// check array
JsonParser parser = new JsonParser();
String[] loans = null;
JsonElement element = parser.parse(json);
if (element.isJsonObject()) {
JsonObject object = element.getAsJsonObject();
if (object.has("loans")) {
modifiedParameters.add("loans");
JsonArray array = object.get("loans").getAsJsonArray();
loans = new String[array.size()];
for (int i=0; i<array.size(); i++) {
loans[i] = array.get(i).getAsString();
}
}
}
//
return new BulkLoanReassignmentCommand(modifiedParameters, fromLoanOfficerId, toLoanOfficerId, loans);
}
@Override
public OfficeCommand convertJsonToOfficeCommand(final Long resourceIdentifier, final String json) {
if (StringUtils.isBlank(json)) {
@@ -25,6 +25,7 @@ import org.mifosng.platform.api.data.GroupData;
import org.mifosng.platform.api.data.LoanAccountData;
import org.mifosng.platform.api.data.LoanChargeData;
import org.mifosng.platform.api.data.LoanProductData;
import org.mifosng.platform.api.data.LoanReassignmentData;
import org.mifosng.platform.api.data.LoanTransactionData;
import org.mifosng.platform.api.data.NoteData;
import org.mifosng.platform.api.data.OfficeData;
@@ -106,6 +107,8 @@ public interface ApiJsonSerializerService {
String serializeLoanTransactionDataToJson(boolean prettyPrint, Set<String> responseParameters, LoanTransactionData newTransactionData);
String serializeLoanReassignmentDataToJson(boolean prettyPrint, Set<String> responseParameters, LoanReassignmentData loanReassignmentData);
String serializeChargeDataToJson(boolean prettyPrint, Set<String> responseParameters, Collection<ChargeData> charges);
String serializeChargeDataToJson(boolean prettyPrint, Set<String> responseParameters, ChargeData charge);
@@ -27,6 +27,7 @@ import org.mifosng.platform.api.data.GroupData;
import org.mifosng.platform.api.data.LoanAccountData;
import org.mifosng.platform.api.data.LoanChargeData;
import org.mifosng.platform.api.data.LoanProductData;
import org.mifosng.platform.api.data.LoanReassignmentData;
import org.mifosng.platform.api.data.LoanTransactionData;
import org.mifosng.platform.api.data.NoteData;
import org.mifosng.platform.api.data.OfficeData;
@@ -187,6 +188,10 @@ public class GoogleGsonApiJsonSerializerService implements ApiJsonSerializerServ
private static final Set<String> LOAN_TRANSACTION_NEW_DATA_PARAMETERS = new HashSet<String>(
Arrays.asList("id", "type", "date", "currency", "amount"));
private static final Set<String> LOAN_REASSIGNMENT_DATA_PARAMETERS = new HashSet<String>(
Arrays.asList("officeId", "fromLoanOfficerId", "officeOptions", "loanOfficerOptions", "accountSummaryCollection")
);
private static final Set<String> CHARGES_DATA_PARAMETERS = new HashSet<String>(
Arrays.asList("id", "name", "amount", "currency", "penalty", "active",
"chargeAppliesTo", "chargeTimeType",
@@ -568,6 +573,17 @@ public class GoogleGsonApiJsonSerializerService implements ApiJsonSerializerServ
return helper.serializedJsonFrom(gsonDeserializer, transaction);
}
@Override
public String serializeLoanReassignmentDataToJson(boolean prettyPrint,
Set<String> responseParameters,
LoanReassignmentData loanReassignmentData) {
final Gson gsonDeserializer = helper
.createGsonBuilderWithParameterExclusionSerializationStrategy(
LOAN_REASSIGNMENT_DATA_PARAMETERS, prettyPrint,
responseParameters);
return helper.serializedJsonFrom(gsonDeserializer, loanReassignmentData);
}
@Override
public String serializeChargeDataToJson(final boolean prettyPrint,
final Set<String> responseParameters,
@@ -3,6 +3,7 @@ package org.mifosng.platform.client.service;
import java.util.Collection;
import org.mifosng.platform.api.data.ClientAccountSummaryCollectionData;
import org.mifosng.platform.api.data.ClientAccountSummaryData;
import org.mifosng.platform.api.data.ClientData;
import org.mifosng.platform.api.data.ClientIdentifierData;
import org.mifosng.platform.api.data.ClientLookup;
@@ -22,6 +23,8 @@ public interface ClientReadPlatformService {
ClientAccountSummaryCollectionData retrieveClientAccountDetails(Long clientId);
Collection<ClientAccountSummaryData> retrieveClientLoanAccountsByLoanOfficerId(Long clientId, Long loanOfficerId);
Collection<NoteData> retrieveAllClientNotes(Long clientId);
NoteData retrieveClientNote(Long clientId, Long noteId);
@@ -272,6 +272,23 @@ public class ClientReadPlatformServiceImpl implements ClientReadPlatformService
}
}
@Override
public Collection<ClientAccountSummaryData> retrieveClientLoanAccountsByLoanOfficerId(Long clientId, Long loanOfficerId) {
this.context.authenticatedUser();
// Check if client exists
retrieveIndividualClient(clientId);
ClientLoanAccountSummaryDataMapper rm = new ClientLoanAccountSummaryDataMapper();
String sql = "select " + rm.loanAccountSummarySchema() + " where l.client_id = ? and l.loan_officer_id = ?";
List<ClientAccountSummaryData> loanAccounts = this.jdbcTemplate.query(sql, rm, new Object[] {clientId, loanOfficerId});
return loanAccounts;
}
private static final class ClientLoanAccountSummaryDataMapper implements
RowMapper<ClientAccountSummaryData> {
@@ -0,0 +1,11 @@
package org.mifosng.platform.exceptions;
public class LoanOfficerAssignmentException extends
AbstractPlatformDomainRuleException {
public LoanOfficerAssignmentException(final Long loanId, final Long loanOfficerId) {
super("error.msg.loan.not.assigned.to.loan.officer", "Loan with identifier " + loanId +
" is not assigned to Loan Officer with identifier " + loanOfficerId + ".", loanId);
}
}
@@ -4,6 +4,7 @@ import java.util.Collection;
import org.mifosng.platform.api.data.GroupAccountSummaryCollectionData;
import org.mifosng.platform.api.data.ClientLookup;
import org.mifosng.platform.api.data.GroupAccountSummaryData;
import org.mifosng.platform.api.data.GroupData;
public interface GroupReadPlatformService {
@@ -17,4 +18,6 @@ public interface GroupReadPlatformService {
Collection<ClientLookup> retrieveClientMembers(Long groupId);
GroupAccountSummaryCollectionData retrieveGroupAccountDetails(Long groupId);
Collection<GroupAccountSummaryData> retrieveGroupLoanAccountsByLoanOfficerId(Long groupId, Long loanOfficerId);
}
@@ -181,6 +181,23 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
}
}
@Override
public Collection<GroupAccountSummaryData> retrieveGroupLoanAccountsByLoanOfficerId(Long groupId, Long loanOfficerId) {
this.context.authenticatedUser();
// Check if group exists
retrieveGroup(groupId);
GroupLoanAccountSummaryDataMapper rm = new GroupLoanAccountSummaryDataMapper();
String sql = "select " + rm.loanAccountSummarySchema() + " where l.group_id = ? and l.loan_officer_id = ?";
List<GroupAccountSummaryData> loanAccounts = this.jdbcTemplate.query(sql, rm, new Object[] {groupId, loanOfficerId});
return loanAccounts;
}
private static final class GroupLoanAccountSummaryDataMapper implements
RowMapper<GroupAccountSummaryData> {
@@ -300,6 +300,10 @@ public class Loan extends AbstractAuditableCustom<AppUser, Long> {
return loanofficer;
}
public void setLoanofficer(Staff loanofficer) {
this.loanofficer = loanofficer;
}
public LoanProductRelatedDetail repaymentScheduleDetail() {
return this.loanRepaymentScheduleDetail;
}
@@ -1,6 +1,7 @@
package org.mifosng.platform.loan.service;
import org.mifosng.platform.api.commands.AdjustLoanTransactionCommand;
import org.mifosng.platform.api.commands.BulkLoanReassignmentCommand;
import org.mifosng.platform.api.commands.LoanChargeCommand;
import org.mifosng.platform.api.commands.LoanStateTransitionCommand;
import org.mifosng.platform.api.commands.LoanTransactionCommand;
@@ -64,4 +65,7 @@ public interface LoanWritePlatformService {
@PreAuthorize(value = "hasRole('ORGANISATION_ADMINISTRATION_SUPER_USER_ROLE')")
EntityIdentifier deleteLoanCharge(final Long loanId, final Long loanChargeId);
@PreAuthorize(value = "hasRole('ORGANISATION_ADMINISTRATION_SUPER_USER_ROLE')")
EntityIdentifier bulkLoanReassignment(final BulkLoanReassignmentCommand command);
}
@@ -10,6 +10,7 @@ import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate;
import org.mifosng.platform.api.LoanScheduleData;
import org.mifosng.platform.api.commands.AdjustLoanTransactionCommand;
import org.mifosng.platform.api.commands.BulkLoanReassignmentCommand;
import org.mifosng.platform.api.commands.CalculateLoanScheduleCommand;
import org.mifosng.platform.api.commands.LoanApplicationCommand;
import org.mifosng.platform.api.commands.LoanChargeCommand;
@@ -32,6 +33,7 @@ import org.mifosng.platform.exceptions.ClientNotFoundException;
import org.mifosng.platform.exceptions.InvalidCurrencyException;
import org.mifosng.platform.exceptions.LoanNotFoundException;
import org.mifosng.platform.exceptions.LoanNotInSubmittedAndPendingApprovalStateCannotBeDeleted;
import org.mifosng.platform.exceptions.LoanOfficerAssignmentException;
import org.mifosng.platform.exceptions.LoanProductNotFoundException;
import org.mifosng.platform.exceptions.LoanTransactionNotFoundException;
import org.mifosng.platform.exceptions.NoAuthorizationException;
@@ -52,6 +54,7 @@ import org.mifosng.platform.loan.domain.LoanTransactionRepository;
import org.mifosng.platform.loan.domain.PeriodFrequencyType;
import org.mifosng.platform.security.PlatformSecurityContext;
import org.mifosng.platform.staff.domain.Staff;
import org.mifosng.platform.staff.service.BulkLoanReassignmentCommandValidator;
import org.mifosng.platform.user.domain.AppUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
@@ -724,4 +727,35 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
return new EntityIdentifier(loanCharge.getId());
}
@Override
public EntityIdentifier bulkLoanReassignment(BulkLoanReassignmentCommand command) {
this.context.authenticatedUser();
BulkLoanReassignmentCommandValidator validator = new BulkLoanReassignmentCommandValidator(command);
validator.validateLoanReassignment();
Staff fromLoanOfficer = loanAssembler.findLoanOfficerByIdIfProvided(command.getFromLoanOfficerId());
Staff toLoanOfficer = loanAssembler.findLoanOfficerByIdIfProvided(command.getToLoanOfficerId());
for (String loanIdString : command.getLoans()){
final Long loanId = Long.valueOf(loanIdString);
final Loan loan = this.loanRepository.findOne(loanId);
if (loan == null) {
throw new LoanNotFoundException(loanId);
}
if (!loan.getLoanofficer().equals(fromLoanOfficer)){
throw new LoanOfficerAssignmentException(loan.getId(), fromLoanOfficer.getId());
}
loan.setLoanofficer(toLoanOfficer);
this.loanRepository.save(loan);
}
this.loanRepository.flush();
return new EntityIdentifier(toLoanOfficer.getId());
}
}
@@ -0,0 +1,35 @@
package org.mifosng.platform.staff.service;
import org.mifosng.platform.DataValidatorBuilder;
import org.mifosng.platform.api.commands.BulkLoanReassignmentCommand;
import org.mifosng.platform.api.data.ApiParameterError;
import org.mifosng.platform.exceptions.PlatformApiDataValidationException;
import java.util.ArrayList;
import java.util.List;
public class BulkLoanReassignmentCommandValidator {
private final BulkLoanReassignmentCommand command;
public BulkLoanReassignmentCommandValidator(BulkLoanReassignmentCommand command) {
this.command = command;
}
public void validateLoanReassignment(){
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("staff.account.transfer");
baseDataValidator.reset().parameter("fromLoanOfficerId").value(command.getFromLoanOfficerId()).
notNull().integerGreaterThanZero();
baseDataValidator.reset().parameter("toLoanOfficerId").value(command.getToLoanOfficerId()).notNull().
integerGreaterThanZero().notSameAsParameter("fromLoanOfficerId", command.getFromLoanOfficerId());
baseDataValidator.reset().parameter("loans").value(command.getLoans()).arrayNotEmpty();
if (!dataValidationErrors.isEmpty()) {
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors);
}
}
}
@@ -2,6 +2,7 @@ package org.mifosng.platform.staff.service;
import java.util.Collection;
import org.mifosng.platform.api.data.StaffAccountSummaryCollectionData;
import org.mifosng.platform.api.data.StaffData;
public interface StaffReadPlatformService {
@@ -11,4 +12,6 @@ public interface StaffReadPlatformService {
Collection<StaffData> retrieveAllStaff(final String extraCriteria);
Collection<StaffData> retrieveAllLoanOfficersByOffice(final long officeId);
StaffAccountSummaryCollectionData retrieveLoanOfficerAccountSummary(final long loanOfficerId);
}
@@ -3,10 +3,17 @@ package org.mifosng.platform.staff.service;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.mifosng.platform.api.data.ClientAccountSummaryData;
import org.mifosng.platform.api.data.GroupAccountSummaryData;
import org.mifosng.platform.api.data.StaffAccountSummaryCollectionData;
import org.mifosng.platform.api.data.StaffData;
import org.mifosng.platform.client.service.ClientReadPlatformService;
import org.mifosng.platform.exceptions.StaffNotFoundException;
import org.mifosng.platform.group.service.GroupReadPlatformService;
import org.mifosng.platform.infrastructure.JdbcSupport;
import org.mifosng.platform.infrastructure.TenantAwareRoutingDataSource;
import org.mifosng.platform.security.PlatformSecurityContext;
import org.springframework.beans.factory.annotation.Autowired;
@@ -20,13 +27,18 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService {
private final JdbcTemplate jdbcTemplate;
private final PlatformSecurityContext context;
private final ClientReadPlatformService clientReadPlatformService;
private final GroupReadPlatformService groupReadPlatformService;
@Autowired
public StaffReadPlatformServiceImpl(
final PlatformSecurityContext context,
final TenantAwareRoutingDataSource dataSource) {
public StaffReadPlatformServiceImpl(final PlatformSecurityContext context,
final TenantAwareRoutingDataSource dataSource,
final ClientReadPlatformService clientReadPlatformService,
final GroupReadPlatformService groupReadPlatformService) {
this.context = context;
this.jdbcTemplate = new JdbcTemplate(dataSource);
this.clientReadPlatformService = clientReadPlatformService;
this.groupReadPlatformService = groupReadPlatformService;
}
private static final class StaffMapper implements RowMapper<StaffData> {
@@ -93,4 +105,74 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService {
throw new StaffNotFoundException(staffId);
}
}
@Override
public StaffAccountSummaryCollectionData retrieveLoanOfficerAccountSummary(long loanOfficerId) {
context.authenticatedUser();
StaffClientMapper staffClientMapper = new StaffClientMapper();
String clientSql = "select distinct " + staffClientMapper.schema();
StaffGroupMapper staffGroupMapper = new StaffGroupMapper();
String groupSql = "select distinct " + staffGroupMapper.schema();
List<StaffAccountSummaryCollectionData.ClientSummary> clientSummaryList =
this.jdbcTemplate.query(clientSql, staffClientMapper, new Object[]{loanOfficerId});
for (StaffAccountSummaryCollectionData.ClientSummary clientSummary : clientSummaryList){
Collection<ClientAccountSummaryData> clientLoanAccounts =
this.clientReadPlatformService.retrieveClientLoanAccountsByLoanOfficerId(clientSummary.getId(), loanOfficerId);
clientSummary.setLoans(clientLoanAccounts);
}
List<StaffAccountSummaryCollectionData.GroupSummary> groupSummaryList =
this.jdbcTemplate.query(groupSql, staffGroupMapper, new Object[]{loanOfficerId});
for (StaffAccountSummaryCollectionData.GroupSummary groupSummary : groupSummaryList){
Collection<GroupAccountSummaryData> groupLoanAccounts =
this.groupReadPlatformService.retrieveGroupLoanAccountsByLoanOfficerId(groupSummary.getId(), loanOfficerId);
groupSummary.setLoans(groupLoanAccounts);
}
return new StaffAccountSummaryCollectionData(clientSummaryList, groupSummaryList);
}
private static final class StaffClientMapper implements RowMapper<StaffAccountSummaryCollectionData.ClientSummary> {
public String schema(){
return " c.id as id, c.display_name as displayName from m_client c " +
" join m_loan l on c.id = l.client_id where l.loan_officer_id = ? ";
}
@Override
public StaffAccountSummaryCollectionData.ClientSummary mapRow(ResultSet rs, int rowNum) throws SQLException {
Long id = JdbcSupport.getLong(rs, "id");
String displayName = rs.getString("displayName");
return new StaffAccountSummaryCollectionData.ClientSummary(id, displayName);
}
}
private static final class StaffGroupMapper implements RowMapper<StaffAccountSummaryCollectionData.GroupSummary> {
public String schema(){
return " g.id as id, g.name as name from m_group g" +
" join m_loan l on g.id = l.group_id where l.loan_officer_id = ? ";
}
@Override
public StaffAccountSummaryCollectionData.GroupSummary mapRow(ResultSet rs, int rowNum) throws SQLException {
Long id = JdbcSupport.getLong(rs, "id");
String name = rs.getString("name");
return new StaffAccountSummaryCollectionData.GroupSummary(id, name);
}
}
}