diff --git a/bank.py b/bank.py index ab74f6f..f766662 100644 --- a/bank.py +++ b/bank.py @@ -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: diff --git a/test_bank.py b/test_bank.py new file mode 100644 index 0000000..b6f21c6 --- /dev/null +++ b/test_bank.py @@ -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()