diff --git a/api-docs/apiLive.htm b/api-docs/apiLive.htm index b17a26cd5..4a1831bfc 100644 --- a/api-docs/apiLive.htm +++ b/api-docs/apiLive.htm @@ -19516,6 +19516,13 @@ No Request Body: Describes whether account balances computed for the journal entry. + + transactionDetails + + + Additional details of transaction like payment details and notes . + + @@ -19589,6 +19596,20 @@ No Request Body:
transactionId
String optional +
+
transactionDetails
+
+ Boolean optional +
+
Flag determines if additional transactional details + to be returned(like payment details and notes). +
+
runningBalance
+
+ Boolean optional +
+
Flag determines whether running balances + to be returned

Example Requests:

@@ -19603,6 +19624,10 @@ No Request Body:
journalentries?offset=10&limit=50

journalentries?orderBy=transactionId,sortOrder=DESC
+
+
journalentries?runningBalance=true
+
+
journalentries?transactionDetails=true
@@ -19651,17 +19676,6 @@ GET https://DomainName/api/v1/journalentries?transactionId=PB37X8Y21EQUY4S ], "createdByUserName": "mifos", "reversed": false, - "officeRunningBalance":0, - "organizationRunningBalance":0 - "runningBalanceComputed":false , - "paymentDetails": { - "accountNumber": "", - "checkNumber": "", - "receiptNumber": "ddddd", - "bankNumber": "", - "routineCode": "", - "paymentType": "Cash" - } }, { "id": 2, @@ -19702,17 +19716,6 @@ GET https://DomainName/api/v1/journalentries?transactionId=PB37X8Y21EQUY4S ], "createdByUserName": "mifos", "reversed": false, - "officeRunningBalance":0, - "organizationRunningBalance":0 - "runningBalanceComputed":false, - "paymentDetails": { - "accountNumber": "", - "checkNumber": "", - "receiptNumber": "ddddd", - "bankNumber": "", - "routineCode": "", - "paymentType": "Cash" - } } ] @@ -19955,6 +19958,10 @@ Request Body:

