mirror of
https://github.com/Crocmagnon/checkout.git
synced 2024-11-22 16:18:03 +01:00
Improve reports
This commit is contained in:
parent
150632e9c5
commit
13fd6a27a8
6 changed files with 58 additions and 12 deletions
|
@ -21,6 +21,9 @@ class PaymentMethodQuerySet(models.QuerySet):
|
|||
)
|
||||
)
|
||||
|
||||
def with_sold(self):
|
||||
return self.annotate(sold=Count("baskets", distinct=True))
|
||||
|
||||
|
||||
class PaymentMethod(Model):
|
||||
name = models.CharField(max_length=50, unique=True)
|
||||
|
@ -99,6 +102,9 @@ class BasketQuerySet(models.QuerySet):
|
|||
price=Sum(F("items__quantity") * F("items__product__unit_price_cents"))
|
||||
)
|
||||
|
||||
def no_payment_method(self):
|
||||
return self.filter(payment_method=None)
|
||||
|
||||
|
||||
class Basket(Model):
|
||||
payment_method = models.ForeignKey(
|
||||
|
@ -112,7 +118,7 @@ class Basket(Model):
|
|||
objects = BasketQuerySet.as_manager()
|
||||
|
||||
def __str__(self):
|
||||
return f"Panier #{self.id}"
|
||||
return f"Basket #{self.id}"
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse("purchase:update", args=(self.pk,))
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
{% block content %}
|
||||
{% if object %}
|
||||
<h1>{{ object }}</h1>
|
||||
<p>{{ object.created_at }}</p>
|
||||
{% else %}
|
||||
<h1>New basket</h1>
|
||||
{% endif %}
|
||||
|
|
|
@ -4,16 +4,15 @@
|
|||
{% block content %}
|
||||
<h1>Reports</h1>
|
||||
<h2>Total turnover</h2>
|
||||
<ul>
|
||||
<li>
|
||||
{{ total|currency }}
|
||||
</li>
|
||||
</ul>
|
||||
<h2>Turnover by day</h2>
|
||||
<ul><li>{{ total|currency }}</li></ul>
|
||||
|
||||
<h2>Products</h2>
|
||||
{% include "purchase/snippets/report_products.html" %}
|
||||
<h2>Turnover by product by day</h2>
|
||||
|
||||
<h2>Turnover by payment method</h2>
|
||||
<h2>Turnover by payment method by day</h2>
|
||||
{% include "purchase/snippets/report_payment_methods.html" %}
|
||||
|
||||
<h2>Baskets without payment method</h2>
|
||||
{% include "purchase/snippets/report_no_payment_method.html" %}
|
||||
|
||||
{% endblock %}
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
{% load purchase %}
|
||||
|
||||
<table class="table table-hover table-sm">
|
||||
<thead><tr>
|
||||
<th scope="col">Basket ID</th>
|
||||
<th scope="col">Price</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
{% for basket in no_payment_method %}
|
||||
<tr>
|
||||
<th scope="row">
|
||||
<a href="{% url "purchase:update" basket.id %}">
|
||||
{{ basket }}
|
||||
</a>
|
||||
</th>
|
||||
<td>{{ basket.price|currency }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
|
@ -0,0 +1,18 @@
|
|||
{% load purchase %}
|
||||
|
||||
<table class="table table-hover table-sm">
|
||||
<thead><tr>
|
||||
<th scope="col">Payment method</th>
|
||||
<th scope="col"># baskets</th>
|
||||
<th scope="col">Turnover</th>
|
||||
</tr></thead>
|
||||
<tbody>
|
||||
{% for payment_method in payment_methods %}
|
||||
<tr>
|
||||
<th scope="row">{{ payment_method }}</th>
|
||||
<td>{{ payment_method.sold }}</td>
|
||||
<td>{{ payment_method.turnover|currency }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
|
@ -2,9 +2,11 @@ from django.db.models import Sum
|
|||
from django.views.generic import TemplateView
|
||||
|
||||
from purchase.models import Basket, PaymentMethod, Product
|
||||
from purchase.views.utils import ProtectedViewsMixin
|
||||
|
||||
|
||||
class ReportsView(TemplateView):
|
||||
class ReportsView(ProtectedViewsMixin, TemplateView):
|
||||
permission_required = ["purchase.view_basket"]
|
||||
template_name = "purchase/reports.html"
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
|
@ -12,9 +14,9 @@ class ReportsView(TemplateView):
|
|||
context.update(
|
||||
{
|
||||
"total": Basket.objects.priced().aggregate(total=Sum("price"))["total"],
|
||||
"by_day": {},
|
||||
"products": Product.objects.with_turnover().with_sold(),
|
||||
"payment_methods": PaymentMethod.objects.with_turnover(),
|
||||
"payment_methods": PaymentMethod.objects.with_turnover().with_sold(),
|
||||
"no_payment_method": Basket.objects.no_payment_method().priced(),
|
||||
}
|
||||
)
|
||||
return context
|
||||
|
|
Loading…
Reference in a new issue