From 1794913997ba3695fb3c4da816b8384b475544b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20M=C3=A9taireau?= Date: Sun, 28 Apr 2019 15:59:42 +0200 Subject: [PATCH] Create multiple tabs for full delivery reports --- copanier/models.py | 6 ++++- copanier/reports.py | 66 ++++++++++++++++++++++++++++++--------------- 2 files changed, 50 insertions(+), 22 deletions(-) diff --git a/copanier/models.py b/copanier/models.py index 7232ff5..adc9cf7 100644 --- a/copanier/models.py +++ b/copanier/models.py @@ -188,9 +188,13 @@ class Delivery(Base): def total(self): return round(sum(o.total(self.products) for o in self.orders.values()), 2) + @property + def producers(self): + return list(set([p.producer for p in self.products])) + @property def has_multiple_producers(self): - return len(set([p.producer for p in self.products])) > 1 + return len(self.producers) > 1 @property def is_open(self): diff --git a/copanier/reports.py b/copanier/reports.py index 4f362e8..231ba09 100644 --- a/copanier/reports.py +++ b/copanier/reports.py @@ -5,35 +5,52 @@ from openpyxl.writer.excel import save_virtual_workbook from .models import Product +def summary_for_products(wb, title, delivery, total=None, products=None): + if products == None: + products = delivery.products + if total == None: + total = delivery.total -def summary(delivery): - wb = Workbook() - ws = wb.active - ws.title = f"{delivery.name} {delivery.from_date.date()}" - headers = [ + ws = wb.create_sheet(title) + ws.append([ "ref", "produit", "prix unitaire", "quantité commandée", "unité", "total", - ] - ws.append(headers) - for product in delivery.products: + ]) + for product in products: wanted = delivery.product_wanted(product) if not wanted: continue - ws.append( - [ - product.ref, - str(product), - product.price, - wanted, - product.unit, - round(product.price * wanted, 2), - ] - ) - ws.append(["", "", "", "", "Total", delivery.total]) + ws.append([ + product.ref, + str(product), + product.price, + wanted, + product.unit, + round(product.price * wanted, 2), + ]) + ws.append(["", "", "", "", "Total", total]) + + + +def summary(delivery): + wb = Workbook() + wb.remove(wb.active) + if delivery.has_multiple_producers: + for producer in delivery.producers: + summary_for_products( + wb, + producer, + delivery, + total=delivery.total_for_producer(producer), + products=delivery.get_products_by(producer) + ) + else: + summary_for_products(wb, f"{delivery.name} {delivery.from_date.date()}", delivery) + return save_virtual_workbook(wb) @@ -41,10 +58,14 @@ def full(delivery): wb = Workbook() ws = wb.active ws.title = f"{delivery.name} {delivery.from_date.date()}" - headers = ["ref", "produit", "prix", "producer"] + [e for e in delivery.orders] + ["total"] + headers = ["ref", "produit", "prix"] + [e for e in delivery.orders] + ["total"] + if delivery.has_multiple_producers: + headers.insert(1, "producer") ws.append(headers) for product in delivery.products: - row = [product.ref, str(product), product.price, product.producer] + row = [product.ref, str(product), product.price] + if delivery.has_multiple_producers: + row.insert(1, product.producer) for order in delivery.orders.values(): wanted = order.products.get(product.ref) row.append(wanted.quantity if wanted else 0) @@ -55,6 +76,9 @@ def full(delivery): + [round(o.total(delivery.products),2) for o in delivery.orders.values()] + [round(delivery.total, 2)] ) + if delivery.has_multiple_producers: + footer.insert(1, "") + ws.append(footer) return save_virtual_workbook(wb)