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
37 changes: 34 additions & 3 deletions bank.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,40 @@ def calculate_total_assets(self):
pass


def process_loan_payments(self):
# Processes loan payments by deducting the installment amount from the balance.
pass
def process_loan_payments(self):
# Processes loan payments by deducting the installment amount from the balance.
processed_payments = []

for loan in self.loans:
if loan.tenure <= 0 or loan.remaining_balance <= 0:
continue

account = next(
(account for account in self.accounts if account.account_number == loan.account_number),
None,
)

if account is None:
continue

installment = min(loan.amount / loan.tenure, loan.remaining_balance)

if account.balance < installment:
continue

account.balance -= installment
loan.remaining_balance -= installment

payment = {
"loan_id": loan.loan_id,
"account_number": account.account_number,
"amount": installment,
}
account.transactions.append(("Loan Payment", installment))
self.transactions.append(payment)
processed_payments.append(payment)

return processed_payments


class Account:
Expand Down
57 changes: 57 additions & 0 deletions test_bank.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import unittest

from bank import Account, Bank, Loan


class ProcessLoanPaymentsTest(unittest.TestCase):
def test_processes_installment_from_matching_account(self):
bank = Bank("RepoRaid Bank")
account = Account(101, "Ada", 500.0)
loan = Loan(1, 101, 1200.0, 0.05, 12)
bank.accounts.append(account)
bank.loans.append(loan)

payments = bank.process_loan_payments()

self.assertEqual(
payments,
[{"loan_id": 1, "account_number": 101, "amount": 100.0}],
)
self.assertEqual(account.balance, 400.0)
self.assertEqual(loan.remaining_balance, 1100.0)
self.assertEqual(account.transactions, [("Loan Payment", 100.0)])
self.assertEqual(bank.transactions, payments)

def test_caps_payment_at_remaining_balance(self):
bank = Bank("RepoRaid Bank")
account = Account(202, "Grace", 75.0)
loan = Loan(2, 202, 1200.0, 0.05, 12)
loan.remaining_balance = 40.0
bank.accounts.append(account)
bank.loans.append(loan)

payments = bank.process_loan_payments()

self.assertEqual(
payments,
[{"loan_id": 2, "account_number": 202, "amount": 40.0}],
)
self.assertEqual(account.balance, 35.0)
self.assertEqual(loan.remaining_balance, 0.0)

def test_skips_missing_accounts_and_insufficient_funds(self):
bank = Bank("RepoRaid Bank")
low_balance = Account(303, "Linus", 25.0)
unpaid = Loan(3, 303, 1200.0, 0.05, 12)
missing_account = Loan(4, 404, 1200.0, 0.05, 12)
bank.accounts.append(low_balance)
bank.loans.extend([unpaid, missing_account])

self.assertEqual(bank.process_loan_payments(), [])
self.assertEqual(low_balance.balance, 25.0)
self.assertEqual(unpaid.remaining_balance, 1200.0)
self.assertEqual(missing_account.remaining_balance, 1200.0)


if __name__ == "__main__":
unittest.main()