Source code for shuup.default_reports.reports.customer_sales

# -*- 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 django.db.models import Avg, Count, Sum
from django.utils.translation import ugettext_lazy as _

from shuup.core.models import Contact
from shuup.default_reports.forms import CustomerSalesReportForm
from shuup.default_reports.mixins import OrderReportMixin
from shuup.reports.report import ShuupReportBase


[docs]class CustomerSalesReport(OrderReportMixin, ShuupReportBase): identifier = "customer_sales_report" title = _("Customer Sales") form_class = CustomerSalesReportForm filename_template = "customer-sales-report-%(time)s" schema = [ {"key": "customer", "title": _("Customer")}, {"key": "order_count", "title": _("Orders")}, {"key": "average_sales", "title": _("Average Sales")}, {"key": "taxless_total", "title": _("Taxless Total")}, {"key": "taxful_total", "title": _("Taxful Total")}, ]
[docs] def get_objects(self): return ( Contact.objects.filter(customer_orders__in=super(CustomerSalesReport, self).get_objects()) .annotate( order_count=Count("customer_orders", distinct=True), average_sales=Avg("customer_orders__taxful_total_price_value"), taxless_total=Sum("customer_orders__taxless_total_price_value"), taxful_total=Sum("customer_orders__taxful_total_price_value"), ) .filter(order_count__gt=0) .order_by("-%s" % self.options["order_by"])[: self.queryset_row_limit] .values("name", "order_count", "average_sales", "taxless_total", "taxful_total") )
[docs] def get_data(self): data = [] for contact in self.get_objects(): data.append( { "customer": contact["name"], "order_count": contact["order_count"], "average_sales": self.shop.create_price(contact["average_sales"]).as_rounded().value, "taxless_total": self.shop.create_price(contact["taxless_total"]).as_rounded().value, "taxful_total": self.shop.create_price(contact["taxful_total"]).as_rounded().value, } ) return self.get_return_data(data)