Skip to content

Commit f9b1c86

Browse files
Do not adjust payment in unbilled account for term loans
1 parent 1399326 commit f9b1c86

3 files changed

Lines changed: 238 additions & 6 deletions

File tree

src/rush/accrue_financial_charges.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ def reverse_incorrect_late_charges(
355355
)
356356
.one_or_none()
357357
)
358+
bill = user_loan.convert_to_bill_class(bill)
358359

359360
if fee.fee_status == "UNPAID":
360361
# Remove from min. But only what's remaining. Rest doesn't matter.

src/rush/ledger_events.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ def add_max_amount_event(
154154

155155
def _adjust_bill(
156156
session: Session,
157-
bill: LoanData,
157+
bill: BaseBill,
158158
amount_to_adjust_in_this_bill: Decimal,
159159
event_id: int,
160160
debit_acc_str: str,
@@ -182,11 +182,12 @@ def adjust_for_receivable(payment_to_adjust_from: Decimal, to_acc: str, from_acc
182182
to_acc=debit_acc_str,
183183
from_acc=f"{bill.id}/bill/interest_receivable/a",
184184
)
185-
remaining_amount = adjust_for_receivable(
186-
remaining_amount,
187-
to_acc=debit_acc_str,
188-
from_acc=f"{bill.id}/bill/unbilled/a",
189-
)
185+
if not bill.user_loan.sub_product_type == "tenure_loan":
186+
remaining_amount = adjust_for_receivable(
187+
remaining_amount,
188+
to_acc=debit_acc_str,
189+
from_acc=f"{bill.id}/bill/unbilled/a",
190+
)
190191
remaining_amount = adjust_for_receivable(
191192
remaining_amount,
192193
to_acc=debit_acc_str,

src/test/test_reset_card.py

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,3 +1174,233 @@ def test_reset_card_versions(session: Session) -> None:
11741174
v2 = ResetCardV2(session=session)
11751175
assert is_reset_loan(v2) is True
11761176
assert is_reset_product_type(v2.product_type) is True
1177+
1178+
1179+
def test_payment_not_adjusted_to_unbilled(session: Session) -> None:
1180+
create_lenders(session=session)
1181+
create_products(session=session)
1182+
create_user(session=session)
1183+
1184+
user_product = create_user_product_mapping(
1185+
session=session, user_id=6, product_type="term_loan_reset"
1186+
)
1187+
create_loan(session=session, user_product=user_product, lender_id=1756833)
1188+
user_loan = get_user_product(
1189+
session=session, user_id=user_product.user_id, card_type="term_loan_reset"
1190+
)
1191+
assert isinstance(user_loan, ResetCard) == True
1192+
1193+
fee = create_loan_fee(
1194+
session=session,
1195+
user_loan=user_loan,
1196+
post_date=parse_date("2021-08-01 00:00:00"),
1197+
gross_amount=Decimal("100"),
1198+
include_gst_from_gross_amount=False,
1199+
fee_name="reset_joining_fees",
1200+
)
1201+
1202+
payment_date = parse_date("2021-08-01")
1203+
amount = fee.gross_amount
1204+
payment_request_id = "dummy_reset_fee_1"
1205+
payment_request_data(
1206+
session=session,
1207+
type="reset_joining_fees",
1208+
payment_request_amount=amount,
1209+
user_id=user_product.user_id,
1210+
payment_request_id=payment_request_id,
1211+
)
1212+
payment_requests_data = pay_payment_request(
1213+
session=session, payment_request_id=payment_request_id, payment_date=payment_date
1214+
)
1215+
payment_received(
1216+
session=session,
1217+
user_loan=user_loan,
1218+
payment_request_data=payment_requests_data,
1219+
)
1220+
settle_payment_in_bank(
1221+
session=session,
1222+
payment_request_id=payment_request_id,
1223+
gateway_expenses=payment_requests_data.payment_execution_charges,
1224+
gross_payment_amount=payment_requests_data.payment_request_amount,
1225+
settlement_date=payment_requests_data.payment_received_in_bank_date,
1226+
user_loan=user_loan,
1227+
)
1228+
payment_ledger_event = (
1229+
session.query(LedgerTriggerEvent)
1230+
.filter(
1231+
LedgerTriggerEvent.name == "payment_received",
1232+
LedgerTriggerEvent.extra_details["payment_request_id"].astext == payment_request_id,
1233+
)
1234+
.first()
1235+
)
1236+
assert payment_ledger_event.amount == amount
1237+
1238+
session.flush()
1239+
1240+
loan_creation_data = {"date_str": "2021-08-01", "user_product_id": user_product.id}
1241+
1242+
# create loan
1243+
loan = create_test_term_loan(session=session, **loan_creation_data)
1244+
1245+
_, rc_cash_balance = get_account_balance_from_str(
1246+
session=session, book_string=f"12345/redcarpet/rc_cash/a"
1247+
)
1248+
assert rc_cash_balance == Decimal("-10000")
1249+
1250+
assert loan.product_type == "term_loan_reset"
1251+
assert loan.amortization_date == parse_date("2021-08-01").date()
1252+
1253+
loan_data = session.query(LoanData).filter(LoanData.loan_id == user_loan.loan_id).one()
1254+
1255+
assert loan_data.bill_start_date == parse_date("2021-08-01").date()
1256+
assert loan_data.bill_close_date == parse_date("2022-07-01").date()
1257+
1258+
_, principal_receivable = get_account_balance_from_str(
1259+
session=session, book_string=f"{loan_data.id}/bill/principal_receivable/a"
1260+
)
1261+
assert principal_receivable == Decimal("10000")
1262+
1263+
all_emis = user_loan.get_loan_schedule()
1264+
1265+
assert len(all_emis) == 12
1266+
assert all_emis[0].due_date == parse_date("2021-08-01").date()
1267+
assert all_emis[0].emi_number == 1
1268+
assert all_emis[0].interest_due == Decimal("300.67")
1269+
assert all_emis[0].total_due_amount == Decimal("1134")
1270+
1271+
assert all_emis[-1].due_date == parse_date("2022-07-01").date()
1272+
assert all_emis[-1].emi_number == 12
1273+
assert all_emis[-1].interest_due == Decimal("300.67")
1274+
assert all_emis[-1].total_due_amount == Decimal("1134")
1275+
1276+
interest_left_to_accrue = get_interest_left_to_accrue(session, user_loan)
1277+
assert interest_left_to_accrue == Decimal("3608.04")
1278+
1279+
create_card_swipe(
1280+
session=session,
1281+
user_loan=user_loan,
1282+
txn_time=parse_date("2021-08-01 11:22:11"),
1283+
amount=Decimal(1000),
1284+
description="Flipkart.com",
1285+
txn_ref_no="dummy_txn_ref_no_2",
1286+
trace_no="123456",
1287+
)
1288+
session.flush()
1289+
_, loan_lender_payable = get_account_balance_from_str(
1290+
session=session, book_string=f"{user_loan.loan_id}/loan/lender_payable/l"
1291+
)
1292+
assert loan_lender_payable == Decimal("882.50")
1293+
1294+
payment_date = parse_date("2021-08-25")
1295+
amount = Decimal(1134)
1296+
payment_request_id = "dummy_reset_fee_2"
1297+
payment_request_data(
1298+
session=session,
1299+
type="collection",
1300+
payment_request_amount=amount,
1301+
user_id=user_product.user_id,
1302+
payment_request_id=payment_request_id,
1303+
)
1304+
payment_requests_data = pay_payment_request(
1305+
session=session, payment_request_id=payment_request_id, payment_date=payment_date
1306+
)
1307+
payment_received(
1308+
session=session,
1309+
user_loan=user_loan,
1310+
payment_request_data=payment_requests_data,
1311+
)
1312+
settle_payment_in_bank(
1313+
session=session,
1314+
payment_request_id=payment_request_id,
1315+
gateway_expenses=payment_requests_data.payment_execution_charges,
1316+
gross_payment_amount=payment_requests_data.payment_request_amount,
1317+
settlement_date=payment_requests_data.payment_received_in_bank_date,
1318+
user_loan=user_loan,
1319+
)
1320+
1321+
payment_ledger_event = (
1322+
session.query(LedgerTriggerEvent)
1323+
.filter(
1324+
LedgerTriggerEvent.name == "payment_received",
1325+
LedgerTriggerEvent.extra_details["payment_request_id"].astext == payment_request_id,
1326+
)
1327+
.first()
1328+
)
1329+
assert payment_ledger_event.amount == amount
1330+
1331+
_, principal_receivable = get_account_balance_from_str(
1332+
session=session, book_string=f"{loan_data.id}/bill/principal_receivable/a"
1333+
)
1334+
assert principal_receivable == Decimal(8866)
1335+
1336+
_, unbilled = get_account_balance_from_str(
1337+
session=session, book_string=f"{loan_data.id}/bill/unbilled/a"
1338+
)
1339+
assert unbilled == Decimal(1000)
1340+
1341+
create_card_swipe(
1342+
session=session,
1343+
user_loan=user_loan,
1344+
txn_time=parse_date("2021-08-26 11:22:11"),
1345+
amount=Decimal(1000),
1346+
description="Flipkart.com",
1347+
txn_ref_no="dummy_txn_ref_no_3",
1348+
trace_no="123456",
1349+
)
1350+
1351+
_, unbilled = get_account_balance_from_str(
1352+
session=session, book_string=f"{loan_data.id}/bill/unbilled/a"
1353+
)
1354+
assert unbilled == Decimal(2000)
1355+
1356+
payment_date = parse_date("2021-08-25")
1357+
amount = Decimal(9866)
1358+
payment_request_id = "dummy_reset_fee_3"
1359+
payment_request_data(
1360+
session=session,
1361+
type="collection",
1362+
payment_request_amount=amount,
1363+
user_id=user_product.user_id,
1364+
payment_request_id=payment_request_id,
1365+
)
1366+
payment_requests_data = pay_payment_request(
1367+
session=session, payment_request_id=payment_request_id, payment_date=payment_date
1368+
)
1369+
payment_received(
1370+
session=session,
1371+
user_loan=user_loan,
1372+
payment_request_data=payment_requests_data,
1373+
)
1374+
settle_payment_in_bank(
1375+
session=session,
1376+
payment_request_id=payment_request_id,
1377+
gateway_expenses=payment_requests_data.payment_execution_charges,
1378+
gross_payment_amount=payment_requests_data.payment_request_amount,
1379+
settlement_date=payment_requests_data.payment_received_in_bank_date,
1380+
user_loan=user_loan,
1381+
)
1382+
1383+
payment_ledger_event = (
1384+
session.query(LedgerTriggerEvent)
1385+
.filter(
1386+
LedgerTriggerEvent.name == "payment_received",
1387+
LedgerTriggerEvent.extra_details["payment_request_id"].astext == payment_request_id,
1388+
)
1389+
.first()
1390+
)
1391+
assert payment_ledger_event.amount == amount
1392+
1393+
_, principal_receivable = get_account_balance_from_str(
1394+
session=session, book_string=f"{loan_data.id}/bill/principal_receivable/a"
1395+
)
1396+
assert principal_receivable == Decimal(0)
1397+
1398+
_, unbilled = get_account_balance_from_str(
1399+
session=session, book_string=f"{loan_data.id}/bill/unbilled/a"
1400+
)
1401+
assert unbilled == Decimal(2000)
1402+
1403+
_, early_close_balance = get_account_balance_from_str(
1404+
session=session, book_string=f"{loan.loan_id}/loan/early_close_fee/r"
1405+
)
1406+
assert early_close_balance == Decimal("847.46")

0 commit comments

Comments
 (0)