-
Notifications
You must be signed in to change notification settings - Fork 0
/
expense.py
65 lines (43 loc) · 1.68 KB
/
expense.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from helpers.Optimal_account_balancing import balance_account
from helpers.data_objects import Group,UserExpense,Expense,User
class GroupHandler:
def __init__(self):
self.groups = {}
def add_group(self, name):
self.groups[name] = Group(name=name, users=set())
def add_memeber(self, gn: str, un: str):
self.groups[gn].users.add(un)
def show_groups(self):
return set(self.groups.keys())
class UserHandler:
def __init__(self):
self.users = {}
def add_user(self, name):
self.users[name] = User(name=name)
def show_users(self):
return set(self.users.keys())
class ExpenseHandler:
def __init__(self):
self.expenses = {}
def add_expense(self, total_amt, user_amt_map, grp_name:Group, name):
u_map = []
for um in user_amt_map:
if um[1] == 0:
continue
t = UserExpense(user=um[0], amount=um[1] )
u_map.append(t)
if grp_name.name in self.expenses:
self.expenses[grp_name.name].append(Expense(name=name, grp=grp_name, user_expense=u_map, total=total_amt))
else:
self.expenses[grp_name.name] = [(Expense(name=name, grp=grp_name, user_expense=u_map, total=total_amt))]
def settle_grp_expense(self, grp_name):
# first aggregate all users balance
balance = {}
for e in self.expenses[grp_name]:
for u in e.user_expense:
if u.user in balance:
balance[u.user] += u.amount
else:
balance[u.user] = u.amount
# then call the algo to settle balances
return balance_account(balance)