Fix #301 -- Add net revenue to sales overview (#313)

This commit is contained in:
Tobias Kunze
2016-11-10 22:24:43 +01:00
committed by Raphael Michel
parent 5999604e8e
commit 2f0c7c0ebc
5 changed files with 53 additions and 41 deletions

View File

@@ -79,26 +79,26 @@ def order_overview(event: Event) -> Tuple[List[Tuple[ItemCategory, List[Item]]],
order__event=event order__event=event
).values( ).values(
'item', 'variation', 'order__status' 'item', 'variation', 'order__status'
).annotate(cnt=Count('id'), price=Sum('price')).order_by() ).annotate(cnt=Count('id'), price=Sum('price'), tax_value=Sum('tax_value')).order_by()
num_canceled = { num_canceled = {
(p['item'], p['variation']): (p['cnt'], p['price']) (p['item'], p['variation']): (p['cnt'], p['price'], p['price'] - p['tax_value'])
for p in counters if p['order__status'] == Order.STATUS_CANCELED for p in counters if p['order__status'] == Order.STATUS_CANCELED
} }
num_refunded = { num_refunded = {
(p['item'], p['variation']): (p['cnt'], p['price']) (p['item'], p['variation']): (p['cnt'], p['price'], p['price'] - p['tax_value'])
for p in counters if p['order__status'] == Order.STATUS_REFUNDED for p in counters if p['order__status'] == Order.STATUS_REFUNDED
} }
num_paid = { num_paid = {
(p['item'], p['variation']): (p['cnt'], p['price']) (p['item'], p['variation']): (p['cnt'], p['price'], p['price'] - p['tax_value'])
for p in counters if p['order__status'] == Order.STATUS_PAID for p in counters if p['order__status'] == Order.STATUS_PAID
} }
num_s_pending = { num_s_pending = {
(p['item'], p['variation']): (p['cnt'], p['price']) (p['item'], p['variation']): (p['cnt'], p['price'], p['price'] - p['tax_value'])
for p in counters if p['order__status'] == Order.STATUS_PENDING for p in counters if p['order__status'] == Order.STATUS_PENDING
} }
num_expired = { num_expired = {
(p['item'], p['variation']): (p['cnt'], p['price']) (p['item'], p['variation']): (p['cnt'], p['price'], p['price'] - p['tax_value'])
for p in counters if p['order__status'] == Order.STATUS_EXPIRED for p in counters if p['order__status'] == Order.STATUS_EXPIRED
} }
num_pending = dictsum(num_s_pending, num_expired) num_pending = dictsum(num_s_pending, num_expired)
@@ -110,22 +110,22 @@ def order_overview(event: Event) -> Tuple[List[Tuple[ItemCategory, List[Item]]],
if item.has_variations: if item.has_variations:
for var in item.all_variations: for var in item.all_variations:
variid = var.id variid = var.id
var.num_total = num_total.get((item.id, variid), (0, 0)) var.num_total = num_total.get((item.id, variid), (0, 0, 0))
var.num_pending = num_pending.get((item.id, variid), (0, 0)) var.num_pending = num_pending.get((item.id, variid), (0, 0, 0))
var.num_canceled = num_canceled.get((item.id, variid), (0, 0)) var.num_canceled = num_canceled.get((item.id, variid), (0, 0, 0))
var.num_refunded = num_refunded.get((item.id, variid), (0, 0)) var.num_refunded = num_refunded.get((item.id, variid), (0, 0, 0))
var.num_paid = num_paid.get((item.id, variid), (0, 0)) var.num_paid = num_paid.get((item.id, variid), (0, 0, 0))
item.num_total = tuplesum(var.num_total for var in item.all_variations) item.num_total = tuplesum(var.num_total for var in item.all_variations)
item.num_pending = tuplesum(var.num_pending for var in item.all_variations) item.num_pending = tuplesum(var.num_pending for var in item.all_variations)
item.num_canceled = tuplesum(var.num_canceled for var in item.all_variations) item.num_canceled = tuplesum(var.num_canceled for var in item.all_variations)
item.num_refunded = tuplesum(var.num_refunded for var in item.all_variations) item.num_refunded = tuplesum(var.num_refunded for var in item.all_variations)
item.num_paid = tuplesum(var.num_paid for var in item.all_variations) item.num_paid = tuplesum(var.num_paid for var in item.all_variations)
else: else:
item.num_total = num_total.get((item.id, None), (0, 0)) item.num_total = num_total.get((item.id, None), (0, 0, 0))
item.num_pending = num_pending.get((item.id, None), (0, 0)) item.num_pending = num_pending.get((item.id, None), (0, 0, 0))
item.num_canceled = num_canceled.get((item.id, None), (0, 0)) item.num_canceled = num_canceled.get((item.id, None), (0, 0, 0))
item.num_refunded = num_refunded.get((item.id, None), (0, 0)) item.num_refunded = num_refunded.get((item.id, None), (0, 0, 0))
item.num_paid = num_paid.get((item.id, None), (0, 0)) item.num_paid = num_paid.get((item.id, None), (0, 0, 0))
nonecat = ItemCategory(name=_('Uncategorized')) nonecat = ItemCategory(name=_('Uncategorized'))
# Regroup those by category # Regroup those by category
@@ -154,27 +154,27 @@ def order_overview(event: Event) -> Tuple[List[Tuple[ItemCategory, List[Item]]],
payment_items = [] payment_items = []
counters = event.orders.values('payment_provider', 'status').annotate( counters = event.orders.values('payment_provider', 'status').annotate(
cnt=Count('id'), payment_fee=Sum('payment_fee') cnt=Count('id'), payment_fee=Sum('payment_fee'), tax_value=Sum('payment_fee_tax_value')
).order_by() ).order_by()
num_canceled = { num_canceled = {
o['payment_provider']: (o['cnt'], o['payment_fee']) o['payment_provider']: (o['cnt'], o['payment_fee'], o['payment_fee'] - o['tax_value'])
for o in counters if o['status'] == Order.STATUS_CANCELED for o in counters if o['status'] == Order.STATUS_CANCELED
} }
num_refunded = { num_refunded = {
o['payment_provider']: (o['cnt'], o['payment_fee']) o['payment_provider']: (o['cnt'], o['payment_fee'], o['payment_fee'] - o['tax_value'])
for o in counters if o['status'] == Order.STATUS_REFUNDED for o in counters if o['status'] == Order.STATUS_REFUNDED
} }
num_s_pending = { num_s_pending = {
o['payment_provider']: (o['cnt'], o['payment_fee']) o['payment_provider']: (o['cnt'], o['payment_fee'], o['payment_fee'] - o['tax_value'])
for o in counters if o['status'] == Order.STATUS_PENDING for o in counters if o['status'] == Order.STATUS_PENDING
} }
num_expired = { num_expired = {
o['payment_provider']: (o['cnt'], o['payment_fee']) o['payment_provider']: (o['cnt'], o['payment_fee'], o['payment_fee'] - o['tax_value'])
for o in counters if o['status'] == Order.STATUS_EXPIRED for o in counters if o['status'] == Order.STATUS_EXPIRED
} }
num_paid = { num_paid = {
o['payment_provider']: (o['cnt'], o['payment_fee']) o['payment_provider']: (o['cnt'], o['payment_fee'], o['payment_fee'] - o['tax_value'])
for o in counters if o['status'] == Order.STATUS_PAID for o in counters if o['status'] == Order.STATUS_PAID
} }
num_pending = dictsum(num_s_pending, num_expired) num_pending = dictsum(num_s_pending, num_expired)
@@ -192,17 +192,27 @@ def order_overview(event: Event) -> Tuple[List[Tuple[ItemCategory, List[Item]]],
ppobj.provider = pprov ppobj.provider = pprov
ppobj.has_variations = False ppobj.has_variations = False
ppobj.num_total = total ppobj.num_total = total
ppobj.num_canceled = num_canceled.get(pprov, (0, 0)) ppobj.num_canceled = num_canceled.get(pprov, (0, 0, 0))
ppobj.num_refunded = num_refunded.get(pprov, (0, 0)) ppobj.num_refunded = num_refunded.get(pprov, (0, 0, 0))
ppobj.num_pending = num_pending.get(pprov, (0, 0)) ppobj.num_pending = num_pending.get(pprov, (0, 0, 0))
ppobj.num_paid = num_paid.get(pprov, (0, 0)) ppobj.num_paid = num_paid.get(pprov, (0, 0, 0))
payment_items.append(ppobj) payment_items.append(ppobj)
payment_cat_obj.num_total = (Dontsum(''), sum(i.num_total[1] for i in payment_items)) payment_cat_obj.num_total = (
payment_cat_obj.num_canceled = (Dontsum(''), sum(i.num_canceled[1] for i in payment_items)) Dontsum(''), sum(i.num_total[1] for i in payment_items), sum(i.num_total[2] for i in payment_items)
payment_cat_obj.num_refunded = (Dontsum(''), sum(i.num_refunded[1] for i in payment_items)) )
payment_cat_obj.num_pending = (Dontsum(''), sum(i.num_pending[1] for i in payment_items)) payment_cat_obj.num_canceled = (
payment_cat_obj.num_paid = (Dontsum(''), sum(i.num_paid[1] for i in payment_items)) Dontsum(''), sum(i.num_canceled[1] for i in payment_items), sum(i.num_canceled[2] for i in payment_items)
)
payment_cat_obj.num_refunded = (
Dontsum(''), sum(i.num_refunded[1] for i in payment_items), sum(i.num_refunded[2] for i in payment_items)
)
payment_cat_obj.num_pending = (
Dontsum(''), sum(i.num_pending[1] for i in payment_items), sum(i.num_pending[2] for i in payment_items)
)
payment_cat_obj.num_paid = (
Dontsum(''), sum(i.num_paid[1] for i in payment_items), sum(i.num_paid[2] for i in payment_items)
)
payment_cat = (payment_cat_obj, payment_items) payment_cat = (payment_cat_obj, payment_items)
items_by_category.append(payment_cat) items_by_category.append(payment_cat)

View File

@@ -1,14 +1,14 @@
{% extends "pretixcontrol/event/base.html" %} {% extends "pretixcontrol/event/base.html" %}
{% load i18n %} {% load i18n %}
{% load order_overview %} {% load order_overview %}
{% block title %}{% trans "Order overview" %}{% endblock %} {% block title %}{% trans "Sales overview" %}{% endblock %}
{% block content %} {% block content %}
{% url "control:event.orders" organizer=request.event.organizer.slug event=request.event.slug as listurl %} {% url "control:event.orders" organizer=request.event.organizer.slug event=request.event.slug as listurl %}
<div class="pull-right"> <div class="pull-right">
<div class="btn-group" role="group" id="sumtoggle"> <div class="btn-group" role="group" id="sumtoggle">
<button type="button" data-target=".count" class="btn btn-default active">{% trans "Show number" %}</button> <button type="button" data-target=".count" class="btn btn-default active">{% trans "Sales" %}</button>
<button type="button" data-target=".sum" class="btn btn-default"> <button type="button" data-target=".sum-gross" class="btn btn-default">{% trans "Revenue (gross)" %}</button>
{% blocktrans with currency=request.event.currency %}Show {{ currency }}{% endblocktrans %}</button> <button type="button" data-target=".sum-net" class="btn btn-default">{% trans "Revenue (net)" %}</button>
</div> </div>
</div> </div>
<h1>{% trans "Order overview" %}</h1> <h1>{% trans "Order overview" %}</h1>

View File

@@ -17,6 +17,6 @@ def cut(value, autoescape=True):
esc = conditional_escape esc = conditional_escape
else: else:
esc = noop esc = noop
return mark_safe('<span class="count">{0}</span><span class="sum">{1}</span>'.format( return mark_safe('<span class="count">{0}</span><span class="sum-gross">{1}</span><span class="sum-net">{2}</span>'.format(
esc(value[0]), esc(formats.localize(value[1])) esc(value[0]), esc(formats.localize(value[1])), esc(formats.localize(value[2]))
)) ))

View File

@@ -74,10 +74,12 @@ $(function () {
} }
$("#sumtoggle").find("button").click(function () { $("#sumtoggle").find("button").click(function () {
$(".table-product-overview .sum").toggle($(this).attr("data-target") === ".sum"); $(".table-product-overview .sum-gross").toggle($(this).attr("data-target") === ".sum-gross");
$(".table-product-overview .sum-net").toggle($(this).attr("data-target") === ".sum-net");
$(".table-product-overview .count").toggle($(this).attr("data-target") === ".count");
$("#sumtoggle").find("button").not($(this)).removeClass("active"); $("#sumtoggle").find("button").not($(this)).removeClass("active");
$(this).addClass("active"); $(this).addClass("active");
$(".table-product-overview .count").toggle($(this).attr("data-target") === ".count");
}); });
$('.collapsible').collapse(); $('.collapsible').collapse();

View File

@@ -12,7 +12,7 @@
th:not(:first-child) { th:not(:first-child) {
text-align: right; text-align: right;
} }
span.sum { span.sum-net, span.sum-gross {
display: none; display: none;
} }
} }