From d94dd4ac803d9dd3f2b620615303fa25f9cd6641 Mon Sep 17 00:00:00 2001 From: Ippez Robert Date: Fri, 2 Jun 2017 15:10:45 +0300 Subject: [PATCH 1/2] (FINERACT-241) Include "Add Note" to Deposit and Withdrawal screen --- .../savings/SavingsApiConstants.java | 6 ++--- ...avingsAccountTransactionDataValidator.java | 4 ++++ ...WritePlatformServiceJpaRepositoryImpl.java | 24 ++++++++++++++++++- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsApiConstants.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsApiConstants.java index 6efa899324e..6a76d33980f 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsApiConstants.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/SavingsApiConstants.java @@ -242,11 +242,11 @@ public class SavingsApiConstants { public static final Set SAVINGS_ACCOUNT_TRANSACTION_REQUEST_DATA_PARAMETERS = new HashSet<>(Arrays.asList(localeParamName, dateFormatParamName, transactionDateParamName, transactionAmountParamName, paymentTypeIdParamName, - transactionAccountNumberParamName, checkNumberParamName, routingCodeParamName, receiptNumberParamName, bankNumberParamName)); + transactionAccountNumberParamName, checkNumberParamName, routingCodeParamName, receiptNumberParamName, bankNumberParamName,noteParamName)); public static final Set SAVINGS_TRANSACTION_RESPONSE_DATA_PARAMETERS = new HashSet<>( Arrays.asList(idParamName, "accountId", accountNoParamName, "currency", "amount", dateParamName, paymentDetailDataParamName, - runningBalanceParamName, reversedParamName)); + runningBalanceParamName, reversedParamName,noteParamName)); public static final Set SAVINGS_ACCOUNT_TRANSACTION_RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList(idParamName, accountNoParamName)); @@ -274,4 +274,4 @@ public class SavingsApiConstants { public static final Set SAVINGS_ACCOUNT_ON_HOLD_RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList(idParamName, amountParamName, onHoldTransactionTypeParamName, onHoldTransactionDateParamName, onHoldReversedParamName)); -} \ No newline at end of file +} diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionDataValidator.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionDataValidator.java index ca855b69054..b998f322bc0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionDataValidator.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionDataValidator.java @@ -29,6 +29,7 @@ import static org.apache.fineract.portfolio.savings.SavingsApiConstants.transactionAmountParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.transactionDateParamName; import static org.apache.fineract.portfolio.savings.SavingsApiConstants.withdrawBalanceParamName; +import static org.apache.fineract.portfolio.savings.SavingsApiConstants.noteParamName; import java.lang.reflect.Type; import java.math.BigDecimal; @@ -85,6 +86,9 @@ public void validate(final JsonCommand command) { final BigDecimal transactionAmount = this.fromApiJsonHelper.extractBigDecimalWithLocaleNamed(transactionAmountParamName, element); baseDataValidator.reset().parameter(transactionAmountParamName).value(transactionAmount).notNull().positiveAmount(); + + final String note = this.fromApiJsonHelper.extractStringNamed(noteParamName, element); + baseDataValidator.reset().parameter(noteParamName).value(note).notNull().notExceedingLengthOf(1000); validatePaymentTypeDetails(baseDataValidator, element); diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java index 2064f57eea2..5c36140c307 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountWritePlatformServiceJpaRepositoryImpl.java @@ -254,7 +254,18 @@ public CommandProcessingResult deposit(final Long savingsId, final JsonCommand c boolean isRegularTransaction = true; final SavingsAccountTransaction deposit = this.savingsAccountDomainService.handleDeposit(account, fmt, transactionDate, transactionAmount, paymentDetail, isAccountTransfer, isRegularTransaction); - + + /** + * This is not the best solution because it should confirm the transaction first and then store the note based on the boolean + * returned from the TRANSACTIONSERVICES + */ + + final String noteText = command.stringValueOfParameterNamed("note"); + if (StringUtils.isNotBlank(noteText)) { + final Note note = Note.savingNote(account, noteText); + this.noteRepository.save(note); + } + return new CommandProcessingResultBuilder() // .withEntityId(deposit.getId()) // .withOfficeId(account.officeId()) // @@ -298,6 +309,17 @@ public CommandProcessingResult withdrawal(final Long savingsId, final JsonComman final SavingsAccountTransaction withdrawal = this.savingsAccountDomainService.handleWithdrawal(account, fmt, transactionDate, transactionAmount, paymentDetail, transactionBooleanValues); + /** + * This is not the best solution because it should confirm the transaction first and then store the note based on the boolean + * returned from the TRANSACTIONSERVICES + */ + + final String noteText = command.stringValueOfParameterNamed("note"); + if (StringUtils.isNotBlank(noteText)) { + final Note note = Note.savingNote(account, noteText); + this.noteRepository.save(note); + } + return new CommandProcessingResultBuilder() // .withEntityId(withdrawal.getId()) // .withOfficeId(account.officeId()) // From d21ba5c4149a3e54c0b4bbc23b55ecefc7d74d39 Mon Sep 17 00:00:00 2001 From: Ippez Robert Date: Sat, 10 Jun 2017 08:18:53 +0300 Subject: [PATCH 2/2] FINERACT-241 --- .../data/SavingsAccountTransactionData.java | 26 ++++++++++++------- ...DepositAccountReadPlatformServiceImpl.java | 16 ++++++++++-- ...SavingsAccountReadPlatformServiceImpl.java | 14 ++++++++-- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionData.java index bf066ed8320..de086e5adc9 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionData.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionData.java @@ -51,6 +51,8 @@ public class SavingsAccountTransactionData { private final AccountTransferData transfer; private final LocalDate submittedOnDate; private final boolean interestedPostedAsOn; + private final String submittedByUsername; + private final String note; // templates final Collection paymentTypeOptions; @@ -58,21 +60,21 @@ public class SavingsAccountTransactionData { public static SavingsAccountTransactionData create(final Long id, final SavingsAccountTransactionEnumData transactionType, final PaymentDetailData paymentDetailData, final Long savingsId, final String savingsAccountNo, final LocalDate date, final CurrencyData currency, final BigDecimal amount, final BigDecimal outstandingChargeAmount,final BigDecimal runningBalance, final boolean reversed, - final AccountTransferData transfer, final boolean interestedPostedAsOn) { + final AccountTransferData transfer, final boolean interestedPostedAsOn, final String submittedByUsername, final String note) { final Collection paymentTypeOptions = null; return new SavingsAccountTransactionData(id, transactionType, paymentDetailData, savingsId, savingsAccountNo, date, currency, - amount, outstandingChargeAmount,runningBalance, reversed, transfer, paymentTypeOptions, interestedPostedAsOn); + amount, outstandingChargeAmount,runningBalance, reversed, transfer, paymentTypeOptions, interestedPostedAsOn, submittedByUsername, note); } public static SavingsAccountTransactionData create(final Long id, final SavingsAccountTransactionEnumData transactionType, final PaymentDetailData paymentDetailData, final Long savingsId, final String savingsAccountNo, final LocalDate date, final CurrencyData currency, final BigDecimal amount, final BigDecimal outstandingChargeAmount, final BigDecimal runningBalance, final boolean reversed, final AccountTransferData transfer, final LocalDate submittedOnDate, - final boolean interestedPostedAsOn) { + final boolean interestedPostedAsOn, final String submittedByUsername, final String note) { final Collection paymentTypeOptions = null; return new SavingsAccountTransactionData(id, transactionType, paymentDetailData, savingsId, savingsAccountNo, date, currency, amount, outstandingChargeAmount, runningBalance, reversed, transfer, paymentTypeOptions, submittedOnDate, - interestedPostedAsOn); + interestedPostedAsOn, submittedByUsername, note); } public static SavingsAccountTransactionData template(final Long savingsId, final String savingsAccountNo, @@ -86,8 +88,10 @@ public static SavingsAccountTransactionData template(final Long savingsId, final final PaymentDetailData paymentDetailData = null; final Collection paymentTypeOptions = null; final boolean interestedPostedAsOn = false; + final String submittedByUsername = null; + final String note = null; return new SavingsAccountTransactionData(id, transactionType, paymentDetailData, savingsId, savingsAccountNo, defaultLocalDate, - currency, amount, outstandingChargeAmount, runningBalance, reversed, null, null, interestedPostedAsOn); + currency, amount, outstandingChargeAmount, runningBalance, reversed, null, null, interestedPostedAsOn, submittedByUsername, note); } public static SavingsAccountTransactionData templateOnTop(final SavingsAccountTransactionData savingsAccountTransactionData, @@ -96,24 +100,24 @@ public static SavingsAccountTransactionData templateOnTop(final SavingsAccountTr savingsAccountTransactionData.paymentDetailData, savingsAccountTransactionData.accountId, savingsAccountTransactionData.accountNo, savingsAccountTransactionData.date, savingsAccountTransactionData.currency, savingsAccountTransactionData.amount,savingsAccountTransactionData.outstandingChargeAmount, savingsAccountTransactionData.runningBalance, savingsAccountTransactionData.reversed, - savingsAccountTransactionData.transfer, paymentTypeOptions, savingsAccountTransactionData.interestedPostedAsOn); + savingsAccountTransactionData.transfer, paymentTypeOptions, savingsAccountTransactionData.interestedPostedAsOn, savingsAccountTransactionData.submittedByUsername, savingsAccountTransactionData.note); } private SavingsAccountTransactionData(final Long id, final SavingsAccountTransactionEnumData transactionType, final PaymentDetailData paymentDetailData, final Long savingsId, final String savingsAccountNo, final LocalDate date, final CurrencyData currency, final BigDecimal amount, final BigDecimal outstandingChargeAmount, final BigDecimal runningBalance, final boolean reversed, final AccountTransferData transfer, - final Collection paymentTypeOptions, final boolean interestedPostedAsOn) { + final Collection paymentTypeOptions, final boolean interestedPostedAsOn, final String submittedByUsername, final String note) { this(id, transactionType, paymentDetailData, savingsId, savingsAccountNo, date, currency, amount, outstandingChargeAmount, - runningBalance, reversed, transfer, paymentTypeOptions, null, interestedPostedAsOn); + runningBalance, reversed, transfer, paymentTypeOptions, null, interestedPostedAsOn, submittedByUsername, note); } private SavingsAccountTransactionData(final Long id, final SavingsAccountTransactionEnumData transactionType, final PaymentDetailData paymentDetailData, final Long savingsId, final String savingsAccountNo, final LocalDate date, final CurrencyData currency, final BigDecimal amount,final BigDecimal outstandingChargeAmount, final BigDecimal runningBalance, final boolean reversed, final AccountTransferData transfer, final Collection paymentTypeOptions, final LocalDate submittedOnDate, - final boolean interestedPostedAsOn) { + final boolean interestedPostedAsOn, final String submittedByUsername, final String note) { this.id = id; this.transactionType = transactionType; this.paymentDetailData = paymentDetailData; @@ -129,6 +133,8 @@ private SavingsAccountTransactionData(final Long id, final SavingsAccountTransac this.paymentTypeOptions = paymentTypeOptions; this.submittedOnDate = submittedOnDate; this.interestedPostedAsOn = interestedPostedAsOn; + this.submittedByUsername = submittedByUsername; + this.note = note; } public static SavingsAccountTransactionData withWithDrawalTransactionDetails( @@ -144,6 +150,6 @@ public static SavingsAccountTransactionData withWithDrawalTransactionDetails( savingsAccountTransactionData.amount, savingsAccountTransactionData.outstandingChargeAmount, savingsAccountTransactionData.runningBalance, savingsAccountTransactionData.reversed, savingsAccountTransactionData.transfer, savingsAccountTransactionData.paymentTypeOptions, - savingsAccountTransactionData.interestedPostedAsOn); + savingsAccountTransactionData.interestedPostedAsOn, savingsAccountTransactionData.submittedByUsername, savingsAccountTransactionData.note); } } \ No newline at end of file diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java index 3df1138c0c8..6937d7133ad 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/DepositAccountReadPlatformServiceImpl.java @@ -967,6 +967,8 @@ public SavingsAccountTransactionsMapper() { sqlBuilder.append("totran.transaction_date as toTransferDate, totran.amount as toTransferAmount,"); sqlBuilder.append("totran.description as toTransferDescription,"); sqlBuilder.append("sa.id as savingsId, sa.account_no as accountNo,"); + sqlBuilder.append("au.username as submittedByUsername,"); + sqlBuilder.append("mn.note as note,"); sqlBuilder.append("pd.payment_type_id as paymentType,pd.account_number as accountNumber,pd.check_number as checkNumber, "); sqlBuilder.append("pd.receipt_number as receiptNumber, pd.bank_number as bankNumber,pd.routing_code as routingCode, "); sqlBuilder @@ -981,6 +983,12 @@ public SavingsAccountTransactionsMapper() { sqlBuilder.append("left join m_account_transfer_transaction totran on totran.to_savings_transaction_id = tr.id "); sqlBuilder.append("left join m_payment_detail pd on tr.payment_detail_id = pd.id "); sqlBuilder.append("left join m_payment_type pt on pd.payment_type_id = pt.id "); + sqlBuilder.append("left join m_appuser au on au.id=tr.appuser_id "); + sqlBuilder.append("left join m_note mn on mn.savings_account_id=sa.id "); + sqlBuilder.append("left join ("); + sqlBuilder.append("select mn.savings_account_id id, mn.note Note"); + sqlBuilder.append(" from m_note mn "); + sqlBuilder.append(") comments ON comments.id=tr.savings_account_id "); this.schemaSql = sqlBuilder.toString(); } @@ -1050,8 +1058,10 @@ public SavingsAccountTransactionData mapRow(final ResultSet rs, @SuppressWarning toTransferDescription, toTransferReversed); } final boolean postInterestAsOn = false; + final String submittedByUsername = rs.getString("submittedByUsername"); + final String note = rs.getString("note"); return SavingsAccountTransactionData.create(id, transactionType, paymentDetailData, savingsId, accountNo, date, currency, - amount, outstandingChargeAmount, runningBalance, reversed, transfer, postInterestAsOn); + amount, outstandingChargeAmount, runningBalance, reversed, transfer, postInterestAsOn, submittedByUsername, note); } } @@ -1446,8 +1456,10 @@ public SavingsAccountTransactionData mapRow(final ResultSet rs, @SuppressWarning final AccountTransferData transfer = null; final BigDecimal runningBalance = JdbcSupport.getBigDecimalDefaultToNullIfZero(rs, "runningBalance"); final boolean postInterestAsOn = false; + final String submittedByUsername = rs.getString("submittedByUsername"); + final String note = rs.getString("note"); return SavingsAccountTransactionData.create(savingsId, transactionType, paymentDetailData, savingsId, accountNo, duedate, - currency, dueamount, outstandingChargeAmount, runningBalance, false, transfer, postInterestAsOn); + currency, dueamount, outstandingChargeAmount, runningBalance, false, transfer, postInterestAsOn, submittedByUsername, note); } } diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java index 16e0c19291e..729b0dbf29e 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/service/SavingsAccountReadPlatformServiceImpl.java @@ -775,6 +775,8 @@ public SavingsAccountTransactionsMapper() { sqlBuilder.append("totran.id as toTransferId, totran.is_reversed as toTransferReversed,"); sqlBuilder.append("totran.transaction_date as toTransferDate, totran.amount as toTransferAmount,"); sqlBuilder.append("totran.description as toTransferDescription,"); + sqlBuilder.append("au.username as submittedByUsername,"); + sqlBuilder.append("mn.note as note,"); sqlBuilder.append("sa.id as savingsId, sa.account_no as accountNo,"); sqlBuilder.append("pd.payment_type_id as paymentType,pd.account_number as accountNumber,pd.check_number as checkNumber, "); sqlBuilder.append("pd.receipt_number as receiptNumber, pd.bank_number as bankNumber,pd.routing_code as routingCode, "); @@ -791,7 +793,13 @@ public SavingsAccountTransactionsMapper() { sqlBuilder.append("left join m_account_transfer_transaction totran on totran.to_savings_transaction_id = tr.id "); sqlBuilder.append("left join m_payment_detail pd on tr.payment_detail_id = pd.id "); sqlBuilder.append("left join m_payment_type pt on pd.payment_type_id = pt.id "); - + sqlBuilder.append("left join m_appuser au on au.id=tr.appuser_id "); + sqlBuilder.append("left join m_note mn on mn.savings_account_id=sa.id "); + sqlBuilder.append("left join ("); + sqlBuilder.append("select mn.savings_account_id id, mn.note Note"); + sqlBuilder.append(" from m_note mn "); + sqlBuilder.append(") comments ON comments.id=tr.savings_account_id "); + this.schemaSql = sqlBuilder.toString(); } @@ -815,6 +823,8 @@ public SavingsAccountTransactionData mapRow(final ResultSet rs, @SuppressWarning final Long savingsId = rs.getLong("savingsId"); final String accountNo = rs.getString("accountNo"); final boolean postInterestAsOn = rs.getBoolean("postInterestAsOn"); + final String submittedByUsername = rs.getString("submittedByUsername"); + final String note = rs.getString("note"); PaymentDetailData paymentDetailData = null; if (transactionType.isDepositOrWithdrawal()) { @@ -865,7 +875,7 @@ public SavingsAccountTransactionData mapRow(final ResultSet rs, @SuppressWarning } return SavingsAccountTransactionData.create(id, transactionType, paymentDetailData, savingsId, accountNo, date, currency, - amount, outstandingChargeAmount, runningBalance, reversed, transfer, submittedOnDate, postInterestAsOn); + amount, outstandingChargeAmount, runningBalance, reversed, transfer, submittedOnDate, postInterestAsOn, submittedByUsername, note); } }