diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/common/AccountingConstants.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/common/AccountingConstants.java index 5fd67ea13..84112b33e 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/common/AccountingConstants.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/common/AccountingConstants.java @@ -221,7 +221,9 @@ public class AccountingConstants { } public static enum FINANCIAL_ACTIVITY { - ASSET_TRANSFER(100, "assetTransfer", GLAccountType.ASSET), LIABILITY_TRANSFER(200, "liabilityTransfer", GLAccountType.LIABILITY); + ASSET_TRANSFER(100, "assetTransfer", GLAccountType.ASSET), LIABILITY_TRANSFER(200, "liabilityTransfer", GLAccountType.LIABILITY), + CASH_AT_MAINVAULT (300, "cashAtMainVault", GLAccountType.ASSET), + CASH_AT_TELLER (400, "cashAtTeller", GLAccountType.ASSET); private final Integer value; private final String code; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/financialactivityaccount/serialization/FinancialActivityAccountDataValidator.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/financialactivityaccount/serialization/FinancialActivityAccountDataValidator.java index 94fe95f3e..4433a3895 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/financialactivityaccount/serialization/FinancialActivityAccountDataValidator.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/financialactivityaccount/serialization/FinancialActivityAccountDataValidator.java @@ -53,7 +53,8 @@ public final class FinancialActivityAccountDataValidator { final Integer financialActivityId = this.fromApiJsonHelper.extractIntegerSansLocaleNamed(paramNameForFinancialActivity, element); baseDataValidator.reset().parameter(paramNameForFinancialActivity).value(financialActivityId).notNull() - .isOneOfTheseValues(FINANCIAL_ACTIVITY.ASSET_TRANSFER.getValue(), FINANCIAL_ACTIVITY.LIABILITY_TRANSFER.getValue()); + .isOneOfTheseValues(FINANCIAL_ACTIVITY.ASSET_TRANSFER.getValue(), FINANCIAL_ACTIVITY.LIABILITY_TRANSFER.getValue(), + FINANCIAL_ACTIVITY.CASH_AT_MAINVAULT.getValue(), FINANCIAL_ACTIVITY.CASH_AT_TELLER.getValue()); final Long glAccountId = this.fromApiJsonHelper.extractLongNamed(paramNameForGLAccount, element); baseDataValidator.reset().parameter(paramNameForGLAccount).value(glAccountId).notNull().integerGreaterThanZero(); diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/teller/domain/CashierTransaction.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/teller/domain/CashierTransaction.java index 2cd8e2687..ba43847c3 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/teller/domain/CashierTransaction.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/teller/domain/CashierTransaction.java @@ -239,6 +239,10 @@ public class CashierTransaction extends AbstractPersistable { public String getTxnNote() { return txnNote; } + + public BigDecimal getTxnAmount() { + return txnAmount; + } public void setTxnNote (String txnNote) { this.txnNote = txnNote; diff --git a/mifosng-provider/src/main/java/org/mifosplatform/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java index b3fc71096..8e413f1ac 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/organisation/teller/service/TellerWritePlatformServiceJpaImpl.java @@ -2,6 +2,13 @@ package org.mifosplatform.organisation.teller.service; import java.util.Map; +import org.mifosplatform.accounting.common.AccountingConstants.FINANCIAL_ACTIVITY; +import org.mifosplatform.accounting.financialactivityaccount.domain.FinancialActivityAccount; +import org.mifosplatform.accounting.financialactivityaccount.domain.FinancialActivityAccountRepositoryWrapper; +import org.mifosplatform.accounting.glaccount.domain.GLAccount; +import org.mifosplatform.accounting.journalentry.domain.JournalEntry; +import org.mifosplatform.accounting.journalentry.domain.JournalEntryType; +import org.mifosplatform.accounting.journalentry.domain.JournalEntryRepository; import org.mifosplatform.infrastructure.core.api.JsonCommand; import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; import org.mifosplatform.infrastructure.core.data.CommandProcessingResultBuilder; @@ -44,13 +51,19 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer private final StaffRepository staffRepository; private final CashierRepository cashierRepository; private final CashierTransactionRepository cashierTxnRepository; + private final JournalEntryRepository glJournalEntryRepository; + private final FinancialActivityAccountRepositoryWrapper financialActivityAccountRepositoryWrapper; + @Autowired public TellerWritePlatformServiceJpaImpl (final PlatformSecurityContext context, final TellerCommandFromApiJsonDeserializer fromApiJsonDeserializer, final TellerRepository tellerRepository, final OfficeRepository officeRepository, final StaffRepository staffRepository, CashierRepository cashierRepository, - CashierTransactionRepository cashierTxnRepository) { + CashierTransactionRepository cashierTxnRepository, + JournalEntryRepository glJournalEntryRepository, + FinancialActivityAccountRepositoryWrapper financialActivityAccountRepositoryWrapper + ) { this.context = context; this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.tellerRepository = tellerRepository; @@ -58,6 +71,8 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer this.staffRepository = staffRepository; this.cashierRepository = cashierRepository; this.cashierTxnRepository = cashierTxnRepository; + this.glJournalEntryRepository = glJournalEntryRepository; + this.financialActivityAccountRepositoryWrapper = financialActivityAccountRepositoryWrapper; } @@ -65,7 +80,7 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer @Transactional public CommandProcessingResult createTeller(JsonCommand command) { try { - final AppUser currentUser = this.context.authenticatedUser(); + this.context.authenticatedUser(); final Long officeId = command.longValueOfParameterNamed("officeId"); @@ -176,7 +191,7 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer @Override public CommandProcessingResult allocateCashierToTeller(final Long tellerId, JsonCommand command) { try { - final AppUser currentUser = this.context.authenticatedUser(); + this.context.authenticatedUser(); // final Office parent = validateUserPriviledgeOnOfficeAndRetrieve(currentUser, officeId); final Teller teller = this.tellerRepository.findOne(tellerId); @@ -194,7 +209,6 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer final Cashier cashier = Cashier.fromJson(tellerOffice, teller, staff, command); - // pre save to generate id for use in office hierarchy this.cashierRepository.save(cashier); return new CommandProcessingResultBuilder() // @@ -327,8 +341,50 @@ public class TellerWritePlatformServiceJpaImpl implements TellerWritePlatformSer final CashierTransaction cashierTxn = CashierTransaction.fromJson(cashier, command); cashierTxn.setTxnType(txnType.getId()); - // pre save to generate id for use in office hierarchy this.cashierTxnRepository.save(cashierTxn); + + // Pass the journal entries + FinancialActivityAccount mainVaultFinancialActivityAccount = this.financialActivityAccountRepositoryWrapper. + findByFinancialActivityTypeWithNotFoundDetection( + FINANCIAL_ACTIVITY.CASH_AT_MAINVAULT.getValue()); + FinancialActivityAccount tellerCashFinancialActivityAccount = this.financialActivityAccountRepositoryWrapper. + findByFinancialActivityTypeWithNotFoundDetection( + FINANCIAL_ACTIVITY.CASH_AT_TELLER.getValue()); + GLAccount creditAccount = null; + GLAccount debitAccount = null; + if (txnType.equals(CashierTxnType.ALLOCATE) ) { + debitAccount = tellerCashFinancialActivityAccount.getGlAccount(); + creditAccount = mainVaultFinancialActivityAccount.getGlAccount(); + } else if (txnType.equals(CashierTxnType.SETTLE) ) { + debitAccount = mainVaultFinancialActivityAccount.getGlAccount(); + creditAccount = tellerCashFinancialActivityAccount.getGlAccount(); + } + + final Office cashierOffice = cashier.getTeller().getOffice(); + + final Long time = System.currentTimeMillis(); + final String uniqueVal = String.valueOf(time) + currentUser.getId() + cashierOffice.getId(); + final String transactionId = Long.toHexString(Long.parseLong(uniqueVal)); + + final JournalEntry debitJournalEntry = JournalEntry.createNew( + cashierOffice, null, // payment detail + debitAccount, "USD", // FIXME: Take currency code from the transaction + transactionId, false, // manual entry + cashierTxn.getTxnDate(), JournalEntryType.DEBIT, cashierTxn.getTxnAmount(), + cashierTxn.getTxnNote(), // Description + null, null, null, // entity Type, entityId, reference number + null, null); // Loan and Savings Txn + final JournalEntry creditJournalEntry = JournalEntry.createNew( + cashierOffice, null, // payment detail + creditAccount, "USD", // FIXME: Take currency code from the transaction + transactionId, false, // manual entry + cashierTxn.getTxnDate(), JournalEntryType.CREDIT, cashierTxn.getTxnAmount(), + cashierTxn.getTxnNote(), // Description + null, null, null, // entity Type, entityId, reference number + null, null); // Loan and Savings Txn + + this.glJournalEntryRepository.saveAndFlush(debitJournalEntry); + this.glJournalEntryRepository.saveAndFlush(creditJournalEntry); return new CommandProcessingResultBuilder() // .withCommandId(command.commandId()) //