linking payment details to journal entries
This commit is contained in:
+29
-26
@@ -19516,6 +19516,13 @@ No Request Body:
|
||||
<td class=fielddesc>Describes whether account balances computed for the journal entry.
|
||||
</td>
|
||||
</tr>
|
||||
<tr class=alt>
|
||||
<td>transactionDetails</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class=fielddesc>Additional details of transaction like payment details and notes .
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
@@ -19589,6 +19596,20 @@ No Request Body:
|
||||
<dt>transactionId</dt>
|
||||
<dd>
|
||||
String <span>optional</span>
|
||||
</dd>
|
||||
<dt>transactionDetails</dt>
|
||||
<dd>
|
||||
Boolean <span>optional</span>
|
||||
</dd>
|
||||
<dd>Flag determines if additional transactional details
|
||||
to be returned(like payment details and notes).
|
||||
</dd>
|
||||
<dt>runningBalance</dt>
|
||||
<dd>
|
||||
Boolean <span>optional</span>
|
||||
</dd>
|
||||
<dd>Flag determines whether running balances
|
||||
to be returned
|
||||
</dd>
|
||||
</dl>
|
||||
<p>Example Requests:</p>
|
||||
@@ -19603,6 +19624,10 @@ No Request Body:
|
||||
<div class=apiClick>journalentries?offset=10&limit=50</div>
|
||||
<br>
|
||||
<div class=apiClick>journalentries?orderBy=transactionId,sortOrder=DESC</div>
|
||||
<br>
|
||||
<div class=apiClick>journalentries?runningBalance=true</div>
|
||||
<br>
|
||||
<div class=apiClick>journalentries?transactionDetails=true</div>
|
||||
</div>
|
||||
<div class="method-example">
|
||||
<code class="method-declaration">
|
||||
@@ -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:
|
||||
<br>
|
||||
<br>
|
||||
<div class=apiClick>journalentries/1?fields=officeName,glAccountId,entryType,amount</div>
|
||||
<br>
|
||||
<div class=apiClick>journalentries/1?runningBalance=true</div>
|
||||
<br>
|
||||
<div class=apiClick>journalentries/1?transactionDetails=true</div>
|
||||
</div>
|
||||
<div class="method-example">
|
||||
<code class="method-declaration">
|
||||
@@ -19994,10 +20001,6 @@ GET https://DomainName/api/v1/journalentries/{entryId}
|
||||
],
|
||||
"createdByUserName": "mifos",
|
||||
"reversed": false,
|
||||
"officeRunningBalance":0,
|
||||
"organizationRunningBalance":0
|
||||
"runningBalanceComputed":false
|
||||
|
||||
}
|
||||
</code>
|
||||
</div>
|
||||
|
||||
+10
@@ -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;
|
||||
|
||||
+9
-4
@@ -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<JournalEntryData> 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);
|
||||
|
||||
+29
@@ -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;
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -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() {
|
||||
|
||||
-27
@@ -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;
|
||||
}
|
||||
}
|
||||
+22
@@ -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;
|
||||
}
|
||||
}
|
||||
+27
-4
@@ -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<AppUser, Long> {
|
||||
@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<AppUser, Long> {
|
||||
|
||||
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<AppUser, Long> {
|
||||
|
||||
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<AppUser, Long> {
|
||||
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<AppUser, Long> {
|
||||
return this.currencyCode;
|
||||
}
|
||||
|
||||
|
||||
public LoanTransaction getLoanTransaction() {
|
||||
return this.loanTransaction;
|
||||
}
|
||||
|
||||
|
||||
public SavingsAccountTransaction getSavingsTransaction() {
|
||||
return this.savingsTransaction;
|
||||
}
|
||||
|
||||
}
|
||||
+65
-9
@@ -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<String, Object> 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);
|
||||
}
|
||||
|
||||
|
||||
+4
-3
@@ -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<JournalEntryData> retrieveAll(SearchParameters searchParameters, Long glAccountId, Boolean onlyManualEntries, Date fromDate,
|
||||
Date toDate, String transactionId, Integer entityType);
|
||||
Date toDate, String transactionId, Integer entityType, JournalEntryAssociationParametersData associationParametersData);
|
||||
|
||||
}
|
||||
|
||||
+98
-48
@@ -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<JournalEntryData> paginationHelper = new PaginationHelper<JournalEntryData>();
|
||||
|
||||
@Autowired
|
||||
@@ -47,34 +50,56 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat
|
||||
|
||||
private static final class GLJournalEntryMapper implements RowMapper<JournalEntryData> {
|
||||
|
||||
|
||||
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<JournalEntryData> 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 });
|
||||
|
||||
+5
-3
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user