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 @@
{% 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