diff --git a/management/commands/send_summary_notes_report.py b/management/commands/send_summary_notes_report.py new file mode 100644 index 0000000..6514911 --- /dev/null +++ b/management/commands/send_summary_notes_report.py @@ -0,0 +1,144 @@ +# Copyright (C) 2018-2021 by BDE ENS Paris-Saclay +# SPDX-License-Identifier: GPL-3.0-or-later + +from datetime import date + +from django.core.mail import send_mail +from django.core.management import BaseCommand +from django.db.models import Q +from django.template.loader import render_to_string +from django.utils.translation import activate +from note.models import NoteUser, NoteClub +from treasury.models import NoteSummary + + +class Command(BaseCommand): + def add_arguments(self, parser): + parser.add_argument("--negative-amount", "-n", action='store', type=int, default=1000, + help="Maximum amount to be considered as very negative (inclusive)") + + def handle(self, *args, **options): + activate('fr') + + if options['negative_amount'] == 0: + # Don't log empty notes + options['negative_amount'] = 1 + + + # User notes + positive_user_notes = NoteUser.objects.filter( Q(balance__gt=0) ).distinct() + positive_user_notes_bde = positive_user_notes.filter( Q(user__memberships__club__name = 'BDE') & Q(user__memberships__date_end__gte = date.today()) ).distinct() + + zero_user_notes = NoteUser.objects.filter( Q(balance=0) ).distinct() + zero_user_notes_bde = zero_user_notes.filter( Q(user__memberships__club__name = 'BDE') & Q(user__memberships__date_end__gte = date.today()) ).distinct() + + negative_user_notes = NoteUser.objects.filter( Q(balance__lt=0) ).distinct() + negative_user_notes_bde = negative_user_notes.filter( Q(user__memberships__club__name = 'BDE') & Q(user__memberships__date_end__gte = date.today()) ).distinct() + + vnegative_user_notes = NoteUser.objects.filter( Q(balance__lte=-options["negative_amount"]) ).distinct() + vnegative_user_notes_bde = vnegative_user_notes.filter( Q(user__memberships__club__name = 'BDE') & Q(user__memberships__date_end__gte = date.today()) ).distinct() + + + total_positive_user = positive_user_notes.count() + balance_positive_user = sum(note.balance for note in positive_user_notes.all()) + + total_positive_user_bde = positive_user_notes_bde.count() + balance_positive_user_bde = sum(note.balance for note in positive_user_notes_bde.all()) + + total_zero_user = zero_user_notes.count() + + total_zero_user_bde = zero_user_notes_bde.count() + + total_negative_user = negative_user_notes.count() + balance_negative_user = sum(note.balance for note in negative_user_notes.all()) + + total_negative_user_bde = negative_user_notes_bde.count() + balance_negative_user_bde = sum(note.balance for note in negative_user_notes_bde.all()) + + total_vnegative_user = vnegative_user_notes.count() + balance_vnegative_user = sum(note.balance for note in vnegative_user_notes.all()) + + total_vnegative_user_bde = vnegative_user_notes_bde.count() + balance_vnegative_user_bde = sum(note.balance for note in vnegative_user_notes_bde.all()) + + + + #Club notes + positive_club_notes = NoteClub.objects.filter( Q(balance__gt=0) ).distinct() + positive_club_notes_nbde = positive_club_notes.filter( ~Q(club__name = 'BDE') & ~Q(club__name = 'Kfet') & ~Q(club__name__iendswith = '- BDE')).distinct() + + zero_club_notes = NoteClub.objects.filter( Q(balance=0) ).distinct() + zero_club_notes_nbde = zero_club_notes.filter( ~Q(club__name = 'BDE') & ~Q(club__name = 'Kfet') & ~Q(club__name__iendswith = '- BDE')).distinct() + + negative_club_notes = NoteClub.objects.filter( Q(balance__lt=0) ).distinct() + negative_club_notes_nbde = negative_club_notes.filter( ~Q(club__name = 'BDE') & ~Q(club__name = 'Kfet') & ~Q(club__name__iendswith = '- BDE')).distinct() + + + total_positive_club = positive_club_notes.count() + balance_positive_club = sum(note.balance for note in positive_club_notes.all()) + + total_positive_club_nbde = positive_club_notes_nbde.count() + balance_positive_club_nbde = sum(note.balance for note in positive_club_notes_nbde.all()) + + total_zero_club = zero_club_notes.count() + + total_zero_club_nbde = zero_club_notes_nbde.count() + + total_negative_club = negative_club_notes.count() + balance_negative_club = sum(note.balance for note in negative_club_notes.all()) + + total_negative_club_nbde = negative_club_notes_nbde.count() + balance_negative_club_nbde = sum(note.balance for note in negative_club_notes_nbde.all()) + + + last_summary = NoteSummary.objects.order_by('-date').first() + + summary = NoteSummary.objects.create( + total_positive_user=total_positive_user, + balance_positive_user=balance_positive_user, + + total_positive_user_bde=total_positive_user_bde, + balance_positive_user_bde=balance_positive_user_bde, + + total_zero_user=total_zero_user, + + total_zero_user_bde=total_zero_user_bde, + + total_negative_user=total_negative_user, + balance_negative_user=balance_negative_user, + + total_negative_user_bde=total_negative_user_bde, + balance_negative_user_bde=balance_negative_user_bde, + + total_vnegative_user=total_vnegative_user, + balance_vnegative_user=balance_vnegative_user, + + total_vnegative_user_bde=total_vnegative_user_bde, + balance_vnegative_user_bde=balance_vnegative_user_bde, + + + total_positive_club=total_positive_club, + balance_positive_club=balance_positive_club, + + total_positive_club_nbde=total_positive_club_nbde, + balance_positive_club_nbde=balance_positive_club_nbde, + + total_zero_club=total_zero_club, + + total_zero_club_nbde=total_zero_club_nbde, + + total_negative_club=total_negative_club, + balance_negative_club=balance_negative_club, + + total_negative_club_nbde=total_negative_club_nbde, + balance_negative_club_nbde=balance_negative_club_nbde, + ) + + balance_difference_user = (balance_positive_user - balance_negative_user) - (last_summary.balance_positive_user - last_summary.balance_negative_user) + balance_difference_club = (balance_positive_club - balance_negative_club) - (last_summary.balance_positive_club - last_summary.balance_negative_club) + + plain_text = render_to_string("note/mails/summary_notes_report.txt", context=dict(summary=summary, balance_difference_user=balance_difference_user, balance_difference_club=balance_difference_club)) + html = render_to_string("note/mails/summary_notes_report.html", context=dict(summary=summary, balance_difference_user=balance_difference_user, balance_difference_club=balance_difference_club)) + send_mail("[Note Kfet] Récapitulatif de trésorerie", plain_text, "Note Kfet 2020 ", + recipient_list=["respo-info.bde@lists.crans.org", "tresorerie.bde@lists.crans.org"], + html_message=html)