mirror of
https://github.com/almet/copanier.git
synced 2025-04-28 19:42:37 +02:00
Remove paiement tracking
This commit is contained in:
parent
32dc720aff
commit
f046ae6fb0
10 changed files with 3 additions and 87 deletions
|
@ -16,6 +16,7 @@ The main differences are :
|
||||||
- A minimal interface to add / remove / update products from the website.
|
- A minimal interface to add / remove / update products from the website.
|
||||||
- Support for out of stock products.
|
- Support for out of stock products.
|
||||||
- Automatically compute a settlement plan (using the [debts library](https://framagit.org/almet/debts))
|
- Automatically compute a settlement plan (using the [debts library](https://framagit.org/almet/debts))
|
||||||
|
- Remove paiement tracking (as it conflicts with auto-settlement of debts)
|
||||||
- A special page with tools to ease delivery management
|
- A special page with tools to ease delivery management
|
||||||
- Drop support for CSV files
|
- Drop support for CSV files
|
||||||
- Send emails to producers referents, with an order summary
|
- Send emails to producers referents, with an order summary
|
||||||
|
|
|
@ -595,7 +595,6 @@ async def place_order(request, response, id):
|
||||||
return
|
return
|
||||||
|
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
|
|
||||||
# When the delivery is closed, only staff can access.
|
# When the delivery is closed, only staff can access.
|
||||||
if delivery.status == delivery.CLOSED and not (user and user.is_staff):
|
if delivery.status == delivery.CLOSED and not (user and user.is_staff):
|
||||||
response.message("La livraison est fermée", "error")
|
response.message("La livraison est fermée", "error")
|
||||||
|
@ -603,7 +602,7 @@ async def place_order(request, response, id):
|
||||||
return
|
return
|
||||||
|
|
||||||
form = request.form
|
form = request.form
|
||||||
order = Order(paid=form.bool("paid", False))
|
order = Order()
|
||||||
for product in delivery.products:
|
for product in delivery.products:
|
||||||
try:
|
try:
|
||||||
wanted = form.int(f"wanted:{product.ref}", 0)
|
wanted = form.int(f"wanted:{product.ref}", 0)
|
||||||
|
|
|
@ -221,7 +221,6 @@ class ProductOrder(Base):
|
||||||
@dataclass
|
@dataclass
|
||||||
class Order(Base):
|
class Order(Base):
|
||||||
products: Dict[str, ProductOrder] = field(default_factory=dict)
|
products: Dict[str, ProductOrder] = field(default_factory=dict)
|
||||||
paid: bool = False
|
|
||||||
|
|
||||||
def __getitem__(self, ref):
|
def __getitem__(self, ref):
|
||||||
if isinstance(ref, Product):
|
if isinstance(ref, Product):
|
||||||
|
|
|
@ -92,15 +92,3 @@ def products(delivery):
|
||||||
producer_sheet.append([getattr(producer, field) for field in producer_fields])
|
producer_sheet.append([getattr(producer, field) for field in producer_fields])
|
||||||
|
|
||||||
return save_virtual_workbook(wb)
|
return save_virtual_workbook(wb)
|
||||||
|
|
||||||
|
|
||||||
def balance(delivery):
|
|
||||||
wb = Workbook()
|
|
||||||
ws = wb.active
|
|
||||||
ws.title = f"Solde {delivery.name}"
|
|
||||||
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)
|
|
||||||
|
|
|
@ -455,9 +455,6 @@ hr {
|
||||||
.notification i {
|
.notification i {
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
}
|
}
|
||||||
.not-paid {
|
|
||||||
background-color: var(--warning-color);
|
|
||||||
}
|
|
||||||
.toggle {
|
.toggle {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
{% if not list_only %}
|
{% if not list_only %}
|
||||||
{% for orderer, order in delivery.orders.items() %}
|
{% for orderer, order in delivery.orders.items() %}
|
||||||
{% set orderer_name = request.groups.groups[orderer].name %}
|
{% set orderer_name = request.groups.groups[orderer].name %}
|
||||||
<th class="person{% if delivery.is_passed and not order.paid %} not-paid{% endif %}">
|
<th class="person">
|
||||||
{% if request.user and (request.user.is_staff or request.user.is_referent(delivery)) %}
|
{% if request.user and (request.user.is_staff or request.user.is_referent(delivery)) %}
|
||||||
<a href="/livraison/{{ delivery.id }}/commander?orderer={{ orderer }}" title="{{ orderer }}">{{ orderer_name }}</a>
|
<a href="/livraison/{{ delivery.id }}/commander?orderer={{ orderer }}" title="{{ orderer }}">{{ orderer_name }}</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|
|
@ -9,7 +9,4 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if request.user.email in delivery.orders %}
|
{% if request.user.email in delivery.orders %}
|
||||||
<span class="flag" title="Mon solde"><i class="icon-wallet"></i> {{ delivery.total_for(request.user) }} €</span>
|
<span class="flag" title="Mon solde"><i class="icon-wallet"></i> {{ delivery.total_for(request.user) }} €</span>
|
||||||
{% if delivery.status == delivery.CLOSED and delivery.is_passed and not delivery.orders[request.user.email].paid %}
|
|
||||||
<span class="flag warning" title="Ma commande n'est pas marquée comme soldée"><i class="icon-caution"></i> Commande à solder</span>
|
|
||||||
{% endif %}
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -46,9 +46,6 @@
|
||||||
</table>
|
</table>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<p>Total: {{ order.total(delivery.products) if order else 0 }} €</p>
|
<p>Total: {{ order.total(delivery.products) if order else 0 }} €</p>
|
||||||
{% if delivery.is_passed %}
|
|
||||||
<p>Commande soldée: <input type="checkbox" name="paid" {% if order.paid %}checked{% endif %}></p>
|
|
||||||
{% endif %}
|
|
||||||
<input type="hidden" name="email" value="{{ person.email }}">
|
<input type="hidden" name="email" value="{{ person.email }}">
|
||||||
{% if delivery.status != delivery.CLOSED or request.user.is_staff %}
|
{% if delivery.status != delivery.CLOSED or request.user.is_staff %}
|
||||||
<input type="submit" value="Enregistrer la commande" class="primary">
|
<input type="submit" value="Enregistrer la commande" class="primary">
|
||||||
|
|
|
@ -23,26 +23,3 @@ def test_summary_report(delivery):
|
||||||
("456", "yaourt (pot 125ml)", 3.5, 4, "pot 125ml", 14),
|
("456", "yaourt (pot 125ml)", 3.5, 4, "pot 125ml", 14),
|
||||||
(None, None, None, None, "Total", 15.5),
|
(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"),
|
|
||||||
]
|
|
||||||
|
|
|
@ -88,17 +88,6 @@ async def test_place_order_with_empty_string(client, delivery):
|
||||||
delivery = Delivery.load(id=delivery.id)
|
delivery = Delivery.load(id=delivery.id)
|
||||||
assert not delivery.orders
|
assert not delivery.orders
|
||||||
|
|
||||||
|
|
||||||
async def test_change_paid_status_when_placing_order(client, delivery):
|
|
||||||
delivery.persist()
|
|
||||||
body = {"wanted:123": "3", "paid": 1}
|
|
||||||
resp = await client.post(f"/livraison/{delivery.id}/commander", body=body)
|
|
||||||
assert resp.status == 302
|
|
||||||
delivery = Delivery.load(id=delivery.id)
|
|
||||||
assert delivery.orders["foo@bar.org"]
|
|
||||||
assert delivery.orders["foo@bar.org"].paid is True
|
|
||||||
|
|
||||||
|
|
||||||
async def test_get_place_order_with_closed_delivery(client, delivery, monkeypatch):
|
async def test_get_place_order_with_closed_delivery(client, delivery, monkeypatch):
|
||||||
monkeypatch.setattr("copanier.config.STAFF", ["someone@else.org"])
|
monkeypatch.setattr("copanier.config.STAFF", ["someone@else.org"])
|
||||||
delivery.order_before = datetime.now() - timedelta(days=1)
|
delivery.order_before = datetime.now() - timedelta(days=1)
|
||||||
|
@ -225,34 +214,6 @@ async def test_only_staff_can_adjust_product(client, delivery, monkeypatch):
|
||||||
assert delivery.orders["foo@bar.org"].products["123"].adjustment == 0
|
assert delivery.orders["foo@bar.org"].products["123"].adjustment == 0
|
||||||
|
|
||||||
|
|
||||||
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}/solde")
|
|
||||||
doc = pq(resp.body)
|
|
||||||
assert doc('[name="foo@bar.org"]')
|
|
||||||
assert not doc('[name="foo@bar.org"]').attr("checked")
|
|
||||||
delivery.orders["foo@bar.org"] = Order(
|
|
||||||
products={"123": ProductOrder(wanted=2)}, paid=True
|
|
||||||
)
|
|
||||||
delivery.persist()
|
|
||||||
resp = await client.get(f"/livraison/{delivery.id}/solde")
|
|
||||||
doc = pq(resp.body)
|
|
||||||
assert doc('[name="foo@bar.org"]').attr("checked")
|
|
||||||
|
|
||||||
|
|
||||||
async def test_post_delivery_balance(client, delivery):
|
|
||||||
delivery.order_before = datetime.now() - timedelta(days=1)
|
|
||||||
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}/solde", body=body)
|
|
||||||
assert resp.status == 302
|
|
||||||
delivery = Delivery.load(id=delivery.id)
|
|
||||||
assert delivery.orders["foo@bar.org"].paid is True
|
|
||||||
|
|
||||||
|
|
||||||
async def test_export_products(client, delivery):
|
async def test_export_products(client, delivery):
|
||||||
delivery.persist()
|
delivery.persist()
|
||||||
resp = await client.get(f"/livraison/{delivery.id}/exporter")
|
resp = await client.get(f"/livraison/{delivery.id}/exporter")
|
||||||
|
|
Loading…
Reference in a new issue