Created
September 3, 2019 22:18
-
-
Save TechNickAI/f72cce62ba69ab9e622241b6a70981b5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def test_earnings_flow(self): | |
# Simulate deposits, interest earnings, and balance redistribution | |
# Set up Initial ledgers | |
nick_u = User.objects.get(username="nick") | |
charlie_u = User.objects.get(username="charlie") | |
erin_u = User.objects.get(username="erin") | |
funding_gl = Ledger.objects.create(name="Funding Wallet") | |
ownership_gl = Ledger.objects.create(name="Ownership - Contributions") | |
interest_gl = Ledger.objects.create(name="Interest Income") | |
leftover_gl = Ledger.objects.create(name="Leftover Interest") | |
nick_sl = Ledger.objects.create(name="Nick Account", user=nick_u, parent=ownership_gl) | |
charlie_sl = Ledger.objects.create(name="Charlie Account", user=charlie_u, parent=ownership_gl) | |
erin_sl = Ledger.objects.create(name="Erin Account", user=erin_u, parent=ownership_gl) | |
peoplerithm_lba = LendBotAccount.objects.get(pk=23) | |
peoplerithm_lba.ledgers.add(nick_sl, charlie_sl, erin_sl) | |
peoplerithm_lba.save() | |
self.assertEqual(peoplerithm_lba.ledgers.count(), 3) | |
# # Date # Earnings #Start Balance #End Balance | |
earnings = { | |
"Aug 16": [D("273.43042984"), D("764539.58469355"), D("764813.01512339")], | |
"Aug 15": [D("280.30724944"), D("764259.27744411"), D("764539.58469355")], | |
"Aug 14": [D("252.47273570"), D("685179.45985351"), D("764259.27744411")], | |
"Aug 13": [D("239.64115029"), D("644196.49956222"), D("685179.45985351")], | |
"Aug 12": [D("204.91035070"), D("536560.40382178"), D("644196.49956222")], | |
"Aug 11": [D("192.09574612"), D("536368.30807566"), D("536560.40382178")], | |
"Aug 10": [D("74.44641928"), D("138747.96988248"), D("536368.30807566")], | |
"Aug 9": [D("48.43821462"), D("138699.53166786"), D("138747.96988248")], | |
} | |
deposits = { | |
"Nick Initial": D("138699.53166786"), | |
"Charlie Aug 10": D("397545.8917739"), | |
"Nick Aug 12": D("107431.18538974"), | |
"Nick Aug 13": D("40743.31914100") - D("5000"), # Part of this deposit was credited to Erin | |
"Erin Aug 13": D("5000"), | |
"Nick Aug 14": D("78827.3448549"), | |
} | |
# Some sanity checks on the data | |
d1 = earnings["Aug 9"] | |
self.assertEqual(d1[2], d1[1] + d1[0]) | |
# The end balance on Aug 16 should be sum of all the deposits and earnings (this happens to verify Bitfinex too) | |
total = D('0') | |
for deposit in deposits.values(): | |
total += deposit | |
for earning in earnings.values(): | |
total += earning[0] | |
self.assertEqual(total, earnings["Aug 16"][2]) | |
# Nick's initial Deposit | |
le = LedgerEntry.transact(funding_gl, nick_sl, "Deposit", deposits["Nick Initial"], | |
notes="Initial Deposit", effective="Aug 9 2019") | |
le.manual = True | |
le.save() | |
del le | |
self.assertEqual(nick_sl.balance(), deposits["Nick Initial"]) | |
self.assertEqual(funding_gl.balance(), deposits["Nick Initial"] * D("-1")) | |
LedgerEntry.transact(funding_gl, interest_gl, "Earnings", earnings["Aug 9"][0], | |
notes="Interest for Aug 9 2019", effective="Aug 9 2019") | |
# Nick was at 100% that day so he gets it all | |
balance_distribution = peoplerithm_lba.distribute_daily_earnings(earnings["Aug 9"][0], date_from_text("Aug 11 2019")) | |
self.assertEqual(nick_sl.balance(), D("138747.96988248")) | |
self.assertEqual(len(balance_distribution["ledgers"]), 1) | |
return # stop here for now | |
self.assertEqual(balance_distribution[nick_sl.id]["balance"], nick_sl.balance()) | |
self.assertEqual(balance_distribution[nick_sl.id]["percent"], D('100')) | |
# Charlie's Deposit | |
le = LedgerEntry.transact(funding_gl, charlie_sl, "Deposit", deposits["Charlie Aug 10"], | |
notes="Initial Deposit", effective="Aug 10 2019 12:00:00") | |
le.manual = True | |
le.save() | |
self.assertEqual(charlie_sl.balance(), deposits["Charlie Aug 10"]) | |
LedgerEntry.transact(funding_gl, interest_gl, "Earnings", earnings["Aug 10"][0], | |
notes="Interest for Aug 11 2019", effective="Aug 11 2019") | |
balance_distribution = peoplerithm_lba.distribute_daily_earnings(earnings["Aug 11"][0], date_from_text("Aug 11 2019")) | |
self.assertEqual(len(balance_distribution["ledgers"]), 1) | |
self.assertEqual(balance_distribution[nick_sl.id]["percent"], D('100')) | |
# Charlie's balance should remain unchanged, because his deposit wasn't in at the beginning of the day | |
self.assertEqual(charlie_sl.balance(), deposits["Charlie Aug 10"]) | |
# Nick's balance should be initial deposit, plus aug 9 earnngs, plus a part of Aug 10 earnings | |
self.assertEqual(nick_sl.balance(), deposits["Nick Initial"] + earnings["Aug 9"][0] + (earnings["Aug 10"][0] * D("0.25871631"))) | |
# Leftover ledger should get Charlie's partial day | |
self.assertIn(leftover_gl.id, balance_distribution) | |
self.assertEqual(leftover_gl.balance(), D('123')) | |
self.assertEqual(balance_distribution[leftover_gl.id]["balance"], leftover_gl.balance()) | |
self.assertEqual(nick_sl.balance(), D("138767.23038550"), "As of Aug 11") | |
self.assertEqual(charlie_sl.balance(), D("397601.07769016"), "As of Aug 11") | |
self.assertEqual(nick_sl.balance() + charlie_sl.balance(), D("536368.30807566"), "balance as of Aug 11") | |
# Erin's deposit | |
# Confirm balances |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment