From e15fa7967fd4a3b6a343a59d34aec332419bdb67 Mon Sep 17 00:00:00 2001 From: mifoscontributer Date: Wed, 28 Aug 2013 10:58:21 +0530 Subject: [PATCH] Changing predefined posting json for consistenxy --- .../JournalEntryInvalidException.java | 7 +- ...WritePlatformServiceJpaRepositoryImpl.java | 78 ++++++++----------- .../rule/data/AccountingRuleData.java | 55 ++----------- ...AccountingRuleReadPlatformServiceImpl.java | 52 +++++++------ 4 files changed, 74 insertions(+), 118 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/exception/JournalEntryInvalidException.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/exception/JournalEntryInvalidException.java index f3c38462b..447865a44 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/exception/JournalEntryInvalidException.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/exception/JournalEntryInvalidException.java @@ -16,7 +16,8 @@ public class JournalEntryInvalidException extends AbstractPlatformDomainRuleExce /*** enum of reasons for invalid Journal Entry **/ public static enum GL_JOURNAL_ENTRY_INVALID_REASON { - FUTURE_DATE, ACCOUNTING_CLOSED, NO_DEBITS_OR_CREDITS, DEBIT_CREDIT_SUM_MISMATCH_WITH_AMOUNT, DEBIT_CREDIT_SUM_MISMATCH, DEBIT_CREDIT_ACCOUNT_OR_AMOUNT_EMPTY, GL_ACCOUNT_DISABLED, GL_ACCOUNT_MANUAL_ENTRIES_NOT_PERMITTED; + FUTURE_DATE, ACCOUNTING_CLOSED, NO_DEBITS_OR_CREDITS, DEBIT_CREDIT_SUM_MISMATCH_WITH_AMOUNT, DEBIT_CREDIT_SUM_MISMATCH, DEBIT_CREDIT_ACCOUNT_OR_AMOUNT_EMPTY, GL_ACCOUNT_DISABLED, GL_ACCOUNT_MANUAL_ENTRIES_NOT_PERMITTED, + INVALID_DEBIT_OR_CREDIT_ACCOUNTS; public String errorMessage() { if (name().toString().equalsIgnoreCase("FUTURE_DATE")) { @@ -33,6 +34,8 @@ public class JournalEntryInvalidException extends AbstractPlatformDomainRuleExce return "Both account and amount must be specified for all Debits and Credits"; } else if (name().toString().equalsIgnoreCase("GL_ACCOUNT_DISABLED")) { return "Target account has been disabled"; + } else if (name().toString().equalsIgnoreCase("INVALID_DEBIT_OR_CREDIT_ACCOUNTS")) { + return "Invalid debit or credit accounts are passed"; } else if (name().toString().equalsIgnoreCase("GL_ACCOUNT_MANUAL_ENTRIES_NOT_PERMITTED")) { return "Target account does not allow maual adjustments"; } return name().toString(); } @@ -50,6 +53,8 @@ public class JournalEntryInvalidException extends AbstractPlatformDomainRuleExce return "error.msg.glJournalEntry.invalid.empty.account.or.amount"; } else if (name().toString().equalsIgnoreCase("GL_ACCOUNT_DISABLED")) { return "error.msg.glJournalEntry.invalid.account.disabled"; + } else if (name().toString().equalsIgnoreCase("INVALID_DEBIT_OR_CREDIT_ACCOUNTS")) { + return "error.msg.glJournalEntry.invalid.debit.or.credit.accounts"; } else if (name().toString().equalsIgnoreCase("GL_ACCOUNT_MANUAL_ENTRIES_NOT_PERMITTED")) { return "error.msg.glJournalEntry.invalid.account.manual.adjustments.not.permitted"; } return name().toString(); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java index e246e3471..9932eae32 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryWritePlatformServiceJpaRepositoryImpl.java @@ -106,63 +106,48 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa final Date transactionDate = command.DateValueOfParameterNamed(JournalEntryJsonInputParams.TRANSACTION_DATE.getValue()); final String transactionId = generateTransactionId(); final String referenceNumber = command.stringValueOfParameterNamed(JournalEntryJsonInputParams.REFERENCE_NUMBER.getValue()); - final boolean manualEntry = true; if (accountRuleId != null) { - final BigDecimal amount = command.bigDecimalValueOfParameterNamed(JournalEntryJsonInputParams.AMOUNT.getValue()); - - String description = null; - if (StringUtils.isNotBlank(journalEntryCommand.getComments())) { - description = journalEntryCommand.getComments(); - } final AccountingRule accountingRule = this.accountingRuleRepository.findOne(accountRuleId); if (accountingRule == null) { throw new AccountingRuleNotFoundException(accountRuleId); } if (accountingRule.getAccountToCredit() == null) { - if (journalEntryCommand.getCredits() == null) { throw new RuntimeException( - "You have to pass atleast one value for credits"); } + if (journalEntryCommand.getCredits() == null) { throw new JournalEntryInvalidException( + GL_JOURNAL_ENTRY_INVALID_REASON.NO_DEBITS_OR_CREDITS, null, null, null); } if (journalEntryCommand.getDebits() != null) { checkDebitOrCreditAccountsAreValid(accountingRule, journalEntryCommand.getCredits(), journalEntryCommand.getDebits()); checkDebitAndCreditAmounts(journalEntryCommand.getCredits(), journalEntryCommand.getDebits()); - } else { - checkDebitAndCreditAmounts(journalEntryCommand.getCredits(), amount); } saveAllDebitOrCreditEntries(journalEntryCommand, office, transactionDate, journalEntryCommand.getCredits(), transactionId, JournalEntryType.CREDIT, referenceNumber); } else { - if (journalEntryCommand.getCredits() != null) { throw new RuntimeException( - "You can not pass credits for this rule please verify your rule"); } final GLAccount creditAccountHead = accountingRule.getAccountToCredit(); validateGLAccountForTransaction(creditAccountHead); - final JournalEntry creditEntry = JournalEntry.createNew(office, creditAccountHead, transactionId, manualEntry, - transactionDate, JournalEntryType.CREDIT, amount, description, null, null, referenceNumber); - this.glJournalEntryRepository.saveAndFlush(creditEntry); + validateDebitOrCreditArrayForExistingGLAccount(creditAccountHead,journalEntryCommand.getCredits()); + saveAllDebitOrCreditEntries(journalEntryCommand, office, transactionDate, journalEntryCommand.getCredits(), + transactionId, JournalEntryType.CREDIT, referenceNumber); } if (accountingRule.getAccountToDebit() == null) { - if (journalEntryCommand.getDebits() == null) { throw new RuntimeException( - "You have to pass atleast one parameter for debits"); } + if (journalEntryCommand.getDebits() == null) { throw new JournalEntryInvalidException( + GL_JOURNAL_ENTRY_INVALID_REASON.NO_DEBITS_OR_CREDITS, null, null, null); } if (journalEntryCommand.getCredits() != null) { checkDebitOrCreditAccountsAreValid(accountingRule, journalEntryCommand.getCredits(), journalEntryCommand.getDebits()); checkDebitAndCreditAmounts(journalEntryCommand.getCredits(), journalEntryCommand.getDebits()); - } else { - checkDebitAndCreditAmounts(journalEntryCommand.getDebits(), amount); } saveAllDebitOrCreditEntries(journalEntryCommand, office, transactionDate, journalEntryCommand.getDebits(), transactionId, JournalEntryType.DEBIT, referenceNumber); } else { - if (journalEntryCommand.getDebits() != null) { throw new RuntimeException( - "You can not pass debits for this rule please verify your rule"); } final GLAccount debitAccountHead = accountingRule.getAccountToDebit(); validateGLAccountForTransaction(debitAccountHead); - final JournalEntry debitEntry = JournalEntry.createNew(office, debitAccountHead, transactionId, manualEntry, - transactionDate, JournalEntryType.DEBIT, amount, description, null, null, referenceNumber); - this.glJournalEntryRepository.saveAndFlush(debitEntry); + validateDebitOrCreditArrayForExistingGLAccount(debitAccountHead,journalEntryCommand.getDebits()); + saveAllDebitOrCreditEntries(journalEntryCommand, office, transactionDate, journalEntryCommand.getDebits(), + transactionId, JournalEntryType.DEBIT, referenceNumber); } } else { @@ -182,6 +167,19 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa } } + private void validateDebitOrCreditArrayForExistingGLAccount(GLAccount glaccount, SingleDebitOrCreditEntryCommand[] creditOrDebits) { + /** + * If a glaccount is assigned for a rule the credits or debits array + * should have only one entry and it must be same as existing account + */ + if (creditOrDebits.length != 1) { throw new JournalEntryInvalidException( + GL_JOURNAL_ENTRY_INVALID_REASON.INVALID_DEBIT_OR_CREDIT_ACCOUNTS, null, null, null); } + for (SingleDebitOrCreditEntryCommand creditOrDebit : creditOrDebits) { + if (!glaccount.getId().equals(creditOrDebit.getGlAccountId())) { throw new JournalEntryInvalidException( + GL_JOURNAL_ENTRY_INVALID_REASON.INVALID_DEBIT_OR_CREDIT_ACCOUNTS, null, null, null); } + } + } + @SuppressWarnings("null") private void checkDebitOrCreditAccountsAreValid(final AccountingRule accountingRule, final SingleDebitOrCreditEntryCommand[] credits, final SingleDebitOrCreditEntryCommand[] debits) { @@ -238,19 +236,6 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa GL_JOURNAL_ENTRY_INVALID_REASON.DEBIT_CREDIT_SUM_MISMATCH, null, null, null); } } - private void checkDebitAndCreditAmounts(final SingleDebitOrCreditEntryCommand[] creditOrDebits, final BigDecimal amount) { - if (amount == null) { throw new JournalEntryInvalidException(GL_JOURNAL_ENTRY_INVALID_REASON.DEBIT_CREDIT_SUM_MISMATCH_WITH_AMOUNT, - null, null, null); } - BigDecimal creditOrDebitSum = BigDecimal.ZERO; - for (final SingleDebitOrCreditEntryCommand creditEntryCommand : creditOrDebits) { - if (creditEntryCommand.getAmount() == null || creditEntryCommand.getGlAccountId() == null) { throw new JournalEntryInvalidException( - GL_JOURNAL_ENTRY_INVALID_REASON.DEBIT_CREDIT_ACCOUNT_OR_AMOUNT_EMPTY, null, null, null); } - creditOrDebitSum = creditOrDebitSum.add(creditEntryCommand.getAmount()); - } - if (creditOrDebitSum.compareTo(amount) != 0) { throw new JournalEntryInvalidException( - GL_JOURNAL_ENTRY_INVALID_REASON.DEBIT_CREDIT_SUM_MISMATCH, null, null, null); } - } - private void validateGLAccountForTransaction(final GLAccount creditOrDebitAccountHead) { /*** * validate that the account allows manual adjustments and is not @@ -346,17 +331,16 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa if (latestGLClosure.getClosingDate().after(transactionDate) || latestGLClosure.getClosingDate().equals(transactionDate)) { throw new JournalEntryInvalidException( GL_JOURNAL_ENTRY_INVALID_REASON.ACCOUNTING_CLOSED, latestGLClosure.getClosingDate(), null, null); } } - if (command.getAccountingRuleId() == null) { - /*** check if credits and debits are valid **/ - final SingleDebitOrCreditEntryCommand[] credits = command.getCredits(); - final SingleDebitOrCreditEntryCommand[] debits = command.getDebits(); - // atleast one debit or credit must be present - if ((credits == null || credits.length <= 0) || (debits == null || debits.length <= 0)) { throw new JournalEntryInvalidException( - GL_JOURNAL_ENTRY_INVALID_REASON.NO_DEBITS_OR_CREDITS, null, null, null); } + /*** check if credits and debits are valid **/ + final SingleDebitOrCreditEntryCommand[] credits = command.getCredits(); + final SingleDebitOrCreditEntryCommand[] debits = command.getDebits(); - checkDebitAndCreditAmounts(credits, debits); - } + // atleast one debit or credit must be present + if ((credits == null || credits.length <= 0) || (debits == null || debits.length <= 0)) { throw new JournalEntryInvalidException( + GL_JOURNAL_ENTRY_INVALID_REASON.NO_DEBITS_OR_CREDITS, null, null, null); } + + checkDebitAndCreditAmounts(credits, debits); } private void saveAllDebitOrCreditEntries(final JournalEntryCommand command, final Office office, final Date transactionDate, diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/rule/data/AccountingRuleData.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/rule/data/AccountingRuleData.java index 908f7fe85..fb800230d 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/rule/data/AccountingRuleData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/rule/data/AccountingRuleData.java @@ -30,15 +30,17 @@ public class AccountingRuleData { private final boolean systemDefined; private final boolean allowMultipleDebitEntries; private final boolean allowMultipleCreditEntries; - private final GLAccountData debitAccountHead; - private final GLAccountData creditAccountHead; private final List creditTags; private final List debitTags; // template + @SuppressWarnings("unused") private List allowedOffices = new ArrayList(); + @SuppressWarnings("unused") private List allowedAccounts = new ArrayList(); + @SuppressWarnings("unused") private final Collection allowedCreditTagOptions; + @SuppressWarnings("unused") private final Collection allowedDebitTagOptions; private final List creditAccounts; private final List debitAccounts; @@ -56,8 +58,6 @@ public class AccountingRuleData { this.allowMultipleCreditEntries = accountingRuleData.allowMultipleCreditEntries; this.allowedOffices = allowedOffices; this.allowedAccounts = allowedAccounts; - this.debitAccountHead = accountingRuleData.debitAccountHead; - this.creditAccountHead = accountingRuleData.creditAccountHead; this.allowedCreditTagOptions = allowedCreditTagOptions; this.allowedDebitTagOptions = allowedDebitTagOptions; this.creditTags = accountingRuleData.creditTags; @@ -78,8 +78,6 @@ public class AccountingRuleData { this.allowMultipleCreditEntries = false; this.allowedOffices = allowedOffices; this.allowedAccounts = allowedAccounts; - this.debitAccountHead = null; - this.creditAccountHead = null; this.allowedCreditTagOptions = allowedCreditTagOptions; this.allowedDebitTagOptions = allowedDebitTagOptions; this.creditTags = null; @@ -90,7 +88,8 @@ public class AccountingRuleData { public AccountingRuleData(final Long id, final Long officeId, final String officeName, final String name, final String description, final boolean systemDefined, final boolean allowMultipleDebitEntries, final boolean allowMultipleCreditEntries, - final GLAccountData debitAccountData, final GLAccountData creditAccountData) { + final List creditTags, final List debitTags, + final List creditAccounts, final List debitAccounts) { this.id = id; this.officeId = officeId; this.officeName = officeName; @@ -101,47 +100,14 @@ public class AccountingRuleData { this.allowMultipleCreditEntries = allowMultipleCreditEntries; this.allowedOffices = null; this.allowedAccounts = null; - this.debitAccountHead = debitAccountData; - this.creditAccountHead = creditAccountData; this.allowedCreditTagOptions = null; this.allowedDebitTagOptions = null; - this.creditTags = null; - this.debitTags = null; - this.creditAccounts = new ArrayList(); - this.debitAccounts = new ArrayList(); - } - - public AccountingRuleData(final AccountingRuleData accountingRuleData, final List creditTags, - final List creditAccounts, final List debitTags, - final List debitAccounts) { - this.id = accountingRuleData.id; - this.officeId = accountingRuleData.officeId; - this.officeName = accountingRuleData.officeName; - this.name = accountingRuleData.name; - this.description = accountingRuleData.description; - this.systemDefined = accountingRuleData.systemDefined; - this.allowMultipleDebitEntries = accountingRuleData.allowMultipleDebitEntries; - this.allowMultipleCreditEntries = accountingRuleData.allowMultipleCreditEntries; - this.allowedOffices = accountingRuleData.allowedOffices; - this.allowedAccounts = accountingRuleData.allowedAccounts; - this.debitAccountHead = accountingRuleData.debitAccountHead; - this.creditAccountHead = accountingRuleData.creditAccountHead; - this.allowedCreditTagOptions = accountingRuleData.allowedCreditTagOptions; - this.allowedDebitTagOptions = accountingRuleData.allowedDebitTagOptions; this.creditTags = creditTags; - this.creditAccounts = creditAccounts; this.debitTags = debitTags; + this.creditAccounts = creditAccounts; this.debitAccounts = debitAccounts; } - public GLAccountData getDebitAccountHead() { - return this.debitAccountHead; - } - - public GLAccountData getCreditAccountHead() { - return this.creditAccountHead; - } - public List getCreditTags() { return this.creditTags; } @@ -150,11 +116,4 @@ public class AccountingRuleData { return this.debitTags; } - public List getCreditAccounts() { - return this.creditAccounts; - } - - public List getDebitAccounts() { - return this.debitAccounts; - } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/rule/service/AccountingRuleReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/rule/service/AccountingRuleReadPlatformServiceImpl.java index 0374a278a..b2e6d4890 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/rule/service/AccountingRuleReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/rule/service/AccountingRuleReadPlatformServiceImpl.java @@ -8,12 +8,12 @@ package org.mifosplatform.accounting.rule.service; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import org.mifosplatform.accounting.common.AccountingEnumerations; -import org.mifosplatform.accounting.glaccount.data.GLAccountData; import org.mifosplatform.accounting.glaccount.data.GLAccountDataForLookup; import org.mifosplatform.accounting.glaccount.service.GLAccountReadPlatformService; import org.mifosplatform.accounting.journalentry.domain.JournalEntryType; @@ -96,29 +96,37 @@ public class AccountingRuleReadPlatformServiceImpl implements AccountingRuleRead final String debitAccountGLCode = rs.getString("debitAccountGLCode"); final String creditAccountGLCode = rs.getString("creditAccountGLCode"); - final GLAccountData debitAccountData = accountToDebitId == null ? null : new GLAccountData(accountToDebitId, - debitAccountName, debitAccountGLCode); - final GLAccountData creditAccountData = accountToCreditId == null ? null : new GLAccountData(accountToCreditId, - creditAccountName, creditAccountGLCode); + final List creditTags; + final List debitTags; + final List creditAccounts; + final List debitAccounts; + + if (accountToCreditId == null) { + creditTags = !this.isAssociationParametersExists ? getCreditOrDebitTags(id, JournalEntryType.CREDIT.getValue()) + : null; + creditAccounts = this.isAssociationParametersExists ? this.glAccountReadPlatformService.retrieveAccountsByTagId(id, + JournalEntryType.CREDIT.getValue()) : null; + } else { + creditTags = null; + final GLAccountDataForLookup creditAccount = new GLAccountDataForLookup(accountToCreditId, creditAccountName, + creditAccountGLCode); + creditAccounts = new ArrayList(Arrays.asList(creditAccount)); + } + if (accountToDebitId == null) { + debitTags = !this.isAssociationParametersExists ? getCreditOrDebitTags(id, JournalEntryType.DEBIT.getValue()) + : null; + debitAccounts = this.isAssociationParametersExists ? this.glAccountReadPlatformService.retrieveAccountsByTagId(id, + JournalEntryType.DEBIT.getValue()) : null; + } else { + debitTags = null; + final GLAccountDataForLookup debitAccount = new GLAccountDataForLookup(accountToDebitId, debitAccountName, + debitAccountGLCode); + debitAccounts = new ArrayList(Arrays.asList(debitAccount)); + } accountingRuleData = new AccountingRuleData(id, officeId, officeName, name, description, systemDefined, - allowMultipleDebitEntries, allowMultipleCreditEntries, debitAccountData, creditAccountData); - } - if (accountingRuleData.getCreditAccountHead() == null) { - final List creditTags = !this.isAssociationParametersExists ? getCreditOrDebitTags(id, - JournalEntryType.CREDIT.getValue()) : null; - final List creditAccounts = this.isAssociationParametersExists ? this.glAccountReadPlatformService - .retrieveAccountsByTagId(id, JournalEntryType.CREDIT.getValue()) : null; - accountingRuleData = new AccountingRuleData(accountingRuleData, creditTags, creditAccounts, - accountingRuleData.getDebitTags(), accountingRuleData.getDebitAccounts()); - } - if (accountingRuleData.getDebitAccountHead() == null) { - final List debitTags = !this.isAssociationParametersExists ? getCreditOrDebitTags(id, - JournalEntryType.DEBIT.getValue()) : null; - final List debitAccounts = this.isAssociationParametersExists ? this.glAccountReadPlatformService - .retrieveAccountsByTagId(id, JournalEntryType.DEBIT.getValue()) : null; - accountingRuleData = new AccountingRuleData(accountingRuleData, accountingRuleData.getCreditTags(), - accountingRuleData.getCreditAccounts(), debitTags, debitAccounts); + allowMultipleDebitEntries, allowMultipleCreditEntries, creditTags, debitTags, creditAccounts, debitAccounts); } + extractedData.put(id, accountingRuleData); } return extractedData;