# -*- coding: utf-8 -*-
# This file is part of Shuup.
#
# Copyright (c) 2012-2021, Shuup Commerce Inc. All rights reserved.
#
# This source code is licensed under the OSL-3.0 license found in the
# LICENSE file in the root directory of this source tree.
from babel.dates import format_date
from django.db.models import Q
from django.utils.translation import ugettext_lazy as _
from shuup.admin.forms.fields import Select2MultipleField
from shuup.campaigns.models.campaigns import Coupon, CouponUsage
from shuup.default_reports.forms import OrderReportForm
from shuup.default_reports.mixins import OrderReportMixin
from shuup.reports.report import ShuupReportBase
from shuup.utils.i18n import get_current_babel_locale
[docs]class CouponsUsageReport(OrderReportMixin, ShuupReportBase):
identifier = "coupons-usage"
title = _("Coupons Usage")
filename_template = "coupons-usage-%(time)s"
form_class = CouponsUsageForm
schema = [
{"key": "date", "title": _("Date")},
{"key": "coupon", "title": _("Coupon code")},
{"key": "order", "title": _("Order")},
{"key": "taxful_total", "title": _("Taxful total")},
{"key": "taxful_subtotal", "title": _("Taxful subtotal")},
{"key": "total_discount", "title": _("Total discount")},
]
[docs] def get_objects(self):
filters = Q(order__in=super(CouponsUsageReport, self).get_objects())
if self.options.get("coupon"):
filters &= Q(coupon__in=self.options["coupon"])
return CouponUsage.objects.filter(filters).order_by("order__order_date")
[docs] def get_data(self, **kwargs):
data = []
coupons_usages = self.get_objects()
for coupon_usage in coupons_usages:
total_discount = self.shop.create_price(0)
for discount in coupon_usage.order.lines.discounts():
total_discount += discount.taxful_price
data.append(
{
"date": format_date(coupon_usage.order.order_date, locale=get_current_babel_locale()),
"coupon": coupon_usage.coupon.code,
"order": coupon_usage.order,
"taxful_total": coupon_usage.order.taxful_total_price.as_rounded().value,
"taxful_subtotal": (coupon_usage.order.taxful_total_price - total_discount).as_rounded().value,
"total_discount": total_discount.as_rounded().value,
}
)
return self.get_return_data(data)