@@ -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