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/models.py | |
| 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/models.py')
| -rw-r--r-- | ihatemoney/models.py | 49 |
1 files changed, 9 insertions, 40 deletions
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) |
