# # Copyright 2023 © AE UTBM # ae@utbm.fr / ae.info@utbm.fr # # This file is part of the website of the UTBM Student Association (AE UTBM), # https://ae.utbm.fr. # # You can find the source code of the website at https://github.com/ae-utbm/sith # # LICENSED UNDER THE GNU GENERAL PUBLIC LICENSE VERSION 3 (GPLv3) # SEE : https://raw.githubusercontent.com/ae-utbm/sith/master/LICENSE # OR WITHIN THE LOCAL FILE "LICENSE" # # from datetime import datetime from urllib.parse import urlencode from dateutil.relativedelta import relativedelta from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.messages.views import SuccessMessageMixin from django.db.models import F, Sum from django.utils.timezone import localdate, make_aware from django.utils.translation import gettext_lazy as _ from django.views.generic import FormView from counter.forms import InvoiceCallForm from counter.models import Refilling, Selling from counter.views.mixins import CounterAdminTabsMixin class InvoiceCallView( CounterAdminTabsMixin, PermissionRequiredMixin, SuccessMessageMixin, FormView ): template_name = "counter/invoices_call.jinja" current_tab = "invoices_call" permission_required = ["counter.view_invoicecall", "counter.change_invoicecall"] form_class = InvoiceCallForm success_message = _("Invoice calls status has been updated.") def get_month(self): kwargs = self.request.GET or self.request.POST if "month" in kwargs: return make_aware(datetime.strptime(kwargs["month"], "%Y-%m")) return localdate().replace(day=1) - relativedelta(months=1) def get_form_kwargs(self): return super().get_form_kwargs() | {"month": self.get_month()} def form_valid(self, form): form.save() return super().form_valid(form) def get_success_url(self): # redirect to the month from which the request is originated url = self.request.path kwargs = self.request.GET or self.request.POST if "month" in kwargs: query = urlencode({"month": kwargs["month"]}) url += f"?{query}" return url def get_context_data(self, **kwargs): """Add sums to the context.""" kwargs = super().get_context_data(**kwargs) kwargs["months"] = Selling.objects.datetimes("date", "month", order="DESC") start_date = self.get_month() end_date = start_date + relativedelta(months=1) kwargs["sum_cb"] = Refilling.objects.filter( payment_method="CARD", is_validated=True, date__gte=start_date, date__lte=end_date, ).aggregate(res=Sum("amount", default=0))["res"] kwargs["sum_cb"] += ( Selling.objects.filter( payment_method="CARD", is_validated=True, date__gte=start_date, date__lte=end_date, ) .annotate(amount=F("unit_price") * F("quantity")) .aggregate(res=Sum("amount", default=0))["res"] ) kwargs["start_date"] = start_date kwargs["invoices"] = ( Selling.objects.filter(date__gte=start_date, date__lt=end_date) .values("club_id", "club__name") .annotate(selling_sum=Sum(F("unit_price") * F("quantity"))) .exclude(selling_sum=None) .order_by("-selling_sum") ) return kwargs