Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ public class TaxGroupComponent implements Serializable {
@Serial
private static final long serialVersionUID = 1L;

private Long id;
private Long taxComponentId;
private String startDate;
private String endDate;

}
Original file line number Diff line number Diff line change
Expand Up @@ -814,6 +814,16 @@ public void createCashBasedJournalEntriesAndReversalsForSavingsCharges(final Off
final Long savingsProductId, final Long paymentTypeId, final Long loanId, final String transactionId,
final LocalDate transactionDate, final BigDecimal totalAmount, final Boolean isReversal,
final List<ChargePaymentDTO> chargePaymentDTOs) {
createCashBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode, accountTypeToBeDebited, accountTypeToBeCredited,
savingsProductId, paymentTypeId, loanId, transactionId, transactionDate, totalAmount, isReversal, chargePaymentDTOs,
List.of());
}

public void createCashBasedJournalEntriesAndReversalsForSavingsCharges(final Office office, final String currencyCode,
final CashAccountsForSavings accountTypeToBeDebited, CashAccountsForSavings accountTypeToBeCredited,
final Long savingsProductId, final Long paymentTypeId, final Long loanId, final String transactionId,
final LocalDate transactionDate, final BigDecimal totalAmount, final Boolean isReversal,
final List<ChargePaymentDTO> chargePaymentDTOs, final List<TaxPaymentDTO> taxPayments) {
// TODO Vishwas: Remove this validation, as and when appropriate Junit
// tests are written for accounting
/**
Expand All @@ -831,16 +841,42 @@ public void createCashBasedJournalEntriesAndReversalsForSavingsCharges(final Off

final GLAccount savingsControlAccount = getLinkedGLAccountForSavingsProduct(savingsProductId, accountTypeToBeDebited.getValue(),
paymentTypeId);

// Compute total tax to separate the net charge from the VAT
final BigDecimal totalTax = taxPayments.stream().map(TaxPaymentDTO::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO,
BigDecimal::add);
final BigDecimal netChargeAmount = totalAmount.subtract(totalTax);

if (isReversal) {
// Debit income GL with net charge amount
createDebitJournalEntryForSavings(office, currencyCode, chargeSpecificAccount, loanId, transactionId, transactionDate,
totalAmount);
netChargeAmount);
// Debit VAT payable GL for each tax component
for (TaxPaymentDTO taxPayment : taxPayments) {
if (taxPayment.getAmount() != null && taxPayment.getCreditAccountId() != null) {
final GLAccount vatPayableAccount = getGLAccountById(taxPayment.getCreditAccountId());
createDebitJournalEntryForSavings(office, currencyCode, vatPayableAccount, loanId, transactionId, transactionDate,
taxPayment.getAmount());
}
}
// Credit savings control with full amount
createCreditJournalEntryForSavings(office, currencyCode, savingsControlAccount, loanId, transactionId, transactionDate,
totalAmount);
} else {
// Debit savings control with full amount
createDebitJournalEntryForSavings(office, currencyCode, savingsControlAccount, loanId, transactionId, transactionDate,
totalAmount);
// Credit income GL with net charge amount
createCreditJournalEntryForSavings(office, currencyCode, chargeSpecificAccount, loanId, transactionId, transactionDate,
totalAmount);
netChargeAmount);
// Credit VAT payable GL for each tax component
for (TaxPaymentDTO taxPayment : taxPayments) {
if (taxPayment.getAmount() != null && taxPayment.getCreditAccountId() != null) {
final GLAccount vatPayableAccount = getGLAccountById(taxPayment.getCreditAccountId());
createCreditJournalEntryForSavings(office, currencyCode, vatPayableAccount, loanId, transactionId, transactionDate,
taxPayment.getAmount());
}
}
}
}

Expand All @@ -849,6 +885,17 @@ public void createAccrualBasedJournalEntriesAndReversalsForSavingsCharges(final
final AccountingConstants.AccrualAccountsForSavings accountTypeToBeCredited, final Long savingsProductId,
final Long paymentTypeId, final Long loanId, final String transactionId, final LocalDate transactionDate,
final BigDecimal totalAmount, final Boolean isReversal, final List<ChargePaymentDTO> chargePaymentDTOs) {
createAccrualBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode, accountTypeToBeDebited, accountTypeToBeCredited,
savingsProductId, paymentTypeId, loanId, transactionId, transactionDate, totalAmount, isReversal, chargePaymentDTOs,
List.of());
}

public void createAccrualBasedJournalEntriesAndReversalsForSavingsCharges(final Office office, final String currencyCode,
final AccountingConstants.AccrualAccountsForSavings accountTypeToBeDebited,
final AccountingConstants.AccrualAccountsForSavings accountTypeToBeCredited, final Long savingsProductId,
final Long paymentTypeId, final Long loanId, final String transactionId, final LocalDate transactionDate,
final BigDecimal totalAmount, final Boolean isReversal, final List<ChargePaymentDTO> chargePaymentDTOs,
final List<TaxPaymentDTO> taxPayments) {
// TODO Vishwas: Remove this validation, as and when appropriate Junit
// tests are written for accounting
/**
Expand All @@ -866,16 +913,42 @@ public void createAccrualBasedJournalEntriesAndReversalsForSavingsCharges(final

final GLAccount savingsControlAccount = getLinkedGLAccountForSavingsProduct(savingsProductId, accountTypeToBeDebited.getValue(),
paymentTypeId);

// Compute total tax to separate the net charge from the VAT
final BigDecimal totalTax = taxPayments.stream().map(TaxPaymentDTO::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO,
BigDecimal::add);
final BigDecimal netChargeAmount = totalAmount.subtract(totalTax);

if (isReversal) {
// Debit income GL with net charge amount
createDebitJournalEntryForSavings(office, currencyCode, chargeSpecificAccount, loanId, transactionId, transactionDate,
totalAmount);
netChargeAmount);
// Debit VAT payable GL for each tax component
for (TaxPaymentDTO taxPayment : taxPayments) {
if (taxPayment.getAmount() != null && taxPayment.getCreditAccountId() != null) {
final GLAccount vatPayableAccount = getGLAccountById(taxPayment.getCreditAccountId());
createDebitJournalEntryForSavings(office, currencyCode, vatPayableAccount, loanId, transactionId, transactionDate,
taxPayment.getAmount());
}
}
// Credit savings control with full amount
createCreditJournalEntryForSavings(office, currencyCode, savingsControlAccount, loanId, transactionId, transactionDate,
totalAmount);
} else {
// Debit savings control with full amount
createDebitJournalEntryForSavings(office, currencyCode, savingsControlAccount, loanId, transactionId, transactionDate,
totalAmount);
// Credit income GL with net charge amount
createCreditJournalEntryForSavings(office, currencyCode, chargeSpecificAccount, loanId, transactionId, transactionDate,
totalAmount);
netChargeAmount);
// Credit VAT payable GL for each tax component
for (TaxPaymentDTO taxPayment : taxPayments) {
if (taxPayment.getAmount() != null && taxPayment.getCreditAccountId() != null) {
final GLAccount vatPayableAccount = getGLAccountById(taxPayment.getCreditAccountId());
createCreditJournalEntryForSavings(office, currencyCode, vatPayableAccount, loanId, transactionId, transactionDate,
taxPayment.getAmount());
}
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,23 +216,23 @@ else if (savingsTransactionDTO.getTransactionType().isFeeDeduction() && savingsT
this.helper.createAccrualBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode,
AccrualAccountsForSavings.OVERDRAFT_PORTFOLIO_CONTROL, AccrualAccountsForSavings.INCOME_FROM_PENALTIES,
savingsProductId, paymentTypeId, savingsId, transactionId, transactionDate, overdraftAmount, isReversal,
penaltyPayments);
penaltyPayments, savingsTransactionDTO.getTaxPayments());
if (isPositive) {
this.helper.createAccrualBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode,
AccrualAccountsForSavings.SAVINGS_CONTROL, AccrualAccountsForSavings.INCOME_FROM_PENALTIES,
savingsProductId, paymentTypeId, savingsId, transactionId, transactionDate,
amount.subtract(overdraftAmount), isReversal, penaltyPayments);
amount.subtract(overdraftAmount), isReversal, penaltyPayments, savingsTransactionDTO.getTaxPayments());
}
} else {
this.helper.createAccrualBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode,
AccrualAccountsForSavings.OVERDRAFT_PORTFOLIO_CONTROL, AccrualAccountsForSavings.INCOME_FROM_FEES,
savingsProductId, paymentTypeId, savingsId, transactionId, transactionDate, overdraftAmount, isReversal,
feePayments);
feePayments, savingsTransactionDTO.getTaxPayments());
if (isPositive) {
this.helper.createAccrualBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode,
AccrualAccountsForSavings.SAVINGS_CONTROL, AccrualAccountsForSavings.INCOME_FROM_FEES, savingsProductId,
paymentTypeId, savingsId, transactionId, transactionDate, amount.subtract(overdraftAmount), isReversal,
feePayments);
feePayments, savingsTransactionDTO.getTaxPayments());
}
}
}
Expand All @@ -242,11 +242,13 @@ else if (savingsTransactionDTO.getTransactionType().isFeeDeduction()) {
if (penaltyPayments.size() > 0) {
this.helper.createAccrualBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode,
AccrualAccountsForSavings.SAVINGS_CONTROL, AccrualAccountsForSavings.INCOME_FROM_PENALTIES, savingsProductId,
paymentTypeId, savingsId, transactionId, transactionDate, amount, isReversal, penaltyPayments);
paymentTypeId, savingsId, transactionId, transactionDate, amount, isReversal, penaltyPayments,
savingsTransactionDTO.getTaxPayments());
} else {
this.helper.createAccrualBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode,
AccrualAccountsForSavings.SAVINGS_CONTROL, AccrualAccountsForSavings.INCOME_FROM_FEES, savingsProductId,
paymentTypeId, savingsId, transactionId, transactionDate, amount, isReversal, feePayments);
paymentTypeId, savingsId, transactionId, transactionDate, amount, isReversal, feePayments,
savingsTransactionDTO.getTaxPayments());
}
}

Expand Down Expand Up @@ -278,7 +280,8 @@ else if (savingsTransactionDTO.getTransactionType().isOverdraftInterest()) {
} else if (savingsTransactionDTO.getTransactionType().isOverdraftFee()) {
this.helper.createAccrualBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode,
AccrualAccountsForSavings.SAVINGS_REFERENCE, AccrualAccountsForSavings.INCOME_FROM_FEES, savingsProductId,
paymentTypeId, savingsId, transactionId, transactionDate, amount, isReversal, feePayments);
paymentTypeId, savingsId, transactionId, transactionDate, amount, isReversal, feePayments,
savingsTransactionDTO.getTaxPayments());
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,22 +188,23 @@ else if (savingsTransactionDTO.getTransactionType().isFeeDeduction() && savingsT
this.helper.createCashBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode,
CashAccountsForSavings.OVERDRAFT_PORTFOLIO_CONTROL, CashAccountsForSavings.INCOME_FROM_PENALTIES,
savingsProductId, paymentTypeId, savingsId, transactionId, transactionDate, overdraftAmount, isReversal,
penaltyPayments);
penaltyPayments, savingsTransactionDTO.getTaxPayments());
if (isPositive) {
this.helper.createCashBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode,
CashAccountsForSavings.SAVINGS_CONTROL, CashAccountsForSavings.INCOME_FROM_PENALTIES, savingsProductId,
paymentTypeId, savingsId, transactionId, transactionDate, amount.subtract(overdraftAmount), isReversal,
penaltyPayments);
penaltyPayments, savingsTransactionDTO.getTaxPayments());
}
} else {
this.helper.createCashBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode,
CashAccountsForSavings.OVERDRAFT_PORTFOLIO_CONTROL, CashAccountsForSavings.INCOME_FROM_FEES, savingsProductId,
paymentTypeId, savingsId, transactionId, transactionDate, overdraftAmount, isReversal, feePayments);
paymentTypeId, savingsId, transactionId, transactionDate, overdraftAmount, isReversal, feePayments,
savingsTransactionDTO.getTaxPayments());
if (isPositive) {
this.helper.createCashBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode,
CashAccountsForSavings.SAVINGS_CONTROL, CashAccountsForSavings.INCOME_FROM_FEES, savingsProductId,
paymentTypeId, savingsId, transactionId, transactionDate, amount.subtract(overdraftAmount), isReversal,
feePayments);
feePayments, savingsTransactionDTO.getTaxPayments());
}
}
}
Expand All @@ -213,11 +214,13 @@ else if (savingsTransactionDTO.getTransactionType().isFeeDeduction()) {
if (penaltyPayments.size() > 0) {
this.helper.createCashBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode,
CashAccountsForSavings.SAVINGS_CONTROL, CashAccountsForSavings.INCOME_FROM_PENALTIES, savingsProductId,
paymentTypeId, savingsId, transactionId, transactionDate, amount, isReversal, penaltyPayments);
paymentTypeId, savingsId, transactionId, transactionDate, amount, isReversal, penaltyPayments,
savingsTransactionDTO.getTaxPayments());
} else {
this.helper.createCashBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode,
CashAccountsForSavings.SAVINGS_CONTROL, CashAccountsForSavings.INCOME_FROM_FEES, savingsProductId,
paymentTypeId, savingsId, transactionId, transactionDate, amount, isReversal, feePayments);
paymentTypeId, savingsId, transactionId, transactionDate, amount, isReversal, feePayments,
savingsTransactionDTO.getTaxPayments());
}
}

Expand Down Expand Up @@ -248,7 +251,7 @@ else if (savingsTransactionDTO.getTransactionType().isOverdraftInterest()) {
} else if (savingsTransactionDTO.getTransactionType().isOverdraftFee()) {
this.helper.createCashBasedJournalEntriesAndReversalsForSavingsCharges(office, currencyCode,
CashAccountsForSavings.SAVINGS_REFERENCE, CashAccountsForSavings.INCOME_FROM_FEES, savingsProductId, paymentTypeId,
savingsId, transactionId, transactionDate, amount, isReversal, feePayments);
savingsId, transactionId, transactionDate, amount, isReversal, feePayments, savingsTransactionDTO.getTaxPayments());
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3058,8 +3058,21 @@ public SavingsAccountTransaction payCharge(final SavingsAccountCharge savingsAcc

public SavingsAccountTransaction payCharge(final SavingsAccountCharge savingsAccountCharge, final Money amountPaid,
final LocalDate transactionDate, final boolean backdatedTxnsAllowedTill, String refNo) {
savingsAccountCharge.pay(getCurrency(), amountPaid);
return handlePayChargeTransactions(savingsAccountCharge, amountPaid, transactionDate, backdatedTxnsAllowedTill, refNo);
final BigDecimal baseAmount = amountPaid.getAmount();
final TaxGroup taxGroup = savingsAccountCharge.getCharge().getTaxGroup();
final BigDecimal chargeAmountWithTax = TaxUtils.calculateChargeAmountWithTax(baseAmount, taxGroup, transactionDate,
getCurrency().getDigitsAfterDecimal());
final Money taxInclusiveAmount = Money.of(getCurrency(), chargeAmountWithTax);
savingsAccountCharge.pay(getCurrency(), taxInclusiveAmount);
final SavingsAccountTransaction chargeTransaction = handlePayChargeTransactions(savingsAccountCharge, taxInclusiveAmount,
transactionDate, backdatedTxnsAllowedTill, refNo);
if (taxGroup != null) {
// Use tax-inclusive amount to calculate tax split so amounts match the gross total
final Map<TaxComponent, BigDecimal> taxSplit = TaxUtils.splitTax(chargeAmountWithTax, transactionDate,
taxGroup.getTaxGroupMappings(), getCurrency().getDigitsAfterDecimal());
SavingsAccountTransaction.updateTaxDetails(taxSplit, chargeTransaction);
}
return chargeTransaction;
}

private SavingsAccountTransaction handlePayChargeTransactions(SavingsAccountCharge savingsAccountCharge, Money transactionAmount,
Expand Down
Loading
Loading