Skip to content

Commit c5355c1

Browse files
Merge pull request #147 from RedCarpetUp/ananth_ledger
Changed the reversal method.
2 parents 3e1944d + 2e00909 commit c5355c1

File tree

4 files changed

+73
-33
lines changed

4 files changed

+73
-33
lines changed

src/rush/create_card_swipe.py

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
Optional,
66
)
77

8-
from pendulum import DateTime
8+
from pendulum import (
9+
DateTime,
10+
datetime,
11+
)
912
from sqlalchemy.orm.session import Session
1013

1114
from rush.card.base_card import BaseLoan
@@ -16,10 +19,10 @@
1619
card_transaction_event,
1720
disburse_money_to_card,
1821
)
22+
from rush.ledger_utils import reverse_event
1923
from rush.models import (
2024
CardTransaction,
2125
LedgerTriggerEvent,
22-
Loan,
2326
LoanData,
2427
)
2528

@@ -80,23 +83,32 @@ def create_card_swipe(
8083
return {"result": "success", "data": swipe}
8184

8285

83-
def refund_card_swipe(
84-
session: Session, loan: Loan, txn_ref_no: str, trace_no: str, transaction_id: Optional[int]
85-
) -> None:
86-
card_transaction = (
87-
session.query(CardTransaction)
88-
.join(LoanData, LoanData.id == CardTransaction.loan_id)
86+
def reverse_card_swipe(
87+
session: Session, user_loan: BaseLoan, card_transaction: CardTransaction, post_date: datetime
88+
) -> Dict:
89+
90+
bill = session.query(LoanData).filter(LoanData.id == card_transaction.loan_id).one()
91+
if bill.is_generated: # Can't reverse if already generated. # TODO what to do?
92+
return {"result": "error", "message": "Bill is already generated."}
93+
94+
original_event = (
95+
session.query(LedgerTriggerEvent)
8996
.filter(
90-
LoanData.loan_id == loan.id,
91-
LoanData.user_id == loan.user_id,
92-
CardTransaction.status == "CONFIRMED",
93-
CardTransaction.txn_ref_no == txn_ref_no,
94-
CardTransaction.trace_no == trace_no,
97+
LedgerTriggerEvent.loan_id == user_loan.loan_id,
98+
LedgerTriggerEvent.extra_details["swipe_id"].astext == str(card_transaction.id),
9599
)
100+
.one()
96101
)
97102

98-
if transaction_id:
99-
card_transaction = card_transaction.filter(CardTransaction.id == transaction_id)
100-
101-
card_transaction = card_transaction.one()
102-
card_transaction.status == "REFUNDED"
103+
reversal_event = LedgerTriggerEvent.new(
104+
session,
105+
performed_by=user_loan.user_id,
106+
name="transaction_reversal",
107+
loan_id=user_loan.loan_id,
108+
post_date=post_date,
109+
amount=card_transaction.amount,
110+
extra_details={"swipe_id": card_transaction.id},
111+
)
112+
reverse_event(session=session, event_to_reverse=original_event, event=reversal_event)
113+
card_transaction.status = "REVERSED"
114+
return {"result": "success"}

src/rush/ledger_utils.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from rush.models import (
1616
BookAccount,
1717
LedgerEntry,
18+
LedgerTriggerEvent,
1819
LoanData,
1920
get_or_create,
2021
)
@@ -126,3 +127,15 @@ def is_bill_closed(session: Session, bill: LoanData, to_date: Optional[DateTime]
126127
if max_balance != 0:
127128
return False
128129
return True
130+
131+
132+
def reverse_event(session: Session, event_to_reverse: LedgerTriggerEvent, event: LedgerTriggerEvent):
133+
ledger_entries = session.query(LedgerEntry).filter(LedgerEntry.event_id == event_to_reverse.id).all()
134+
for entry in ledger_entries:
135+
create_ledger_entry(
136+
session,
137+
event_id=event.id,
138+
debit_book_id=entry.credit_account,
139+
credit_book_id=entry.debit_account,
140+
amount=entry.amount,
141+
)

src/rush/payments.py

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
from rush.anomaly_detection import run_anomaly
1010
from rush.card import BaseLoan
1111
from rush.card.base_card import BaseBill
12-
from rush.create_card_swipe import refund_card_swipe
1312
from rush.create_emi import update_event_with_dpd
1413
from rush.ledger_events import (
1514
_adjust_bill,
@@ -94,30 +93,20 @@ def refund_payment(
9493
user_loan: BaseLoan,
9594
payment_amount: Decimal,
9695
payment_date: DateTime,
97-
payment_request_id: Optional[str] = None,
98-
trace_no: Optional[str] = None,
99-
txn_ref_no: Optional[str] = None,
96+
payment_request_id: str,
10097
) -> None:
101-
102-
assert payment_request_id is not None or (trace_no is not None and txn_ref_no is not None)
103-
10498
lt = LedgerTriggerEvent(
10599
name="transaction_refund",
106100
loan_id=user_loan.loan_id,
107101
amount=payment_amount,
108102
post_date=payment_date,
109103
extra_details={
110104
"payment_request_id": payment_request_id,
111-
"trace_no": trace_no,
112-
"txn_ref_no": txn_ref_no,
113105
},
114106
)
115107
session.add(lt)
116108
session.flush()
117109

118-
if trace_no and txn_ref_no:
119-
refund_card_swipe(session=session, loan=user_loan, txn_ref_no=txn_ref_no, trace_no=trace_no)
120-
121110
# Checking if bill is generated or not. if not then reduce from unbilled else treat as payment.
122111
transaction_refund_event(session=session, user_loan=user_loan, event=lt)
123112
run_anomaly(session=session, user_loan=user_loan, event_date=payment_date)

src/test/test_current.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@
3030
get_weekly_spend,
3131
)
3232
from rush.create_bill import bill_generate
33-
from rush.create_card_swipe import create_card_swipe
33+
from rush.create_card_swipe import (
34+
create_card_swipe,
35+
reverse_card_swipe,
36+
)
3437
from rush.create_emi import (
3538
daily_dpd_update,
3639
update_event_with_dpd,
@@ -170,7 +173,7 @@ def test_m2p_transfer(session: Session) -> None:
170173
# assert lender_pool_balance == Decimal(50000)
171174

172175

173-
def test_card_swipe(session: Session) -> None:
176+
def test_card_swipe_and_reversal(session: Session) -> None:
174177
test_lenders(session)
175178
card_db_updates(session)
176179
uc = create_user_product(
@@ -215,6 +218,29 @@ def test_card_swipe(session: Session) -> None:
215218
_, lender_payable = get_account_balance_from_str(session, f"{uc.loan_id}/loan/lender_payable/l")
216219
assert lender_payable == 900
217220

221+
resp = reverse_card_swipe(session, uc, swipe2, parse_date("2020-05-02 13:22:11"))
222+
assert resp["result"] == "success"
223+
224+
_, unbilled_balance = get_account_balance_from_str(session, f"{bill_id}/bill/unbilled/a")
225+
assert unbilled_balance == 700
226+
# remaining card balance should be -900 because we've not loaded it yet and it's going in negative.
227+
_, card_balance = get_account_balance_from_str(session, f"{uc.loan_id}/card/available_limit/l")
228+
assert card_balance == -700
229+
230+
_, lender_payable = get_account_balance_from_str(session, f"{uc.loan_id}/loan/lender_payable/l")
231+
assert lender_payable == 700
232+
233+
swipe3 = create_card_swipe(
234+
session=session,
235+
user_loan=uc,
236+
txn_time=parse_date("2020-05-02 17:22:11"),
237+
amount=Decimal(200),
238+
description="Flipkart.com",
239+
txn_ref_no="dummy_txn_ref_no_2",
240+
trace_no="123452",
241+
)
242+
swipe3 = swipe3["data"]
243+
218244

219245
def test_closing_bill(session: Session) -> None:
220246
# Replicating nishant's case upto June
@@ -3123,7 +3149,7 @@ def test_reducing_interest_with_extension(session: Session) -> None:
31233149

31243150

31253151
def test_intermediate_bill_generation(session: Session) -> None:
3126-
test_card_swipe(session)
3152+
test_card_swipe_and_reversal(session)
31273153
user_loan = get_user_product(session, 2)
31283154
bill_1 = bill_generate(user_loan)
31293155

0 commit comments

Comments
 (0)