diff --git a/src/purchase/templates/purchase/reports.html b/src/purchase/templates/purchase/reports.html index 7af90cb..0d7fef3 100644 --- a/src/purchase/templates/purchase/reports.html +++ b/src/purchase/templates/purchase/reports.html @@ -28,8 +28,7 @@

{% translate "Products" %}

{% include "purchase/snippets/report_products.html" %} - {{ products_sold_plot|safe }} - {{ products_turnover_plot|safe }} + {{ products_plot|safe }}

{% translate "Turnover by payment method" %}

{% include "purchase/snippets/report_payment_methods.html" %} diff --git a/src/purchase/views/reports.py b/src/purchase/views/reports.py index 76d8b70..6350c4f 100644 --- a/src/purchase/views/reports.py +++ b/src/purchase/views/reports.py @@ -31,8 +31,7 @@ class ReportsView(ProtectedViewsMixin, TemplateView): } products = Product.objects.with_turnover().with_sold() - products_sold_plot = self.get_products_sold_plot(products) - products_turnover_plot = self.get_products_turnover_plot(products) + products_plot = self.get_products_plot(products) baskets = list(Basket.objects.priced().order_by("created_at")) by_hour_plot = self.by_hour_plot(baskets) context.update( @@ -42,8 +41,7 @@ class ReportsView(ProtectedViewsMixin, TemplateView): "average_basket": Basket.objects.average_basket(), "average_basket_by_day": average_basket_by_day, "products": products, - "products_sold_plot": products_sold_plot, - "products_turnover_plot": products_turnover_plot, + "products_plot": products_plot, "by_hour_plot": by_hour_plot, "payment_methods": PaymentMethod.objects.with_turnover().with_sold(), "no_payment_method": Basket.objects.no_payment_method().priced(), @@ -51,33 +49,29 @@ class ReportsView(ProtectedViewsMixin, TemplateView): ) return context - def get_products_sold_plot(self, products: ProductQuerySet): + def get_products_plot(self, products: ProductQuerySet): labels = [] - values = [] + sold = [] + turnover = [] for product in products: labels.append(product.name) - values.append(product.sold) - fig = plt.figure() - plt.bar(labels, values) - plt.xticks(rotation=15) - image_data = StringIO() - plt.title(_("# sold")) - fig.savefig(image_data, format="svg") - image_data.seek(0) - return image_data.getvalue() + sold.append(product.sold) + turnover.append(product.turnover / 100) - def get_products_turnover_plot(self, products: ProductQuerySet): - labels = [] - values = [] - for product in products: - labels.append(product.name) - values.append(product.turnover / 100) - fig = plt.figure() - plt.bar(labels, values) - plt.xticks(rotation=15) + fig, ax1 = plt.subplots() + color = "tab:orange" + ax1.bar(labels, sold, width=0.8, color=color) + ax1.tick_params(axis="x", rotation=15) + ax1.set_ylabel(_("# sold"), color=color) + + color = "tab:blue" + ax2 = ax1.twinx() + ax2.bar(labels, turnover, width=0.4, color=color) + ax2.set_ylabel(_("Turnover by product"), color=color) plt.gca().yaxis.set_major_formatter(ticker.FormatStrFormatter("%.2f€")) + + fig.tight_layout() image_data = StringIO() - plt.title(_("Turnover")) fig.savefig(image_data, format="svg") image_data.seek(0) return image_data.getvalue()