diff options
| author | Rémy HUBSCHER <remy@chefclub.tv> | 2019-09-24 22:19:38 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-09-24 22:19:38 +0200 |
| commit | 4ec452507504e6ee8a4ec0b5fbdcb51f60f1b9ef (patch) | |
| tree | 8474945bd6e40d3429dacb92eb11e2b1221aa9b9 /ihatemoney | |
| parent | 257a146b74737bf019830ba925178fb683bf6011 (diff) | |
| parent | 74c51be5a3ccdbb81d7a2111d198b7ac4c511ed5 (diff) | |
| download | ihatemoney-mirror-4ec452507504e6ee8a4ec0b5fbdcb51f60f1b9ef.zip ihatemoney-mirror-4ec452507504e6ee8a4ec0b5fbdcb51f60f1b9ef.tar.gz ihatemoney-mirror-4ec452507504e6ee8a4ec0b5fbdcb51f60f1b9ef.tar.bz2 | |
Merge pull request #476 from spiral-project/integrate-debts
Fix #434 Use the debts lib to solve settlements.
Diffstat (limited to 'ihatemoney')
| -rw-r--r-- | ihatemoney/budget.db | 0 | ||||
| -rw-r--r-- | ihatemoney/models.py | 49 | ||||
| -rw-r--r-- | ihatemoney/tests/tests.py | 21 |
3 files changed, 22 insertions, 48 deletions
diff --git a/ihatemoney/budget.db b/ihatemoney/budget.db new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/ihatemoney/budget.db diff --git a/ihatemoney/models.py b/ihatemoney/models.py index 3e908fa..325cf57 100644 --- a/ihatemoney/models.py +++ b/ihatemoney/models.py @@ -4,6 +4,7 @@ from datetime import datetime from flask_sqlalchemy import SQLAlchemy, BaseQuery from flask import g, current_app +from debts import settle from sqlalchemy import orm from itsdangerous import (TimedJSONWebSignatureSerializer, URLSafeSerializer, BadSignature, SignatureExpired) @@ -106,46 +107,14 @@ class Project(db.Model): return pretty_transactions # cache value for better performance - balance = self.balance - credits, debts, transactions = [], [], [] - # Create lists of credits and debts - for person in self.members: - if round(balance[person.id], 2) > 0: - credits.append({"person": person, "balance": balance[person.id]}) - elif round(balance[person.id], 2) < 0: - debts.append({"person": person, "balance": -balance[person.id]}) - - # Try and find exact matches - for credit in credits: - match = self.exactmatch(round(credit["balance"], 2), debts) - if match: - for m in match: - transactions.append({ - "ower": m["person"], - "receiver": credit["person"], - "amount": m["balance"] - }) - debts.remove(m) - credits.remove(credit) - # Split any remaining debts & credits - while credits and debts: - - if credits[0]["balance"] > debts[0]["balance"]: - transactions.append({ - "ower": debts[0]["person"], - "receiver": credits[0]["person"], - "amount": debts[0]["balance"] - }) - credits[0]["balance"] = credits[0]["balance"] - debts[0]["balance"] - del debts[0] - else: - transactions.append({ - "ower": debts[0]["person"], - "receiver": credits[0]["person"], - "amount": credits[0]["balance"] - }) - debts[0]["balance"] = debts[0]["balance"] - credits[0]["balance"] - del credits[0] + members = {person.id: person for person in self.members} + settle_plan = settle(self.balance.items()) or [] + + transactions = [{ + 'ower': members[ower_id], + 'receiver': members[receiver_id], + 'amount': amount + } for ower_id, amount, receiver_id in settle_plan] return prettify(transactions, pretty_output) diff --git a/ihatemoney/tests/tests.py b/ihatemoney/tests/tests.py index 551af96..9d611d7 100644 --- a/ihatemoney/tests/tests.py +++ b/ihatemoney/tests/tests.py @@ -859,7 +859,7 @@ class BudgetTestCase(IhatemoneyTestCase): members[t['receiver']] += t['amount'] balance = models.Project.query.get("raclette").balance for m, a in members.items(): - self.assertEqual(a, balance[m.id]) + assert abs(a - balance[m.id]) < 0.01 return def test_settle_zero(self): @@ -980,18 +980,23 @@ class BudgetTestCase(IhatemoneyTestCase): # generate json export of transactions resp = self.client.get("/raclette/export/transactions.json") - expected = [{"amount": 127.33, "receiver": "fred", "ower": "alexis"}, - {"amount": 55.34, "receiver": "fred", "ower": "tata"}, - {"amount": 2.00, "receiver": "fred", "ower": "p\xe9p\xe9"}] + expected = [ + {"amount": 2.00, "receiver": "fred", "ower": "p\xe9p\xe9"}, + {"amount": 55.34, "receiver": "fred", "ower": "tata"}, + {"amount": 127.33, "receiver": "fred", "ower": "alexis"}, + ] + self.assertEqual(json.loads(resp.data.decode('utf-8')), expected) # generate csv export of transactions resp = self.client.get("/raclette/export/transactions.csv") - expected = ["amount,receiver,ower", - "127.33,fred,alexis", - "55.34,fred,tata", - "2.0,fred,pépé"] + expected = [ + "amount,receiver,ower", + "2.0,fred,pépé", + "55.34,fred,tata", + "127.33,fred,alexis", + ] received_lines = resp.data.decode('utf-8').split("\n") for i, line in enumerate(expected): |
