diff --git a/copanier/__init__.py b/copanier/__init__.py index c4b7afc..2158e07 100644 --- a/copanier/__init__.py +++ b/copanier/__init__.py @@ -396,7 +396,7 @@ async def adjust_product(request, response, id, ref): response.html("adjust_product.html", {"delivery": delivery, "product": product}) -@app.route("/livraison/{id}/soldes", methods=["GET", "POST"]) +@app.route("/livraison/{id}/solde", methods=["GET", "POST"]) @staff_only async def delivery_balance(request, response, id): delivery = Delivery.load(id) @@ -412,6 +412,12 @@ async def delivery_balance(request, response, id): response.html("delivery_balance.html", {"delivery": delivery}) +@app.route("/livraison/{id}/solde.xlsx", methods=["GET"]) +async def delivery_balance_report(request, response, id): + delivery = Delivery.load(id) + response.xlsx(reports.balance(delivery)) + + def configure(): config.init() diff --git a/copanier/reports.py b/copanier/reports.py index 89232b0..d88e9a4 100644 --- a/copanier/reports.py +++ b/copanier/reports.py @@ -68,3 +68,15 @@ def products(delivery): for product in delivery.products: ws.append([getattr(product, field) for field in fields]) return save_virtual_workbook(wb) + + +def balance(delivery): + wb = Workbook() + ws = wb.active + ws.title = f"Solde {delivery.producer}" + ws.append(["Adhérent", "Montant", "Payé"]) + for email, order in delivery.orders.items(): + ws.append( + [email, order.total(delivery.products), "oui" if order.paid else "non"] + ) + return save_virtual_workbook(wb) diff --git a/copanier/static/app.css b/copanier/static/app.css index 9b197de..25953c0 100644 --- a/copanier/static/app.css +++ b/copanier/static/app.css @@ -189,10 +189,12 @@ input[type=submit] { transition: all .2s ease; cursor: pointer; } -input[type=submit] { +input[type=submit], +input[type=submit] + a.button { margin-top: 5px; } +input[type=submit]:hover, .button:hover { color: #fff; background-color: var(--primary-color); diff --git a/copanier/templates/delivery.html b/copanier/templates/delivery.html index f2fad4b..a511071 100644 --- a/copanier/templates/delivery.html +++ b/copanier/templates/delivery.html @@ -91,7 +91,7 @@ {% if delivery.is_passed %}
  • - Gérer les soldes + Gérer les soldes
  • {% endif %} {% endif %} diff --git a/copanier/templates/delivery_balance.html b/copanier/templates/delivery_balance.html index dc5011b..f88128a 100644 --- a/copanier/templates/delivery_balance.html +++ b/copanier/templates/delivery_balance.html @@ -5,16 +5,21 @@

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

    - - {% for email, order in delivery.orders.items() %} - - - - - - {% endfor %} + + + + + {% for email, order in delivery.orders.items() %} + + + + + + {% endfor %} +
    PersonneMontantSoldée
    {{ email }}{{ order.total(delivery.products) }} €
    PersonneMontantSoldée
    {{ email }}{{ order.total(delivery.products) }} €
    - + +  Exporter
    {% endblock body %} diff --git a/copanier/templates/place_order.html b/copanier/templates/place_order.html index a15d6a0..eaba9b3 100644 --- a/copanier/templates/place_order.html +++ b/copanier/templates/place_order.html @@ -45,7 +45,7 @@ {% endif %} {% if delivery.status != delivery.CLOSED or request.user.is_staff %} - + {% endif %} Envoyer par courriel diff --git a/tests/test_reports.py b/tests/test_reports.py index 5790d3b..a21f6fe 100644 --- a/tests/test_reports.py +++ b/tests/test_reports.py @@ -6,7 +6,7 @@ from copanier import reports from copanier.models import Order, Product, ProductOrder -def test_summary_report(client, delivery): +def test_summary_report(delivery): delivery.products[0].packing = 6 delivery.products.append( Product(ref="456", name="yaourt", price="3.5", packing=4, unit="pot 125ml") @@ -23,3 +23,26 @@ def test_summary_report(client, delivery): ("456", "yaourt (pot 125ml)", 3.5, 4, "pot 125ml", 14), (None, None, None, None, "Total", 15.5), ] + + +def test_balance_report(delivery): + delivery.products = [ + Product(ref="123", name="lait", price="1.9", unit="1.5 litre"), + Product(ref="456", name="yaourt", price="3.5", unit="pot 125ml"), + ] + delivery.orders = { + "foo@bar.org": Order( + products={"123": ProductOrder(wanted=1), "456": ProductOrder(wanted=4)} + ), + "foo@foo.org": Order( + products={"123": ProductOrder(wanted=3), "456": ProductOrder(wanted=2)}, + paid=True, + ), + } + delivery.persist() + wb = load_workbook(filename=BytesIO(reports.balance(delivery))) + assert list(wb.active.values) == [ + ("Adhérent", "Montant", "Payé"), + ("foo@bar.org", 15.9, "non"), + ("foo@foo.org", 12.7, "oui"), + ] diff --git a/tests/test_views.py b/tests/test_views.py index d0f45e0..e5fe536 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -212,7 +212,7 @@ async def test_get_delivery_balance(client, delivery): delivery.from_date = datetime.now() - timedelta(days=1) delivery.orders["foo@bar.org"] = Order(products={"123": ProductOrder(wanted=2)}) delivery.persist() - resp = await client.get(f"/livraison/{delivery.id}/soldes") + resp = await client.get(f"/livraison/{delivery.id}/solde") doc = pq(resp.body) assert doc('[name="foo@bar.org"]') assert not doc('[name="foo@bar.org"]').attr("checked") @@ -220,7 +220,7 @@ async def test_get_delivery_balance(client, delivery): products={"123": ProductOrder(wanted=2)}, paid=True ) delivery.persist() - resp = await client.get(f"/livraison/{delivery.id}/soldes") + resp = await client.get(f"/livraison/{delivery.id}/solde") doc = pq(resp.body) assert doc('[name="foo@bar.org"]').attr("checked") @@ -230,7 +230,7 @@ async def test_post_delivery_balance(client, delivery): delivery.orders["foo@bar.org"] = Order(products={"123": ProductOrder(wanted=2)}) delivery.persist() body = {"foo@bar.org": "on"} - resp = await client.post(f"/livraison/{delivery.id}/soldes", body=body) + resp = await client.post(f"/livraison/{delivery.id}/solde", body=body) assert resp.status == 302 delivery = Delivery.load(id=delivery.id) assert delivery.orders["foo@bar.org"].paid is True