Skip to content

Commit 0e7e558

Browse files
djudjuugparuthi
andauthored
Dju/new run trough fixes (#192)
* full single repay * correclty compute exposure * yarn build passes * disable analytics * rename component * adjust test to not send request without support * full single repay not optional * SupporterView & CorpusView typed * simplified tests & and increase jest.TimeOut Co-authored-by: Gaurav Paruthi <gparuthi@umich.edu>
1 parent 3240026 commit 0e7e558

File tree

9 files changed

+68
-36
lines changed

9 files changed

+68
-36
lines changed

src/components/borrower/repayments.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ export function RepaymentsForm({ user }: Props) {
3535
user.loans_to_repay[0].loan.schedule.next_borrower_payment
3636
)
3737

38+
const fullRepay = Math.ceil(
39+
user.loans_to_repay[0].loan.schedule.full_single_repay
40+
)
41+
3842
return (
3943
<Box maxW="lg">
4044
<form onSubmit={handleSubmit(onSubmit)} method="post">
@@ -43,6 +47,7 @@ export function RepaymentsForm({ user }: Props) {
4347
<AmountInputWithHelper
4448
helpers={{
4549
Next: suggestedNextBorrowerPayment,
50+
All: fullRepay,
4651
}}
4752
passRef={register({ required: true })}
4853
setValue={setValue}

src/components/lender/LenderDashboard.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { User } from "../../lib/types"
1919
import { Currency } from "../common/Currency"
2020
import LenderModel from "./LenderModel"
2121
import PledgeInvestments from "./Pledges"
22-
import InvestedLoans from "./Loans"
22+
import InvestedLoans from "./InvestedLoans"
2323

2424
interface Props {
2525
user: User
@@ -58,7 +58,7 @@ const AllocatedAsset = (title: string, percentage: number, color?: string) => (
5858

5959
const LenderDashboard = ({ user }: Props) => {
6060
const lender = new LenderModel(user)
61-
console.log("roi", user.roi)
61+
// console.log("roi", user.roi.apr_on_loans.loans)
6262

6363
return (
6464
<Stack w="100%" spacing={8}>

src/gql/db_client.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -230,16 +230,16 @@ export default class DbClient {
230230
})
231231
const loan: LoanInfo = loans.loans[loan_id]
232232
let newStatus = LoanRequestStatus.active
233-
if (loan.state.repayments.length >= loan.terms.tenor) {
234-
const noOutstandingDebt =
235-
loan.schedule.borrower_view.total_payments.remain <= 10e-7 &&
236-
loan.schedule.borrower_view.corpus_principal.remain <= 10e-7 &&
237-
loan.schedule.borrower_view.supporter_principal.remain <= 10e-7 &&
238-
loan.schedule.borrower_view.supporter_interest.remain <= 10e-7 &&
239-
loan.schedule.borrower_view.corpus_interest.remain <= 10e-7
240-
newStatus = noOutstandingDebt
241-
? LoanRequestStatus.settled
242-
: LoanRequestStatus.defaulted
233+
const noOutstandingDebt =
234+
loan.schedule.borrower_view.total_payments.remain <= 1 &&
235+
loan.schedule.borrower_view.corpus_principal.remain <= 1 &&
236+
loan.schedule.borrower_view.supporter_principal.remain <= 1 &&
237+
loan.schedule.borrower_view.supporter_interest.remain <= 1 &&
238+
loan.schedule.borrower_view.corpus_interest.remain <= 1
239+
if (noOutstandingDebt) {
240+
newStatus = LoanRequestStatus.settled
241+
} else if (loan.state.repayments.length >= loan.terms.tenor) {
242+
newStatus = LoanRequestStatus.defaulted
243243
}
244244
const { loanRequest } = await this.sdk.UpdateLoanRequestWithLoanData({
245245
requestId: loan_id,

src/lib/demo/fixtures.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ export class Fixtures {
111111
},
112112
supporter_view: null,
113113
next_borrower_payment: 15799.51,
114+
full_single_repay: 94797,
114115
apr: {
115116
corpus: 0.17,
116117
supporter: 0.16,

src/lib/types.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,27 @@ export type BorrowerView = {
183183
borrower_collateral: PaidRemain
184184
}
185185

186+
export type SupporterView = {
187+
total_receipts: PaidRemain
188+
supporter_principal: PaidRemain
189+
supporter_interest: PaidRemain
190+
receipts_in_escrow: PaidRemain
191+
receipts_rtrn_from_brw: PaidRemain
192+
cash_unencumbered: PaidRemain
193+
cash_rtrn_from_brw: PaidRemain
194+
ptfl_unencumbered: PaidRemain
195+
ptfl_rtrn_from_brw: PaidRemain
196+
principal_released: PaidRemain
197+
interest_released: PaidRemain
198+
total_released: PaidRemain
199+
}
200+
201+
export type CorpusView = {
202+
total_receipts: PaidRemain
203+
principal: PaidRemain
204+
interest: PaidRemain
205+
}
206+
186207
export type APR = {
187208
corpus: number
188209
supporter: number
@@ -191,9 +212,10 @@ export type APR = {
191212
export type LoanScheduleSummary = {
192213
borrower_view: BorrowerView
193214
next_borrower_payment: number
194-
supporter_view?: any
195-
corpus_view?: any
215+
supporter_view: SupporterView
216+
corpus_view: CorpusView
196217
apr: APR
218+
full_single_repay: number
197219
}
198220

199221
// =========== End of risk module types ========

tests/src/loan/loan-confirm.integration.test.ts

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -228,27 +228,24 @@ describe("Loan Request Flow: confirm loan offer", () => {
228228
)
229229
// escrow is again nonzero, as second payment is now being withheld
230230
expect(updated_request.balance).toBeGreaterThan(0)
231-
})
231+
}, 10000)
232232

233233
test("make full repayment", async () => {
234234
const data = await sdk.GetLoanRequest({ requestId })
235235
let loan = data.loanRequest.loan
236-
let ideal_repayment = loan.schedule.next_borrower_payment
237-
let updated_request
238-
while (loan.state.repayments.length < loan.terms.tenor) {
239-
await sdk.ChangeUserCashBalance({
240-
userId: BORROWER1.id,
241-
delta: ideal_repayment,
242-
})
243-
updated_request = await dbClient.make_repayment(
244-
requestId,
245-
ideal_repayment
246-
)
247-
ideal_repayment = updated_request.loan.schedule.next_borrower_payment
248-
loan = updated_request.loan
249-
}
236+
const ideal_repayment = loan.schedule.full_single_repay
237+
await sdk.ChangeUserCashBalance({
238+
userId: BORROWER1.id,
239+
delta: ideal_repayment,
240+
})
241+
const updated_request = await dbClient.make_repayment(
242+
requestId,
243+
ideal_repayment
244+
)
245+
loan = updated_request.loan
246+
// console.log(updated_request)
250247
expect(updated_request.status).toBe(LoanRequestStatus.settled)
251-
})
248+
}, 10000)
252249

253250
test.skip("make defaulting repayments", async () => {
254251
// # TODO make a new loan

tests/src/loan/loan-offer.integration.test.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
SystemUpdate,
77
LoanRequestInfo,
88
} from "lib/types"
9-
import { BORROWER1, SUPPORTER2 } from "../../fixtures/basic_network"
9+
import { BORROWER1, SUPPORTER2, SUPPORTER3 } from "../../fixtures/basic_network"
1010
import { addAndConfirmSupporter } from "../common/test_helpers"
1111
import { dbClient, sdk } from "../common/utils"
1212

@@ -18,13 +18,20 @@ beforeAll(async () => {
1818
await sdk.ResetDB()
1919
await sdk.CreateUser({ user: BORROWER1 })
2020
await sdk.CreateUser({ user: SUPPORTER2 })
21+
await sdk.CreateUser({ user: SUPPORTER3 })
2122

2223
const { loanRequest } = await dbClient.createLoanRequest(
2324
BORROWER1.id,
2425
amount,
2526
purpose
2627
)
2728
requestId = loanRequest.request_id
29+
await addAndConfirmSupporter(
30+
dbClient,
31+
requestId,
32+
SUPPORTER2.id,
33+
(amount * MIN_SUPPORT_RATIO) / 2
34+
)
2835
})
2936

3037
afterAll(async () => {
@@ -39,7 +46,7 @@ describe("Loan Request Flow", () => {
3946
const loan = res.loans.loan_offers[requestId]
4047
expect(loan.request_id).toBe(requestId)
4148
expect(loan.terms).toHaveProperty("corpus_share")
42-
expect(loan.terms.corpus_share).toBe(1)
49+
expect(loan.terms.corpus_share).toBe(1 - MIN_SUPPORT_RATIO / 2)
4350
expect(loan).toHaveProperty("terms.borrower_apr")
4451
})
4552

@@ -60,8 +67,8 @@ describe("Loan Request Flow", () => {
6067
await addAndConfirmSupporter(
6168
dbClient,
6269
requestId,
63-
SUPPORTER2.id,
64-
amount * MIN_SUPPORT_RATIO
70+
SUPPORTER3.id,
71+
(amount * MIN_SUPPORT_RATIO) / 2
6572
)
6673
const { loanRequest } = await sdk.GetLoanRequest({
6774
requestId: requestId,

tests/src/scenarios/simple.integration.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ describe("Scenario unit tests", () => {
7070
scenario.actions[scenario.actions.length - 1].payload.amount,
7171
])
7272
generate_yaml = await scenarioToYAML(dbClient)
73-
})
73+
}, 7000)
7474

7575
test("from generated", async () => {
7676
const scenario = await Scenario.fromYAML(generate_yaml, dbClient)
@@ -81,5 +81,5 @@ describe("Scenario unit tests", () => {
8181
// This won't be equal because generated json has much more info (action.id, demographic info, loan_ids are UUIDs )
8282
// uncomment to compare
8383
// expect(await scenarioToJSON(dbClient)).toStrictEqual(simple)
84-
})
84+
}, 10000)
8585
})

0 commit comments

Comments
 (0)