diff --git a/copanier/emails.py b/copanier/emails.py index 3ab9636..9daf9cd 100644 --- a/copanier/emails.py +++ b/copanier/emails.py @@ -37,7 +37,7 @@ def send_order(request, env, person, delivery, order): env, "order_summary", person.email, - f"{config.SITE_NAME} : résumé de la commande {delivery.producer}", + f"{config.SITE_NAME} : résumé de la commande {delivery.name}", order=order, delivery=delivery, request=request diff --git a/copanier/imports.py b/copanier/imports.py index 1697e3c..802028d 100644 --- a/copanier/imports.py +++ b/copanier/imports.py @@ -24,7 +24,10 @@ def products_from_xlsx(delivery, data): delivery.products = [] for row in rows[1:]: raw = {k: v for k, v in dict(zip(headers, row)).items() if v} - delivery.products.append(Product(**raw)) + try: + delivery.products.append(Product(**raw)) + except TypeError as e: + raise ValueError(f"Erreur durant l'importation de {raw['ref']}") delivery.persist() diff --git a/copanier/models.py b/copanier/models.py index ec6987d..7232ff5 100644 --- a/copanier/models.py +++ b/copanier/models.py @@ -96,6 +96,7 @@ class Product(Base): url: str = "" img: str = "" packing: int = None + producer: str = "" def __str__(self): out = self.name @@ -133,9 +134,13 @@ class Order(Base): yield from self.products.items() def total(self, products): + def _get_price(ref): + product = products.get(ref) + return product.price if product else 0 + products = {p.ref: p for p in products} return round( - sum(p.quantity * products[ref].price for ref, p in self.products.items()), 2 + sum(p.quantity * _get_price(ref) for ref, p in self.products.items()), 2 ) @property @@ -153,7 +158,7 @@ class Delivery(Base): ADJUSTMENT = 2 ARCHIVED = 3 - producer: str + name: str from_date: datetime_field to_date: datetime_field order_before: datetime_field @@ -183,6 +188,10 @@ class Delivery(Base): def total(self): return round(sum(o.total(self.products) for o in self.orders.values()), 2) + @property + def has_multiple_producers(self): + return len(set([p.producer for p in self.products])) > 1 + @property def is_open(self): return datetime.now().date() <= self.order_before.date() @@ -288,3 +297,12 @@ class Delivery(Base): def has_order(self, person): return person.email in self.orders + + def get_products_by(self, producer): + return [p for p in self.products if p.producer == producer] + + def total_for_producer(self, producer, person=None): + producer_products = [p for p in self.products if p.producer == producer] + if person: + return self.orders.get(person).total(producer_products) + return round(sum(o.total(producer_products) for o in self.orders.values()), 2) diff --git a/copanier/reports.py b/copanier/reports.py index deffd35..2d720f0 100644 --- a/copanier/reports.py +++ b/copanier/reports.py @@ -41,10 +41,10 @@ def full(delivery): wb = Workbook() ws = wb.active ws.title = f"{delivery.producer} {delivery.from_date.date()}" - headers = ["ref", "produit", "prix"] + [e for e in delivery.orders] + ["total"] + headers = ["ref", "produit", "prix", "producer"] + [e for e in delivery.orders] + ["total"] ws.append(headers) for product in delivery.products: - row = [product.ref, str(product), product.price] + row = [product.ref, str(product), product.price, product.producer] for order in delivery.orders.values(): wanted = order.products.get(product.ref) row.append(wanted.quantity if wanted else 0) diff --git a/copanier/static/app.css b/copanier/static/app.css index 94aef00..1d66a02 100644 --- a/copanier/static/app.css +++ b/copanier/static/app.css @@ -350,6 +350,7 @@ td.total, th.total { background-color: #bbb; } + tr:nth-child(even) { background-color: #ddd; } @@ -362,6 +363,15 @@ thead tr * { thead th + th { border-left: 1px solid white; } + +tr .producer { + border-bottom: 1px solid #aaa; +} + +tr.subtotal { + background-color: #bbb; +} + article.order { max-width: 1200px; margin-left: auto; diff --git a/copanier/templates/delivery.html b/copanier/templates/delivery.html index e8e0e77..085a50d 100644 --- a/copanier/templates/delivery.html +++ b/copanier/templates/delivery.html @@ -7,6 +7,9 @@
Producteur | + {% endif %}Produit | Prix | {% if delivery.has_packing %} @@ -27,6 +30,9 @@||||
---|---|---|---|---|---|---|
{{ product.producer }} | + {% endif %}{{ product }} | {{ product.price | round(2) }} € | {% if delivery.has_packing %} @@ -35,22 +41,39 @@{{ delivery.product_wanted(product) }} {% if delivery.status == delivery.ADJUSTMENT and delivery.product_missing(product) %} (−{{ delivery.product_missing(product) }}) - {% if request.user.is_staff %}ajuster{% endif %} + {% if request.user.is_staff %}ajuster{% endif %} {% endif %} | {% for email, order in delivery.orders.items() %}{{ order[product.ref].quantity or "—" }} | {% endfor %}||
— | +Sous Total {{ product.producer }} | +— | + {% if delivery.has_packing %} ++ {% endif %} + | {{ delivery.total_for_producer(product.producer) }} € | + {% for email in delivery.orders.keys() %} +{{ delivery.total_for_producer(product.producer, email) }} € | + {% endfor %} +|
Total | — | + {% if delivery.has_multiple_producers %} +— | + {% endif %} {% if delivery.has_packing %}— | {% endif %}{{ delivery.total }} € | {% for email, order in delivery.orders.items() %} -{{ order.total(delivery.products) }} € | +{{ order.total(delivery.products) }} € | {% endfor %}