journalentries/1?fields=officeName,glAccountId,entryType,amount
+
+
journalentries/1?runningBalance=true
+
+
journalentries/1?transactionDetails=true
@@ -19994,10 +20001,6 @@ GET https://DomainName/api/v1/journalentries/{entryId} ], "createdByUserName": "mifos", "reversed": false, - "officeRunningBalance":0, - "organizationRunningBalance":0 - "runningBalanceComputed":false - }
diff --git a/mifosng-db/migrations/core_db/V133__adding_payment_detail_with_journal_entry.sql b/mifosng-db/migrations/core_db/V133__adding_payment_detail_with_journal_entry.sql new file mode 100755 index 000000000..3e20d4f8a --- /dev/null +++ b/mifosng-db/migrations/core_db/V133__adding_payment_detail_with_journal_entry.sql @@ -0,0 +1,10 @@ +ALTER TABLE `acc_gl_journal_entry` + ADD COLUMN `loan_transaction_id` BIGINT(20) NULL AFTER `transaction_id`, + ADD COLUMN `savings_transaction_id` BIGINT(20) NULL AFTER `loan_transaction_id`, + ADD CONSTRAINT `FK_acc_gl_journal_entry_m_loan_transaction` FOREIGN KEY (`loan_transaction_id`) REFERENCES `m_loan_transaction` (`id`), + ADD CONSTRAINT `FK_acc_gl_journal_entry_m_savings_account_transaction` FOREIGN KEY (`savings_transaction_id`) REFERENCES `m_savings_account_transaction` (`id`); + +UPDATE acc_gl_journal_entry je SET je.savings_transaction_id=je.transaction_id,je.transaction_id=Concat('S',je.transaction_id) WHERE je.entity_type_enum=2; + +UPDATE acc_gl_journal_entry je SET je.loan_transaction_id=je.transaction_id,je.transaction_id=Concat('L',je.transaction_id) WHERE je.entity_type_enum=1; + diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/JournalEntriesApiResource.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/JournalEntriesApiResource.java index 65269ce39..884ca1b9e 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/JournalEntriesApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/api/JournalEntriesApiResource.java @@ -22,6 +22,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriInfo; import org.apache.commons.lang.StringUtils; +import org.mifosplatform.accounting.journalentry.data.JournalEntryAssociationParametersData; import org.mifosplatform.accounting.journalentry.data.JournalEntryData; import org.mifosplatform.accounting.journalentry.service.JournalEntryReadPlatformService; import org.mifosplatform.commands.domain.CommandWrapper; @@ -79,7 +80,8 @@ public class JournalEntriesApiResource { @QueryParam("transactionId") final String transactionId, @QueryParam("entityType") final Integer entityType, @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder, @QueryParam("locale") final String locale, - @QueryParam("dateFormat") final String dateFormat) { + @QueryParam("dateFormat") final String dateFormat,@QueryParam("runningBalance") final boolean runningBalance, + @QueryParam("transactionDetails") final boolean transactionDetails) { this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission); @@ -93,9 +95,10 @@ public class JournalEntriesApiResource { } final SearchParameters searchParameters = SearchParameters.forJournalEntries(officeId, offset, limit, orderBy, sortOrder); + JournalEntryAssociationParametersData associationParametersData = new JournalEntryAssociationParametersData(transactionDetails, runningBalance); final Page glJournalEntries = this.journalEntryReadPlatformService.retrieveAll(searchParameters, glAccountId, - onlyManualEntries, fromDate, toDate, transactionId, entityType); + onlyManualEntries, fromDate, toDate, transactionId, entityType, associationParametersData); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); return this.apiJsonSerializerService.serialize(settings, glJournalEntries, RESPONSE_DATA_PARAMETERS); } @@ -104,10 +107,12 @@ public class JournalEntriesApiResource { @Path("{journalEntryId}") @Consumes({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON }) - public String retreiveJournalEntryById(@PathParam("journalEntryId") final Long journalEntryId, @Context final UriInfo uriInfo) { + public String retreiveJournalEntryById(@PathParam("journalEntryId") final Long journalEntryId, @Context final UriInfo uriInfo, + @QueryParam("runningBalance") final boolean runningBalance, @QueryParam("transactionDetails") final boolean transactionDetails) { this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission); - final JournalEntryData glJournalEntryData = this.journalEntryReadPlatformService.retrieveGLJournalEntryById(journalEntryId); + JournalEntryAssociationParametersData associationParametersData = new JournalEntryAssociationParametersData(transactionDetails, runningBalance); + final JournalEntryData glJournalEntryData = this.journalEntryReadPlatformService.retrieveGLJournalEntryById(journalEntryId, associationParametersData); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); return this.apiJsonSerializerService.serialize(settings, glJournalEntryData, RESPONSE_DATA_PARAMETERS); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/data/JournalEntryAssociationParametersData.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/data/JournalEntryAssociationParametersData.java new file mode 100755 index 000000000..a3cb601f5 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/data/JournalEntryAssociationParametersData.java @@ -0,0 +1,29 @@ +package org.mifosplatform.accounting.journalentry.data; + + +public class JournalEntryAssociationParametersData { + + private final boolean transactionDetailsRequired; + private final boolean runningBalanceRequired; + + + public JournalEntryAssociationParametersData() { + this.transactionDetailsRequired = false; + this.runningBalanceRequired = false; + } + + public JournalEntryAssociationParametersData(final boolean transactionDetailsRequired , final boolean runningBalanceRequired) { + this.transactionDetailsRequired = transactionDetailsRequired; + this.runningBalanceRequired = runningBalanceRequired; + } + + + public boolean isTransactionDetailsRequired() { + return this.transactionDetailsRequired; + } + + + public boolean isRunningBalanceRequired() { + return this.runningBalanceRequired; + } +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/data/JournalEntryData.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/data/JournalEntryData.java index bbfe83d77..8d7bfd11b 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/data/JournalEntryData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/data/JournalEntryData.java @@ -60,7 +60,7 @@ public class JournalEntryData { private final Boolean runningBalanceComputed; @SuppressWarnings("unused") - private final PaymentDetails paymentDetails; + private final TransactionDetailData transactionDetails; public JournalEntryData(final Long id, final Long officeId, final String officeName, final String glAccountName, final Long glAccountId, final String glAccountCode, final EnumOptionData glAccountClassification, @@ -68,7 +68,7 @@ public class JournalEntryData { final Boolean manualEntry, final EnumOptionData entityType, final Long entityId, final Long createdByUserId, final LocalDate createdDate, final String createdByUserName, final String comments, final Boolean reversed, final String referenceNumber, final BigDecimal officeRunningBalance, final BigDecimal organizationRunningBalance, - final Boolean runningBalanceComputed,final PaymentDetails paymentDetails) { + final Boolean runningBalanceComputed,final TransactionDetailData transactionDetailData) { this.id = id; this.officeId = officeId; this.officeName = officeName; @@ -92,7 +92,7 @@ public class JournalEntryData { this.officeRunningBalance = officeRunningBalance; this.organizationRunningBalance = organizationRunningBalance; this.runningBalanceComputed = runningBalanceComputed; - this.paymentDetails = paymentDetails; + this.transactionDetails = transactionDetailData; } public Long getId() { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/data/PaymentDetails.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/data/PaymentDetails.java deleted file mode 100644 index 41e8af0d8..000000000 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/data/PaymentDetails.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.mifosplatform.accounting.journalentry.data; - -public class PaymentDetails { - - @SuppressWarnings("unused") - private final String accountNumber; - @SuppressWarnings("unused") - private final String checkNumber; - @SuppressWarnings("unused") - private final String receiptNumber; - @SuppressWarnings("unused") - private final String bankNumber; - @SuppressWarnings("unused") - private final String routineCode; - @SuppressWarnings("unused") - private final String paymentType; - - public PaymentDetails(final String accountNumber, final String checkNumber, final String receiptNumber, final String bankNumber, - final String routineCode, final String paymentType) { - this.accountNumber = accountNumber; - this.checkNumber = checkNumber; - this.receiptNumber = receiptNumber; - this.bankNumber = bankNumber; - this.routineCode = routineCode; - this.paymentType = paymentType; - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/data/TransactionDetailData.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/data/TransactionDetailData.java new file mode 100755 index 000000000..ba34f8c7f --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/data/TransactionDetailData.java @@ -0,0 +1,22 @@ +package org.mifosplatform.accounting.journalentry.data; + +import org.mifosplatform.portfolio.note.data.NoteData; +import org.mifosplatform.portfolio.paymentdetail.data.PaymentDetailData; + +public class TransactionDetailData { + + @SuppressWarnings("unused") + private final Long transactionId; + + @SuppressWarnings("unused") + private final PaymentDetailData paymentDetails; + + @SuppressWarnings("unused") + private final NoteData noteData; + + public TransactionDetailData(final Long transactionId, final PaymentDetailData paymentDetails, final NoteData noteData) { + this.transactionId = transactionId; + this.paymentDetails = paymentDetails; + this.noteData = noteData; + } +} diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/domain/JournalEntry.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/domain/JournalEntry.java index 59e919cb4..75c8a63ab 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/domain/JournalEntry.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/domain/JournalEntry.java @@ -21,6 +21,8 @@ import org.apache.commons.lang.StringUtils; import org.mifosplatform.accounting.glaccount.domain.GLAccount; import org.mifosplatform.infrastructure.core.domain.AbstractAuditableCustom; import org.mifosplatform.organisation.office.domain.Office; +import org.mifosplatform.portfolio.loanaccount.domain.LoanTransaction; +import org.mifosplatform.portfolio.savings.domain.SavingsAccountTransaction; import org.mifosplatform.useradministration.domain.AppUser; @Entity @@ -45,6 +47,14 @@ public class JournalEntry extends AbstractAuditableCustom { @Column(name = "transaction_id", nullable = false, length = 50) private String transactionId; + @ManyToOne + @JoinColumn(name = "loan_transaction_id", nullable = false) + private LoanTransaction loanTransaction; + + @ManyToOne + @JoinColumn(name = "savings_transaction_id", nullable = false) + private SavingsAccountTransaction savingsTransaction; + @Column(name = "reversed", nullable = false) private boolean reversed = false; @@ -75,9 +85,10 @@ public class JournalEntry extends AbstractAuditableCustom { public static JournalEntry createNew(final Office office, final GLAccount glAccount, final String currencyCode, final String transactionId, final boolean manualEntry, final Date transactionDate, final JournalEntryType journalEntryType, - final BigDecimal amount, final String description, final Integer entityType, final Long entityId, final String referenceNumber) { + final BigDecimal amount, final String description, final Integer entityType, final Long entityId, final String referenceNumber, + final LoanTransaction loanTransaction, final SavingsAccountTransaction savingsTransaction) { return new JournalEntry(office, glAccount, currencyCode, transactionId, manualEntry, transactionDate, journalEntryType.getValue(), - amount, description, entityType, entityId, referenceNumber); + amount, description, entityType, entityId, referenceNumber, loanTransaction, savingsTransaction); } protected JournalEntry() { @@ -86,7 +97,8 @@ public class JournalEntry extends AbstractAuditableCustom { public JournalEntry(final Office office, final GLAccount glAccount, final String currencyCode, final String transactionId, final boolean manualEntry, final Date transactionDate, final Integer type, final BigDecimal amount, final String description, - final Integer entityType, final Long entityId, final String referenceNumber) { + final Integer entityType, final Long entityId, final String referenceNumber, final LoanTransaction loanTransaction, + final SavingsAccountTransaction savingsTransaction) { this.office = office; this.glAccount = glAccount; this.reversalJournalEntry = null; @@ -101,7 +113,8 @@ public class JournalEntry extends AbstractAuditableCustom { this.entityId = entityId; this.referenceNumber = referenceNumber; this.currencyCode = currencyCode; - + this.loanTransaction = loanTransaction; + this.savingsTransaction = savingsTransaction; } public boolean isDebitEntry() { @@ -144,4 +157,14 @@ public class JournalEntry extends AbstractAuditableCustom { return this.currencyCode; } + + public LoanTransaction getLoanTransaction() { + return this.loanTransaction; + } + + + public SavingsAccountTransaction getSavingsTransaction() { + return this.savingsTransaction; + } + } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/AccountingProcessorHelper.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/AccountingProcessorHelper.java index 3abf9f41f..585cdcd9e 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/AccountingProcessorHelper.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/AccountingProcessorHelper.java @@ -12,6 +12,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import org.apache.commons.lang.StringUtils; import org.joda.time.LocalDate; import org.mifosplatform.accounting.closure.domain.GLClosure; import org.mifosplatform.accounting.closure.domain.GLClosureRepository; @@ -38,26 +39,37 @@ import org.mifosplatform.organisation.monetary.data.CurrencyData; import org.mifosplatform.organisation.office.domain.Office; import org.mifosplatform.organisation.office.domain.OfficeRepository; import org.mifosplatform.portfolio.loanaccount.data.LoanTransactionEnumData; +import org.mifosplatform.portfolio.loanaccount.domain.LoanTransaction; +import org.mifosplatform.portfolio.loanaccount.domain.LoanTransactionRepository; import org.mifosplatform.portfolio.savings.data.SavingsAccountTransactionEnumData; +import org.mifosplatform.portfolio.savings.domain.SavingsAccountTransaction; +import org.mifosplatform.portfolio.savings.domain.SavingsAccountTransactionRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class AccountingProcessorHelper { + public static final String LOAN_TRANSACTION_IDENTIFIER = "L"; + public static final String SAVINGS_TRANSACTION_IDENTIFIER = "S"; private final JournalEntryRepository glJournalEntryRepository; private final ProductToGLAccountMappingRepository accountMappingRepository; private final GLClosureRepository closureRepository; private final OfficeRepository officeRepository; + private final LoanTransactionRepository loanTransactionRepository; + private final SavingsAccountTransactionRepository savingsAccountTransactionRepository; @Autowired public AccountingProcessorHelper(final JournalEntryRepository glJournalEntryRepository, final ProductToGLAccountMappingRepository accountMappingRepository, final GLClosureRepository closureRepository, - final OfficeRepository officeRepository) { + final OfficeRepository officeRepository, final LoanTransactionRepository loanTransactionRepository, + final SavingsAccountTransactionRepository savingsAccountTransactionRepository) { this.glJournalEntryRepository = glJournalEntryRepository; this.accountMappingRepository = accountMappingRepository; this.closureRepository = closureRepository; this.officeRepository = officeRepository; + this.loanTransactionRepository = loanTransactionRepository; + this.savingsAccountTransactionRepository = savingsAccountTransactionRepository; } public LoanDTO populateLoanDtoFromMap(final Map accountingBridgeData, final boolean cashBasedAccountingEnabled, @@ -455,6 +467,14 @@ public class AccountingProcessorHelper { totalAmount); } } + + public LoanTransaction getLoanTransactionById(final long loanTransactionId) { + return this.loanTransactionRepository.findOne(loanTransactionId); + } + + public SavingsAccountTransaction getSavingsTransactionById(final long savingsTransactionId) { + return this.savingsAccountTransactionRepository.findOne(savingsTransactionId); + } private void createCreditJournalEntryOrReversalForLoan(final Office office, final String currencyCode, final int accountMappingTypeId, final Long loanProductId, final Long paymentTypeId, final Long loanId, final String transactionId, final Date transactionDate, @@ -470,32 +490,68 @@ public class AccountingProcessorHelper { private void createCreditJournalEntryForLoan(final Office office, final String currencyCode, final GLAccount account, final Long loanId, final String transactionId, final Date transactionDate, final BigDecimal amount) { final boolean manualEntry = false; - final JournalEntry journalEntry = JournalEntry.createNew(office, account, currencyCode, transactionId, manualEntry, - transactionDate, JournalEntryType.CREDIT, amount, null, PortfolioProductType.LOAN.getValue(), loanId, null); + LoanTransaction loanTransaction = null; + SavingsAccountTransaction savingsAccountTransaction = null; + String modifiedTransactionId = transactionId; + if(StringUtils.isNumeric(transactionId)){ + long id = Long.parseLong(transactionId); + loanTransaction = this.loanTransactionRepository.findOne(id); + modifiedTransactionId = LOAN_TRANSACTION_IDENTIFIER + transactionId ; + } + final JournalEntry journalEntry = JournalEntry.createNew(office, account, currencyCode, modifiedTransactionId, manualEntry, + transactionDate, JournalEntryType.CREDIT, amount, null, PortfolioProductType.LOAN.getValue(), loanId, null, + loanTransaction, savingsAccountTransaction); this.glJournalEntryRepository.saveAndFlush(journalEntry); } private void createCreditJournalEntryForSavings(final Office office, final String currencyCode, final GLAccount account, final Long savingsId, final String transactionId, final Date transactionDate, final BigDecimal amount) { final boolean manualEntry = false; - final JournalEntry journalEntry = JournalEntry.createNew(office, account, currencyCode, transactionId, manualEntry, - transactionDate, JournalEntryType.CREDIT, amount, null, PortfolioProductType.SAVING.getValue(), savingsId, null); + LoanTransaction loanTransaction = null; + SavingsAccountTransaction savingsAccountTransaction = null; + String modifiedTransactionId = transactionId; + if(StringUtils.isNumeric(transactionId)){ + long id = Long.parseLong(transactionId); + savingsAccountTransaction = this.savingsAccountTransactionRepository.findOne(id); + modifiedTransactionId = SAVINGS_TRANSACTION_IDENTIFIER + transactionId; + } + final JournalEntry journalEntry = JournalEntry.createNew(office, account, currencyCode, modifiedTransactionId, manualEntry, + transactionDate, JournalEntryType.CREDIT, amount, null, PortfolioProductType.SAVING.getValue(), savingsId, null, + loanTransaction, savingsAccountTransaction); this.glJournalEntryRepository.saveAndFlush(journalEntry); } private void createDebitJournalEntryForLoan(final Office office, final String currencyCode, final GLAccount account, final Long loanId, final String transactionId, final Date transactionDate, final BigDecimal amount) { final boolean manualEntry = false; - final JournalEntry journalEntry = JournalEntry.createNew(office, account, currencyCode, transactionId, manualEntry, - transactionDate, JournalEntryType.DEBIT, amount, null, PortfolioProductType.LOAN.getValue(), loanId, null); + LoanTransaction loanTransaction = null; + SavingsAccountTransaction savingsAccountTransaction = null; + String modifiedTransactionId = transactionId; + if(StringUtils.isNumeric(transactionId)){ + long id = Long.parseLong(transactionId); + loanTransaction = this.loanTransactionRepository.findOne(id); + modifiedTransactionId = LOAN_TRANSACTION_IDENTIFIER + transactionId; + } + final JournalEntry journalEntry = JournalEntry.createNew(office, account, currencyCode, modifiedTransactionId, manualEntry, + transactionDate, JournalEntryType.DEBIT, amount, null, PortfolioProductType.LOAN.getValue(), loanId, null, + loanTransaction, savingsAccountTransaction); this.glJournalEntryRepository.saveAndFlush(journalEntry); } private void createDebitJournalEntryForSavings(final Office office, final String currencyCode, final GLAccount account, final Long savingsId, final String transactionId, final Date transactionDate, final BigDecimal amount) { final boolean manualEntry = false; - final JournalEntry journalEntry = JournalEntry.createNew(office, account, currencyCode, transactionId, manualEntry, - transactionDate, JournalEntryType.DEBIT, amount, null, PortfolioProductType.SAVING.getValue(), savingsId, null); + LoanTransaction loanTransaction = null; + SavingsAccountTransaction savingsAccountTransaction = null; + String modifiedTransactionId = transactionId; + if(StringUtils.isNumeric(transactionId)){ + long id = Long.parseLong(transactionId); + savingsAccountTransaction = this.savingsAccountTransactionRepository.findOne(id); + modifiedTransactionId = SAVINGS_TRANSACTION_IDENTIFIER + transactionId ; + } + final JournalEntry journalEntry = JournalEntry.createNew(office, account, currencyCode, modifiedTransactionId, manualEntry, + transactionDate, JournalEntryType.DEBIT, amount, null, PortfolioProductType.SAVING.getValue(), savingsId, null, + loanTransaction, savingsAccountTransaction); this.glJournalEntryRepository.saveAndFlush(journalEntry); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformService.java index a3110969a..106a5c29a 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformService.java @@ -7,15 +7,16 @@ package org.mifosplatform.accounting.journalentry.service; import java.util.Date; +import org.mifosplatform.accounting.journalentry.data.JournalEntryAssociationParametersData; import org.mifosplatform.accounting.journalentry.data.JournalEntryData; import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.portfolio.group.service.SearchParameters; public interface JournalEntryReadPlatformService { - - JournalEntryData retrieveGLJournalEntryById(long glJournalEntryId); + + JournalEntryData retrieveGLJournalEntryById(long glJournalEntryId, JournalEntryAssociationParametersData associationParametersData); Page retrieveAll(SearchParameters searchParameters, Long glAccountId, Boolean onlyManualEntries, Date fromDate, - Date toDate, String transactionId, Integer entityType); + Date toDate, String transactionId, Integer entityType, JournalEntryAssociationParametersData associationParametersData); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java index 5f0c17671..789c46f3a 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java @@ -17,15 +17,19 @@ import java.util.Date; import org.apache.commons.lang.StringUtils; import org.joda.time.LocalDate; import org.mifosplatform.accounting.common.AccountingEnumerations; +import org.mifosplatform.accounting.journalentry.data.JournalEntryAssociationParametersData; import org.mifosplatform.accounting.journalentry.data.JournalEntryData; -import org.mifosplatform.accounting.journalentry.data.PaymentDetails; +import org.mifosplatform.accounting.journalentry.data.TransactionDetailData; import org.mifosplatform.accounting.journalentry.exception.JournalEntriesNotFoundException; +import org.mifosplatform.infrastructure.codes.data.CodeValueData; import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.infrastructure.core.domain.JdbcSupport; import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.core.service.PaginationHelper; import org.mifosplatform.infrastructure.core.service.RoutingDataSource; import org.mifosplatform.portfolio.group.service.SearchParameters; +import org.mifosplatform.portfolio.note.data.NoteData; +import org.mifosplatform.portfolio.paymentdetail.data.PaymentDetailData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; @@ -37,7 +41,6 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat private final JdbcTemplate jdbcTemplate; - private final GLJournalEntryMapper journalEntryMapper = new GLJournalEntryMapper(); private final PaginationHelper paginationHelper = new PaginationHelper(); @Autowired @@ -47,34 +50,56 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat private static final class GLJournalEntryMapper implements RowMapper { + + private final JournalEntryAssociationParametersData associationParametersData ; + + public GLJournalEntryMapper(final JournalEntryAssociationParametersData associationParametersData ) { + if(associationParametersData == null){ + this.associationParametersData = new JournalEntryAssociationParametersData(); + }else{ + this.associationParametersData = associationParametersData; + } + } + public String schema() { - return " journalEntry.id as id, glAccount.classification_enum as classification ," - + "journalEntry.transaction_id," - + " glAccount.name as glAccountName, glAccount.gl_code as glAccountCode,glAccount.id as glAccountId, " - + " journalEntry.office_id as officeId, office.name as officeName, journalEntry.ref_num as referenceNumber, " - + " journalEntry.manual_entry as manualEntry,journalEntry.entry_date as transactionDate, " - + " journalEntry.type_enum as entryType,journalEntry.amount as amount, journalEntry.transaction_id as transactionId," - + " journalEntry.entity_type_enum as entityType, journalEntry.entity_id as entityId, creatingUser.id as createdByUserId, " - + " creatingUser.username as createdByUserName, journalEntry.description as comments, " - + " journalEntry.created_date as createdDate, journalEntry.reversed as reversed, " - + " journalEntry.is_running_balance_caculated as runningBalanceComputed, " - + " journalEntry.office_running_balance as officeRunningBalance, " - + " journalEntry.organization_running_balance as organizationRunningBalance, " - + " pd.receipt_number as receiptNumber, " - + " pd.check_number as checkNumber, " - + " pd.account_number as accountNumber, " - + " cdv.code_value as paymentType, " - + " pd.bank_number as bankNumber, " - + " pd.routing_code as routingCode, " - + " pd.check_number as checkNumber " - + " from acc_gl_journal_entry as journalEntry " - + " left join acc_gl_account as glAccount on glAccount.id = journalEntry.account_id" - + " left join m_office as office on office.id = journalEntry.office_id" - + " left join m_appuser as creatingUser on creatingUser.id = journalEntry.createdby_id " - + " left join m_loan_transaction as lt on journalEntry.transaction_id = lt.id " - + " left join m_payment_detail as pd on lt.payment_detail_id = pd.id " - + " left join m_code_value as cdv on cdv.id = pd.payment_type_cv_id " ; - + StringBuilder sb = new StringBuilder(); + sb.append(" journalEntry.id as id, glAccount.classification_enum as classification ,") + .append("journalEntry.transaction_id,") + .append(" glAccount.name as glAccountName, glAccount.gl_code as glAccountCode,glAccount.id as glAccountId, ") + .append(" journalEntry.office_id as officeId, office.name as officeName, journalEntry.ref_num as referenceNumber, ") + .append(" journalEntry.manual_entry as manualEntry,journalEntry.entry_date as transactionDate, ") + .append(" journalEntry.type_enum as entryType,journalEntry.amount as amount, journalEntry.transaction_id as transactionId,") + .append(" journalEntry.entity_type_enum as entityType, journalEntry.entity_id as entityId, creatingUser.id as createdByUserId, ") + .append(" creatingUser.username as createdByUserName, journalEntry.description as comments, ") + .append(" journalEntry.created_date as createdDate, journalEntry.reversed as reversed "); + if(associationParametersData.isRunningBalanceRequired()){ + sb.append(" ,journalEntry.is_running_balance_caculated as runningBalanceComputed, ") + .append(" journalEntry.office_running_balance as officeRunningBalance, ") + .append(" journalEntry.organization_running_balance as organizationRunningBalance "); + } + if(associationParametersData.isTransactionDetailsRequired()){ + sb.append(" ,pd.receipt_number as receiptNumber, ") + .append(" pd.check_number as checkNumber, ") + .append(" pd.account_number as accountNumber, ") + .append(" cdv.code_value as paymentTypeName, ") + .append(" pd.payment_type_cv_id as paymentTypeId,") + .append(" pd.bank_number as bankNumber, ") + .append(" pd.routing_code as routingCode, ") + .append(" note.id as noteId, ") + .append(" note.note as transactionNote "); + } + sb.append(" from acc_gl_journal_entry as journalEntry ") + .append(" left join acc_gl_account as glAccount on glAccount.id = journalEntry.account_id") + .append(" left join m_office as office on office.id = journalEntry.office_id") + .append(" left join m_appuser as creatingUser on creatingUser.id = journalEntry.createdby_id "); + if(associationParametersData.isTransactionDetailsRequired()){ + sb.append(" left join m_loan_transaction as lt on journalEntry.loan_transaction_id = lt.id ") + .append(" left join m_savings_account_transaction as st on journalEntry.savings_transaction_id = st.id ") + .append(" left join m_payment_detail as pd on lt.payment_detail_id = pd.id or st.payment_detail_id = pd.id") + .append(" left join m_code_value as cdv on cdv.id = pd.payment_type_cv_id ") + .append(" left join m_note as note on lt.id = note.loan_transaction_id or st.id = note.savings_account_transaction_id "); + } + return sb.toString(); } @@ -108,32 +133,57 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat final String comments = rs.getString("comments"); final Boolean reversed = rs.getBoolean("reversed"); final String referenceNumber = rs.getString("referenceNumber"); - final BigDecimal officeRunningBalance = rs.getBigDecimal("officeRunningBalance"); - final BigDecimal organizationRunningBalance = rs.getBigDecimal("organizationRunningBalance"); - final Boolean runningBalanceComputed = rs.getBoolean("runningBalanceComputed"); - - final PaymentDetails paymentDetail = new PaymentDetails( - rs.getString("accountNumber"), - rs.getString("checkNumber"), - rs.getString("receiptNumber"), - rs.getString("bankNumber"), - rs.getString("routingCode"), - rs.getString("paymentType") - ); - + BigDecimal officeRunningBalance = null; + BigDecimal organizationRunningBalance =null; + Boolean runningBalanceComputed =null; + if(associationParametersData.isRunningBalanceRequired()){ + officeRunningBalance = rs.getBigDecimal("officeRunningBalance"); + organizationRunningBalance = rs.getBigDecimal("organizationRunningBalance"); + runningBalanceComputed = rs.getBoolean("runningBalanceComputed"); + } + TransactionDetailData transactionDetailData = null; + + if(associationParametersData.isTransactionDetailsRequired()){ + PaymentDetailData paymentDetailData = null; + final Long paymentTypeId = JdbcSupport.getLong(rs, "paymentTypeId"); + if (paymentTypeId != null) { + final String typeName = rs.getString("paymentTypeName"); + final CodeValueData paymentType = CodeValueData.instance(paymentTypeId, typeName); + final String accountNumber = rs.getString("accountNumber"); + final String checkNumber = rs.getString("checkNumber"); + final String routingCode = rs.getString("routingCode"); + final String receiptNumber = rs.getString("receiptNumber"); + final String bankNumber = rs.getString("bankNumber"); + paymentDetailData = new PaymentDetailData(id, paymentType, accountNumber, checkNumber, routingCode, receiptNumber, + bankNumber); + } + NoteData noteData =null; + final Long noteId = JdbcSupport.getLong(rs, "noteId"); + if(noteId!=null){ + final String note = rs.getString("transactionNote"); + noteData = new NoteData(noteId, null, null, null, null, null, null, null, note, null, null, null, null, null, null); + } + Long transaction = null; + if(entityType!=null){ + transaction = Long.parseLong(transactionId.substring(1).trim()); + } + transactionDetailData = new TransactionDetailData(transaction, paymentDetailData, noteData); + } return new JournalEntryData(id, officeId, officeName, glAccountName, glAccountId, glCode, accountType, transactionDate, entryType, amount, transactionId, manualEntry, entityType, entityId, createdByUserId, createdDate, createdByUserName, - comments, reversed, referenceNumber,officeRunningBalance,organizationRunningBalance,runningBalanceComputed,paymentDetail); + comments, reversed, referenceNumber,officeRunningBalance,organizationRunningBalance,runningBalanceComputed,transactionDetailData); } } @Override public Page retrieveAll(final SearchParameters searchParameters, final Long glAccountId, - final Boolean onlyManualEntries, final Date fromDate, final Date toDate, final String transactionId, final Integer entityType) { + final Boolean onlyManualEntries, final Date fromDate, final Date toDate, final String transactionId, final Integer entityType, + final JournalEntryAssociationParametersData associationParametersData) { + GLJournalEntryMapper rm = new GLJournalEntryMapper(associationParametersData); final StringBuilder sqlBuilder = new StringBuilder(200); sqlBuilder.append("select SQL_CALC_FOUND_ROWS "); - sqlBuilder.append(this.journalEntryMapper.schema()); + sqlBuilder.append(rm.schema()); final Object[] objectArray = new Object[5]; int arrayPos = 0; @@ -235,14 +285,14 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat final Object[] finalObjectArray = Arrays.copyOf(objectArray, arrayPos); final String sqlCountRows = "SELECT FOUND_ROWS()"; return this.paginationHelper.fetchPage(this.jdbcTemplate, sqlCountRows, sqlBuilder.toString(), finalObjectArray, - this.journalEntryMapper); + rm); } @Override - public JournalEntryData retrieveGLJournalEntryById(final long glJournalEntryId) { + public JournalEntryData retrieveGLJournalEntryById(final long glJournalEntryId, JournalEntryAssociationParametersData associationParametersData) { try { - final GLJournalEntryMapper rm = new GLJournalEntryMapper(); + final GLJournalEntryMapper rm = new GLJournalEntryMapper(associationParametersData); final String sql = "select " + rm.schema() + " where journalEntry.id = ?"; final JournalEntryData glJournalEntryData = this.jdbcTemplate.queryForObject(sql, rm, new Object[] { glJournalEntryId }); 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 1cfd7da81..41cc38794 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 @@ -278,11 +278,13 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa if (journalEntry.isDebitEntry()) { reversalJournalEntry = JournalEntry.createNew(journalEntry.getOffice(), journalEntry.getGlAccount(), journalEntry.getCurrencyCode(), reversalTransactionId, manualEntry, journalEntry.getTransactionDate(), - JournalEntryType.CREDIT, journalEntry.getAmount(), reversalComment, null, null, journalEntry.getReferenceNumber()); + JournalEntryType.CREDIT, journalEntry.getAmount(), reversalComment, null, null, journalEntry.getReferenceNumber(), + journalEntry.getLoanTransaction(), journalEntry.getSavingsTransaction()); } else { reversalJournalEntry = JournalEntry.createNew(journalEntry.getOffice(), journalEntry.getGlAccount(), journalEntry.getCurrencyCode(), reversalTransactionId, manualEntry, journalEntry.getTransactionDate(), - JournalEntryType.DEBIT, journalEntry.getAmount(), reversalComment, null, null, journalEntry.getReferenceNumber()); + JournalEntryType.DEBIT, journalEntry.getAmount(), reversalComment, null, null, journalEntry.getReferenceNumber(), + journalEntry.getLoanTransaction(), journalEntry.getSavingsTransaction()); } // save the reversal entry this.glJournalEntryRepository.saveAndFlush(reversalJournalEntry); @@ -372,7 +374,7 @@ public class JournalEntryWritePlatformServiceJpaRepositoryImpl implements Journa this.organisationCurrencyRepository.findOneWithNotFoundDetection(currencyCode); final JournalEntry glJournalEntry = JournalEntry.createNew(office, glAccount, currencyCode, transactionId, manualEntry, - transactionDate, type, singleDebitOrCreditEntryCommand.getAmount(), comments, null, null, referenceNumber); + transactionDate, type, singleDebitOrCreditEntryCommand.getAmount(), comments, null, null, referenceNumber, null, null); this.glJournalEntryRepository.saveAndFlush(glJournalEntry); } }