Merge pull request #1375 from awaleram/MIFOSX-1956

MIFOSX-1956: accounting opening balance with multiple currency
This commit is contained in:
Vishwas Babu A J
2015-05-17 22:31:32 -07:00
4 changed files with 77 additions and 24 deletions
@@ -166,11 +166,12 @@ public class JournalEntriesApiResource {
@Consumes({ MediaType.APPLICATION_JSON }) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON })
@Path("openingbalance") @Path("openingbalance")
public String retrieveOpeningBalance(@Context final UriInfo uriInfo, @QueryParam("officeId") final Long officeId) { public String retrieveOpeningBalance(@Context final UriInfo uriInfo, @QueryParam("officeId") final Long officeId,
@QueryParam("currencyCode") final String currencyCode) {
this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission); this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
final OfficeOpeningBalancesData officeOpeningBalancesData = this.journalEntryReadPlatformService final OfficeOpeningBalancesData officeOpeningBalancesData = this.journalEntryReadPlatformService.retrieveOfficeOpeningBalances(
.retrieveOfficeOpeningBalances(officeId); officeId, currencyCode);
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
return this.apiJsonSerializerService.serialize(settings, officeOpeningBalancesData); return this.apiJsonSerializerService.serialize(settings, officeOpeningBalancesData);
} }
@@ -20,6 +20,6 @@ public interface JournalEntryReadPlatformService {
Page<JournalEntryData> retrieveAll(SearchParameters searchParameters, Long glAccountId, Boolean onlyManualEntries, Date fromDate, Page<JournalEntryData> retrieveAll(SearchParameters searchParameters, Long glAccountId, Boolean onlyManualEntries, Date fromDate,
Date toDate, String transactionId, Integer entityType, JournalEntryAssociationParametersData associationParametersData); Date toDate, String transactionId, Integer entityType, JournalEntryAssociationParametersData associationParametersData);
OfficeOpeningBalancesData retrieveOfficeOpeningBalances(Long officeId); OfficeOpeningBalancesData retrieveOfficeOpeningBalances(Long officeId, String currencyCode);
} }
@@ -268,6 +268,14 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat
whereClose = " and "; whereClose = " and ";
} }
if (searchParameters.isCurrencyCodePassed()) {
sqlBuilder.append(whereClose + " journalEntry.currency_code = ?");
objectArray[arrayPos] = searchParameters.getCurrencyCode();
arrayPos = arrayPos + 1;
whereClose = " and ";
}
if (glAccountId != null && glAccountId != 0) { if (glAccountId != null && glAccountId != 0) {
sqlBuilder.append(whereClose + " journalEntry.account_id = ?"); sqlBuilder.append(whereClose + " journalEntry.account_id = ?");
objectArray[arrayPos] = glAccountId; objectArray[arrayPos] = glAccountId;
@@ -372,7 +380,7 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat
} }
@Override @Override
public OfficeOpeningBalancesData retrieveOfficeOpeningBalances(final Long officeId) { public OfficeOpeningBalancesData retrieveOfficeOpeningBalances(final Long officeId, String currencyCode) {
final FinancialActivityAccount financialActivityAccountId = this.financialActivityAccountRepositoryWrapper final FinancialActivityAccount financialActivityAccountId = this.financialActivityAccountRepositoryWrapper
.findByFinancialActivityTypeWithNotFoundDetection(300); .findByFinancialActivityTypeWithNotFoundDetection(300);
@@ -389,11 +397,11 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat
final OfficeData officeData = this.officeReadPlatformService.retrieveOffice(officeId); final OfficeData officeData = this.officeReadPlatformService.retrieveOffice(officeId);
final List<JournalEntryData> allOpeningTransactions = populateAllTransactionsFromGLAccounts(contraId); final List<JournalEntryData> allOpeningTransactions = populateAllTransactionsFromGLAccounts(contraId);
final String contraTransactionId = retrieveContraAccountTransactionId(officeId, contraId); final String contraTransactionId = retrieveContraAccountTransactionId(officeId, contraId, currencyCode);
List<JournalEntryData> existingOpeningBalanceTransactions = new ArrayList<>(); List<JournalEntryData> existingOpeningBalanceTransactions = new ArrayList<>();
if (StringUtils.isNotBlank(contraTransactionId)) { if (StringUtils.isNotBlank(contraTransactionId)) {
existingOpeningBalanceTransactions = retrieveOfficeBalanceTransactions(officeId, contraTransactionId); existingOpeningBalanceTransactions = retrieveOfficeBalanceTransactions(officeId, contraTransactionId, currencyCode);
} }
final List<JournalEntryData> transactions = populateOpeningBalances(existingOpeningBalanceTransactions, allOpeningTransactions); final List<JournalEntryData> transactions = populateOpeningBalances(existingOpeningBalanceTransactions, allOpeningTransactions);
final List<JournalEntryData> assetAccountOpeningBalances = new ArrayList<>(); final List<JournalEntryData> assetAccountOpeningBalances = new ArrayList<>();
@@ -457,14 +465,15 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat
return openingBalanceTransactions; return openingBalanceTransactions;
} }
private List<JournalEntryData> retrieveOfficeBalanceTransactions(final Long officeId, final String transactionId) { private List<JournalEntryData> retrieveOfficeBalanceTransactions(final Long officeId, final String transactionId,
final String currencyCode) {
final Long contraId = null; final Long contraId = null;
return retrieveContraTransactions(officeId, contraId, transactionId).getPageItems(); return retrieveContraTransactions(officeId, contraId, transactionId, currencyCode).getPageItems();
} }
private String retrieveContraAccountTransactionId(final Long officeId, final Long contraId) { private String retrieveContraAccountTransactionId(final Long officeId, final Long contraId, final String currencyCode) {
final String transactionId = ""; final String transactionId = "";
final Page<JournalEntryData> contraJournalEntries = retrieveContraTransactions(officeId, contraId, transactionId); final Page<JournalEntryData> contraJournalEntries = retrieveContraTransactions(officeId, contraId, transactionId, currencyCode);
if (!CollectionUtils.isEmpty(contraJournalEntries.getPageItems())) { if (!CollectionUtils.isEmpty(contraJournalEntries.getPageItems())) {
final JournalEntryData contraTransaction = contraJournalEntries.getPageItems().get( final JournalEntryData contraTransaction = contraJournalEntries.getPageItems().get(
contraJournalEntries.getPageItems().size() - 1); contraJournalEntries.getPageItems().size() - 1);
@@ -473,7 +482,8 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat
return transactionId; return transactionId;
} }
private Page<JournalEntryData> retrieveContraTransactions(final Long officeId, final Long contraId, final String transactionId) { private Page<JournalEntryData> retrieveContraTransactions(final Long officeId, final Long contraId, final String transactionId,
final String currencyCode) {
final Integer offset = 0; final Integer offset = 0;
final Integer limit = null; final Integer limit = null;
final String orderBy = "journalEntry.id"; final String orderBy = "journalEntry.id";
@@ -487,7 +497,7 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat
final Long savingsId = null; final Long savingsId = null;
final SearchParameters searchParameters = SearchParameters.forJournalEntries(officeId, offset, limit, orderBy, sortOrder, loanId, final SearchParameters searchParameters = SearchParameters.forJournalEntries(officeId, offset, limit, orderBy, sortOrder, loanId,
savingsId); savingsId, currencyCode);
return retrieveAll(searchParameters, contraId, onlyManualEntries, fromDate, toDate, transactionId, entityType, return retrieveAll(searchParameters, contraId, onlyManualEntries, fromDate, toDate, transactionId, entityType,
associationParametersData); associationParametersData);
@@ -21,13 +21,14 @@ public final class SearchParameters {
private final String orderBy; private final String orderBy;
private final String sortOrder; private final String sortOrder;
private final String accountNo; private final String accountNo;
private final String currencyCode;
private final Long staffId; private final Long staffId;
private final Long loanId; private final Long loanId;
private final Long savingsId; private final Long savingsId;
private final Boolean orphansOnly; private final Boolean orphansOnly;
public static SearchParameters from(final String sqlSearch, final Long officeId, final String externalId, final String name, public static SearchParameters from(final String sqlSearch, final Long officeId, final String externalId, final String name,
final String hierarchy) { final String hierarchy) {
@@ -68,8 +69,9 @@ public final class SearchParameters {
} }
public static SearchParameters forOffices(final String orderBy, final String sortOrder) { public static SearchParameters forOffices(final String orderBy, final String sortOrder) {
final Boolean orphansOnly = false; final Boolean orphansOnly = false;
return new SearchParameters(null, null, null, null, null, null, null, null, null, orderBy, sortOrder, null, null, null, null, orphansOnly); return new SearchParameters(null, null, null, null, null, null, null, null, null, orderBy, sortOrder, null, null, null, null,
orphansOnly);
} }
public static SearchParameters forLoans(final String sqlSearch, final String externalId, final Integer offset, final Integer limit, public static SearchParameters forLoans(final String sqlSearch, final String externalId, final Integer offset, final Integer limit,
@@ -96,6 +98,16 @@ public final class SearchParameters {
null, loanId, savingsId, orphansOnly); null, loanId, savingsId, orphansOnly);
} }
public static SearchParameters forJournalEntries(final Long officeId, final Integer offset, final Integer limit, final String orderBy,
final String sortOrder, final Long loanId, final Long savingsId, final String currencyCode) {
final Integer maxLimitAllowed = getCheckedLimit(limit);
final Long staffId = null;
final Boolean orphansOnly = false;
return new SearchParameters(null, officeId, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId,
null, loanId, savingsId, orphansOnly, currencyCode);
}
public static SearchParameters forPagination(final Integer offset, final Integer limit, final String orderBy, final String sortOrder) { public static SearchParameters forPagination(final Integer offset, final Integer limit, final String orderBy, final String sortOrder) {
final Integer maxLimitAllowed = getCheckedLimit(limit); final Integer maxLimitAllowed = getCheckedLimit(limit);
@@ -156,6 +168,30 @@ public final class SearchParameters {
this.loanId = loanId; this.loanId = loanId;
this.savingsId = savingsId; this.savingsId = savingsId;
this.orphansOnly = orphansOnly; this.orphansOnly = orphansOnly;
this.currencyCode = null;
}
public SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name,
final String hierarchy, final String firstname, final String lastname, final Integer offset, final Integer limit,
final String orderBy, final String sortOrder, final Long staffId, final String accountNo, final Long loanId,
final Long savingsId, final Boolean orphansOnly, final String currencyCode) {
this.sqlSearch = sqlSearch;
this.officeId = officeId;
this.externalId = externalId;
this.name = name;
this.hierarchy = hierarchy;
this.firstname = firstname;
this.lastname = lastname;
this.offset = offset;
this.limit = limit;
this.orderBy = orderBy;
this.sortOrder = sortOrder;
this.staffId = staffId;
this.accountNo = accountNo;
this.loanId = loanId;
this.savingsId = savingsId;
this.orphansOnly = orphansOnly;
this.currencyCode = currencyCode;
} }
public boolean isOrderByRequested() { public boolean isOrderByRequested() {
@@ -186,6 +222,10 @@ public final class SearchParameters {
return this.officeId != null && this.officeId != 0; return this.officeId != null && this.officeId != 0;
} }
public boolean isCurrencyCodePassed() {
return this.currencyCode != null;
}
public boolean isLimited() { public boolean isLimited() {
return this.limit != null && this.limit.intValue() > 0; return this.limit != null && this.limit.intValue() > 0;
} }
@@ -206,6 +246,10 @@ public final class SearchParameters {
return this.officeId; return this.officeId;
} }
public String getCurrencyCode(){
return this.currencyCode;
}
public String getExternalId() { public String getExternalId() {
return this.externalId; return this.externalId;
} }
@@ -270,11 +314,9 @@ public final class SearchParameters {
return this.savingsId; return this.savingsId;
} }
public Boolean isOrphansOnly(){ public Boolean isOrphansOnly() {
if(this.orphansOnly != null){ if (this.orphansOnly != null) { return this.orphansOnly; }
return this.orphansOnly; return false;
}
return false;
} }
} }