Skip to content

Instantly share code, notes, and snippets.

@TechNickAI
Created September 3, 2019 22:18
Show Gist options
  • Save TechNickAI/f72cce62ba69ab9e622241b6a70981b5 to your computer and use it in GitHub Desktop.
Save TechNickAI/f72cce62ba69ab9e622241b6a70981b5 to your computer and use it in GitHub Desktop.
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