]> asedeno.scripts.mit.edu Git - bluechips.git/blobdiff - bluechips/lib/totals.py
Added UI for working with tags
[bluechips.git] / bluechips / lib / totals.py
index e8b2985a07446718079eca982f2baef6fff3a6e8..94a62a127bbe73d63f70bec4f8c9e6928414a18e 100644 (file)
@@ -21,11 +21,14 @@ def debts():
     # house
     users = meta.Session.query(model.User)
     
-    debts_dict = {}
+    debts_dict = dict((u, Currency(0)) for u in users)
     
     # First, credit everyone for expenditures they've made
-    for user in users:
-        debts_dict[user] = Currency(-sum(map((lambda x: x.amount), user.expenditures)))
+    total_expenditures = meta.Session.query(model.Expenditure).\
+        add_column(sqlalchemy.func.sum(model.Expenditure.amount).label('total_spend')).\
+        group_by(model.Expenditure.spender_id)
+    for expenditure, total_spend in total_expenditures:
+        debts_dict[expenditure.spender] -= total_spend
     
     # Next, debit everyone for expenditures that they have an
     # investment in (i.e. splits)
@@ -60,7 +63,7 @@ def settle(debts_dict):
     
     debts_list = [dict(who=user, amount=amount) for user, amount in \
                       debts_dict.iteritems()]
-    debts_list.sort(reverse=True, key=(lambda x: abs(x['amount'])))
+    #debts_list.sort(reverse=True, key=(lambda x: abs(x['amount'])))
     
     owes_list = [debt for debt in debts_list if debt['amount'] > 0]
     owed_list = [debt for debt in debts_list if debt['amount'] < 0]
@@ -68,6 +71,9 @@ def settle(debts_dict):
     settle_list = []
     
     while len(owes_list) > 0 and len(owed_list) > 0:
+        owes_list.sort(reverse=True, key=(lambda x: abs(x['amount'])))
+        owed_list.sort(reverse=True, key=(lambda x: abs(x['amount'])))
+
         owes = owes_list[0]
         owed = owed_list[0]