From 2e524c92c137696b3f0f9efcbc4dc29799b901f9 Mon Sep 17 00:00:00 2001 From: Alexis M Date: Tue, 24 Sep 2019 21:09:43 +0200 Subject: [PATCH] Use debts to compute and solve the balances --- copanier/__init__.py | 46 +++++++++++---- copanier/templates/delivery.html | 4 +- copanier/templates/delivery_balance.html | 71 ++++++++++++++++-------- setup.cfg | 1 + 4 files changed, 87 insertions(+), 35 deletions(-) diff --git a/copanier/__init__.py b/copanier/__init__.py index 1e8e8c9..3c307b4 100644 --- a/copanier/__init__.py +++ b/copanier/__init__.py @@ -9,6 +9,9 @@ from roll import Roll, Response, HttpError from roll.extensions import traceback, simple_server, static from slugify import slugify +from debts.solver import order_balance, check_balance, reduce_balance +from collections import defaultdict +from functools import partial from . import config, reports, session, utils, emails, loggers, imports from .models import Delivery, Order, Person, Product, ProductOrder, Groups, Group @@ -492,6 +495,7 @@ async def import_commande(request, response, id): response.message(f"Yallah! La commande de {email} a bien été importée !") response.redirect = f"/livraison/{delivery.id}" + @app.route("/livraison/{id}/importer/commandes", methods=["POST"]) @staff_only async def import_multiple_commands(request, response, id): @@ -556,20 +560,42 @@ async def adjust_product(request, response, id, ref): response.html("adjust_product.html", {"delivery": delivery, "product": product}) -@app.route("/livraison/{id}/solde", methods=["GET", "POST"]) +@app.route("/livraison/{id}/solde", methods=["GET"]) @staff_only async def delivery_balance(request, response, id): delivery = Delivery.load(id) + groups = request['groups'] delivery_url = f"/livraison/{delivery.id}" - if request.method == "POST": - form = request.form - for email, order in delivery.orders.items(): - order.paid = form.bool(email, False) - delivery.persist() - response.message(f"Les soldes ont bien été mis à jour!") - response.redirect = delivery_url - else: - response.html("delivery_balance.html", {"delivery": delivery}) + + balance = [] + for group_id, order in delivery.orders.items(): + balance.append((group_id, order.total(delivery.products) * -1)) + + for producer in delivery.producers.values(): + group = groups.get_user_group(producer.referent) + group_id = group.id if group else producer.referent + amount = delivery.total_for_producer(producer.id) + if amount: + balance.append((group_id, amount)) + + debiters, crediters = order_balance(balance) + check_balance(debiters, crediters) + results = reduce_balance(debiters[:], crediters[:]) + + results_dict = defaultdict(partial(defaultdict, float)) + + for debiter, amount, crediter in results: + results_dict[debiter][crediter] = amount + + # from pdb import set_trace; set_trace() + + response.html("delivery_balance.html", { + "delivery": delivery, + "debiters": debiters, + "crediters": crediters, + "results": results_dict, + "groups": groups.groups, + }) @app.route("/livraison/{id}/solde.xlsx", methods=["GET"]) diff --git a/copanier/templates/delivery.html b/copanier/templates/delivery.html index 46d4b1e..bdc5dbc 100644 --- a/copanier/templates/delivery.html +++ b/copanier/templates/delivery.html @@ -48,11 +48,9 @@ {% include "includes/modal_copy_emails.html" %} {% endwith %} - {% if delivery.is_passed %}
  • - Gérer les soldes + Répartition des paiements
  • {% endif %} - {% endif %} {% endblock body %} diff --git a/copanier/templates/delivery_balance.html b/copanier/templates/delivery_balance.html index f88128a..cc589ee 100644 --- a/copanier/templates/delivery_balance.html +++ b/copanier/templates/delivery_balance.html @@ -1,25 +1,52 @@ {% extends "base.html" %} - +{% block head %} + +{% endblock head %} {% block body %} -
    -

    {{ delivery.producer }} — Gérer les soldes

    -
    - - - - - - {% for email, order in delivery.orders.items() %} - - - - - - {% endfor %} - -
    PersonneMontantSoldée
    {{ email }}{{ order.total(delivery.products) }} €
    - -  Exporter -
    -
    +

    Répartition des paiements

    + + + + {% for crediter in crediters %}{% endfor %} + + {% for debiter in debiters %} + + + {% for crediter in crediters %} + {% set due_amount = results[debiter[0]][crediter[0]] | round(2) %} + + + {% endfor %} + + {% endfor %} +
    {% if crediter[0] in groups %} {{ groups[crediter[0]].name }}{% else %}{{ crediter[0] }}{% endif %} (+{{ crediter[1] | round(2) }})
    {% if debiter[0] in groups %} {{ groups[debiter[0]].name }}{% else %}{{ debiter[0] }}{% endif %} ({{ debiter[1] | round(2) }}){% if due_amount != 0.00 %}{{due_amount}}{% endif %}
    + {% endblock body %} diff --git a/setup.cfg b/setup.cfg index 389d7b9..fe9ba15 100644 --- a/setup.cfg +++ b/setup.cfg @@ -14,6 +14,7 @@ install_requires = ujson==1.35 minicli==0.4.4 python-slugify==3.0.2 + debts==0.4 [options.extras_require] dev =