mirror of
https://github.com/pretix/pretix.git
synced 2026-05-09 15:54:03 +00:00
Accounting report: Allow to split by subevent, introduce sum by event
This commit is contained in:
@@ -27,6 +27,7 @@ from decimal import Decimal
|
|||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.db.models import F, Sum
|
from django.db.models import F, Sum
|
||||||
|
from django.db.models.functions import Coalesce
|
||||||
from django.utils.formats import date_format, localize
|
from django.utils.formats import date_format, localize
|
||||||
from django.utils.html import escape
|
from django.utils.html import escape
|
||||||
from django.utils.timezone import now
|
from django.utils.timezone import now
|
||||||
@@ -83,8 +84,18 @@ class ReportExporter(ReportlabExportMixin, BaseExporter):
|
|||||||
initial=True,
|
initial=True,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
"split_subevents",
|
||||||
|
forms.BooleanField(
|
||||||
|
label=_("Split event series by date"),
|
||||||
|
required=False,
|
||||||
|
initial=False,
|
||||||
|
),
|
||||||
|
),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
if not self.is_multievent and not self.event.has_subevents:
|
||||||
|
del ff["split_subevents"]
|
||||||
return ff
|
return ff
|
||||||
|
|
||||||
def describe_filters(self, form_data: dict):
|
def describe_filters(self, form_data: dict):
|
||||||
@@ -232,9 +243,17 @@ class ReportExporter(ReportlabExportMixin, BaseExporter):
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
subevent_values = {}
|
||||||
|
subevent_order_by = {}
|
||||||
|
if form_data.get("split_subevents"):
|
||||||
|
subevent_values = {"subevent_id", "subevent__name", "subevent__date_from"}
|
||||||
|
subevent_order_by = {Coalesce(F("subevent__date_from"), F("order__event__date_from")), Coalesce(F("subevent_id"), F("order__event_id"))}
|
||||||
|
|
||||||
qs = (
|
qs = (
|
||||||
self._transaction_qs(form_data)
|
self._transaction_qs(form_data)
|
||||||
.order_by(
|
.order_by(
|
||||||
|
*subevent_order_by,
|
||||||
|
"order__event__date_from",
|
||||||
"order__event__slug",
|
"order__event__slug",
|
||||||
F("fee_type").asc(nulls_first=True),
|
F("fee_type").asc(nulls_first=True),
|
||||||
F("internal_type").asc(nulls_first=True),
|
F("internal_type").asc(nulls_first=True),
|
||||||
@@ -248,6 +267,8 @@ class ReportExporter(ReportlabExportMixin, BaseExporter):
|
|||||||
"tax_rate",
|
"tax_rate",
|
||||||
)
|
)
|
||||||
.values(
|
.values(
|
||||||
|
*subevent_values,
|
||||||
|
"order__event__date_from",
|
||||||
"order__event__slug",
|
"order__event__slug",
|
||||||
"order__event__name",
|
"order__event__name",
|
||||||
"item_id",
|
"item_id",
|
||||||
@@ -273,15 +294,30 @@ class ReportExporter(ReportlabExportMixin, BaseExporter):
|
|||||||
sum_cnt_by_tax_rate = defaultdict(int)
|
sum_cnt_by_tax_rate = defaultdict(int)
|
||||||
sum_price_by_tax_rate = defaultdict(Decimal)
|
sum_price_by_tax_rate = defaultdict(Decimal)
|
||||||
sum_tax_by_tax_rate = defaultdict(Decimal)
|
sum_tax_by_tax_rate = defaultdict(Decimal)
|
||||||
|
sum_price_by_event = Decimal("0.00")
|
||||||
|
sum_tax_by_event = Decimal("0.00")
|
||||||
last_event_group = None
|
last_event_group = None
|
||||||
|
last_event_group_head_idx = 0
|
||||||
for r in qs:
|
for r in qs:
|
||||||
if r["order__event__slug"] != last_event_group:
|
if r.get("subevent_id"):
|
||||||
|
e = "{} - {} ({}) [{}]".format(
|
||||||
|
r["order__event__name"],
|
||||||
|
r["subevent__name"],
|
||||||
|
date_format(r["subevent__date_from"]),
|
||||||
|
r["order__event__slug"]
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
e = "{} [{}]".format(r["order__event__name"], r["order__event__slug"])
|
||||||
|
|
||||||
|
if e != last_event_group:
|
||||||
|
if last_event_group_head_idx > 0 and (self.is_multievent or form_data.get("split_subevents")):
|
||||||
|
tdata[last_event_group_head_idx][4] = Paragraph(money_filter(sum_price_by_event - sum_tax_by_event, "EUR"), tstyle_bold_right),
|
||||||
|
tdata[last_event_group_head_idx][5] = Paragraph(money_filter(sum_tax_by_event, "EUR"), tstyle_bold_right),
|
||||||
|
tdata[last_event_group_head_idx][6] = Paragraph(money_filter(sum_price_by_event, "EUR"), tstyle_bold_right),
|
||||||
tdata.append(
|
tdata.append(
|
||||||
[
|
[
|
||||||
Paragraph(
|
Paragraph(
|
||||||
"{} [{}]".format(
|
e,
|
||||||
r["order__event__name"], r["order__event__slug"]
|
|
||||||
),
|
|
||||||
tstyle_bold,
|
tstyle_bold,
|
||||||
),
|
),
|
||||||
"",
|
"",
|
||||||
@@ -293,9 +329,12 @@ class ReportExporter(ReportlabExportMixin, BaseExporter):
|
|||||||
]
|
]
|
||||||
)
|
)
|
||||||
tstyledata.append(
|
tstyledata.append(
|
||||||
("SPAN", (0, len(tdata) - 1), (-1, len(tdata) - 1)),
|
("SPAN", (0, len(tdata) - 1), (3, len(tdata) - 1)),
|
||||||
)
|
)
|
||||||
last_event_group = r["order__event__slug"]
|
last_event_group = e
|
||||||
|
last_event_group_head_idx = len(tdata) - 1
|
||||||
|
sum_price_by_event = Decimal("0.00")
|
||||||
|
sum_tax_by_event = Decimal("0.00")
|
||||||
|
|
||||||
if r["item_id"]:
|
if r["item_id"]:
|
||||||
if r["variation_id"]:
|
if r["variation_id"]:
|
||||||
@@ -331,6 +370,14 @@ class ReportExporter(ReportlabExportMixin, BaseExporter):
|
|||||||
sum_cnt_by_tax_rate[r["tax_rate"]] += r["sum_cont"]
|
sum_cnt_by_tax_rate[r["tax_rate"]] += r["sum_cont"]
|
||||||
sum_price_by_tax_rate[r["tax_rate"]] += r["sum_price"]
|
sum_price_by_tax_rate[r["tax_rate"]] += r["sum_price"]
|
||||||
sum_tax_by_tax_rate[r["tax_rate"]] += r["sum_tax"]
|
sum_tax_by_tax_rate[r["tax_rate"]] += r["sum_tax"]
|
||||||
|
sum_price_by_event += r["sum_price"]
|
||||||
|
sum_tax_by_event += r["sum_tax"]
|
||||||
|
|
||||||
|
if last_event_group_head_idx > 0 and (self.is_multievent or form_data.get("split_subevents")):
|
||||||
|
tdata[last_event_group_head_idx][4] = Paragraph(money_filter(sum_price_by_event - sum_tax_by_event, "EUR"),
|
||||||
|
tstyle_bold_right),
|
||||||
|
tdata[last_event_group_head_idx][5] = Paragraph(money_filter(sum_tax_by_event, "EUR"), tstyle_bold_right),
|
||||||
|
tdata[last_event_group_head_idx][6] = Paragraph(money_filter(sum_price_by_event, "EUR"), tstyle_bold_right),
|
||||||
|
|
||||||
if len(sum_tax_by_tax_rate) > 1:
|
if len(sum_tax_by_tax_rate) > 1:
|
||||||
for tax_rate in sorted(sum_tax_by_tax_rate.keys(), reverse=True):
|
for tax_rate in sorted(sum_tax_by_tax_rate.keys(), reverse=True):
|
||||||
|
|||||||
Reference in New Issue
Block a user