diff --git a/apps/member/migrations/0013_auto_20240807_1409.py b/apps/member/migrations/0013_auto_20240807_1409.py
new file mode 100644
index 00000000..d86135c1
--- /dev/null
+++ b/apps/member/migrations/0013_auto_20240807_1409.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.28 on 2024-08-07 12:09
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('member', '0012_club_add_registration_form'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='profile',
+ name='promotion',
+ field=models.PositiveSmallIntegerField(default=2024, help_text='Year of entry to the school (None if not ENS student)', null=True, verbose_name='promotion'),
+ ),
+ ]
diff --git a/apps/note/templates/note/mails/summary_notes_report.html b/apps/note/templates/note/mails/summary_notes_report.html
new file mode 100644
index 00000000..17ba2155
--- /dev/null
+++ b/apps/note/templates/note/mails/summary_notes_report.html
@@ -0,0 +1,65 @@
+{% load pretty_money %}
+{% load i18n %}
+
+
+
+
+
+ [Note Kfet] Récapitulatif de trésorerie
+
+
+
+ Récapitulatif de trésorerie au {{ summary.date|date:"d/m/Y" }} à {{ summary.date|date:"H:i:s" }} :
+
+
+
+ Tous les utilisateur⋅rices :
+
+
+ - Positifs : {{ summary.total_positive_user }} soit {{ summary.balance_positive_user / 100 }} €
+ - Neutres : {{ summary.total_zero_user }}
+ - Négatifs : {{ summary.total_negative_user }} soit {{ summary.balance_negative_user / 100 }} €
+
+
+
+ Les {{ summary.total_positive_user_bde + summary.total_zero_user_bde + summary.total_negative_user_bde }} adhérent⋅es BDE :
+
+
+ - Positifs : {{ summary.total_positive_user_bde }} soit {{ summary.balance_positive_user_bde / 100 }} €
+ - Neutres : {{ summary.total_zero_user_bde }}
+ - Négatifs : {{ summary.total_negative_user_bde }} soit {{ summary.balance_negative_user_bde / 100 }} €
+
+
+
+ Clubs :
+
+
+ - Positifs : {{ summary.total_positive_club }} soit {{ summary.balance_positive_club / 100 }} €
+ - Neutres : {{ summary.total_zero_club }}
+ - Négatifs : {{ summary.total_negative_club }} soit {{ summary.balance_negative_club / 100 }} €
+
+
+
+ Clubs hors BDE / Kfet et club dont le nom fini par "- BDE" :
+
+
+ - Positifs : {{ summary.total_positive_club_nbde }} soit {{ summary.balance_positive_club_nbde / 100 }} €
+ - Neutres : {{ summary.total_zero_club_nbde }}
+ - Négatifs : {{ summary.total_negative_club_nbde }} soit {{ summary.balance_negative_club_nbde / 100 }} €
+
+
+
+ Progression :
+
+
+ - Ceci correspond à une différence de {{ balance_difference_user / 100 }} € pour les utilisateur⋅rices
+ - Ceci correspond à une différence de {{ balance_difference_club / 100 }} € pour les clubs
+
+
+--
+
+ Le BDE
+ {% trans "Mail generated by the Note Kfet on the" %} {% now "j F Y à H:i:s" %}
+
+
+
diff --git a/apps/note/templates/note/mails/summary_notes_report.txt b/apps/note/templates/note/mails/summary_notes_report.txt
new file mode 100644
index 00000000..be7a5992
--- /dev/null
+++ b/apps/note/templates/note/mails/summary_notes_report.txt
@@ -0,0 +1,33 @@
+{% load pretty_money %}
+{% load i18n %}
+
+Récapitulatif de trésorerie au {{ summary.date|date:"d/m/Y" }} à {{ summary.date|date:"H:i:s" }} :
+
+Tous les utilisateur⋅rices :
+ - Positifs : {{ summary.total_positive_user }} soit {{ summary.balance_positive_user / 100 }} €
+ - Neutres : {{ summary.total_zero_user }}
+ - Négatifs : {{ summary.total_negative_user }} soit {{ summary.balance_negative_user / 100 }} €
+
+Les {{ summary.total_positive_user_bde + summary.total_zero_user_bde + summary.total_negative_user_bde }} adhérent⋅es BDE :
+ - Positifs : {{ summary.total_positive_user_bde }} soit {{ summary.balance_positive_user_bde / 100 }} €
+ - Neutres : {{ summary.total_zero_user_bde }}
+ - Négatifs : {{ summary.total_negative_user_bde }} soit {{ summary.balance_negative_user_bde /100 }} €
+
+Clubs :
+ - Positifs : {{ summary.total_positive_club }} soit {{ summary.balance_positive_club / 100 }} €
+ - Neutres : {{ summary.total_zero_club }}
+ - Négatifs : {{ summary.total_negative_club }} soit {{ summary.balance_negative_club / 100 }} €
+
+Clubs hors BDE / Kfet et club dont le nom fini par "- BDE" :
+ - Positifs : {{ summary.total_positive_club_nbde }} soit {{ summary.balance_positive_club_nbde / 100 }} €
+ - Neutres : {{ summary.total_zero_club_nbde }}
+ - Négatifs : {{ summary.total_negative_club_nbde }} soit {{ summary.balance_negative_club_nbde / 100 }} €
+
+Progression :
+ - Ceci correspond à une différence de {{ balance_difference_user / 100 }} € pour les utilisateur⋅rices
+ - Ceci correspond à une différence de {{ balance_difference_club / 100 }} € pour les clubs
+
+--
+Le BDE
+
+{% trans "Mail generated by the Note Kfet on the" %} {% now "j F Y à H:i:s" %}
diff --git a/apps/scripts b/apps/scripts
index f580f9b9..f76acb32 160000
--- a/apps/scripts
+++ b/apps/scripts
@@ -1 +1 @@
-Subproject commit f580f9b9e9beee76605975fdbc3a2014769e3c61
+Subproject commit f76acb32487635fe28907b637955e110a37b06cc
diff --git a/apps/treasury/admin.py b/apps/treasury/admin.py
index c435a4ff..209a0fd6 100644
--- a/apps/treasury/admin.py
+++ b/apps/treasury/admin.py
@@ -5,13 +5,13 @@ from django.contrib import admin
from note_kfet.admin import admin_site
from .forms import ProductForm
-from .models import RemittanceType, Remittance, SogeCredit, Invoice, Product
+from .models import Invoice, NoteSummary, Product, RemittanceType, Remittance, SogeCredit
@admin.register(RemittanceType, site=admin_site)
class RemittanceTypeAdmin(admin.ModelAdmin):
"""
- Admin customisation for RemiitanceType
+ Admin customisation for RemittanceType
"""
list_display = ('note', )
@@ -55,3 +55,19 @@ class InvoiceAdmin(admin.ModelAdmin):
"""
list_display = ('object', 'id', 'bde', 'name', 'date', 'acquitted',)
inlines = (ProductInline,)
+
+
+@admin.register(NoteSummary, site=admin_site)
+class NoteSummaryAdmin(admin.ModelAdmin):
+ """
+ Admin customisation for NoteSummary
+ """
+ list_display = (
+ 'date', 'total_positive_user', 'balance_positive_user', 'total_positive_user_bde',
+ 'balance_positive_user_bde', 'total_zero_user', 'total_zero_user_bde', 'total_negative_user',
+ 'balance_negative_user', 'total_negative_user_bde', 'balance_negative_user_bde',
+ 'total_vnegative_user', 'balance_vnegative_user', 'total_vnegative_user_bde',
+ 'balance_vnegative_user_bde', 'total_positive_club', 'balance_positive_club',
+ 'total_positive_club_nbde', 'balance_positive_club_nbde', 'total_zero_club', 'total_zero_club_nbde',
+ 'total_negative_club', 'balance_negative_club', 'total_negative_club_nbde', 'balance_negative_club_nbde',
+ )
diff --git a/apps/treasury/migrations/0009_notesummary.py b/apps/treasury/migrations/0009_notesummary.py
new file mode 100644
index 00000000..a5aecdd6
--- /dev/null
+++ b/apps/treasury/migrations/0009_notesummary.py
@@ -0,0 +1,49 @@
+# Generated by Django 2.2.28 on 2024-08-07 12:09
+
+import datetime
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('treasury', '0008_auto_20240322_0045'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='NoteSummary',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('date', models.DateField(default=datetime.date.today, verbose_name='Date')),
+ ('total_positive_user', models.PositiveIntegerField(verbose_name='Total positive user')),
+ ('balance_positive_user', models.PositiveIntegerField(verbose_name='Balance positive user')),
+ ('total_positive_user_bde', models.PositiveIntegerField(verbose_name='Total positive user BDE')),
+ ('balance_positive_user_bde', models.PositiveIntegerField(verbose_name='Balance positive user BDE')),
+ ('total_zero_user', models.PositiveIntegerField(verbose_name='Total zero user')),
+ ('total_zero_user_bde', models.PositiveIntegerField(verbose_name='Total zero user BDE')),
+ ('total_negative_user', models.PositiveIntegerField(verbose_name='Total negative user')),
+ ('balance_negative_user', models.PositiveIntegerField(verbose_name='Balance negative user')),
+ ('total_negative_user_bde', models.PositiveIntegerField(verbose_name='Total negative user BDE')),
+ ('balance_negative_user_bde', models.PositiveIntegerField(verbose_name='Balance negative user BDE')),
+ ('total_vnegative_user', models.PositiveIntegerField(verbose_name='Total very negative user')),
+ ('balance_vnegative_user', models.PositiveIntegerField(verbose_name='Balance very negative user')),
+ ('total_vnegative_user_bde', models.PositiveIntegerField(verbose_name='Total very negative user BDE')),
+ ('balance_vnegative_user_bde', models.PositiveIntegerField(verbose_name='Balance very negative user BDE')),
+ ('total_positive_club', models.PositiveIntegerField(verbose_name='Total positive club')),
+ ('balance_positive_club', models.PositiveIntegerField(verbose_name='Balance positive club')),
+ ('total_positive_club_nbde', models.PositiveIntegerField(verbose_name='Total positive club nbde')),
+ ('balance_positive_club_nbde', models.PositiveIntegerField(verbose_name='Balance positive club nbde')),
+ ('total_zero_club', models.PositiveIntegerField(verbose_name='Total zero club')),
+ ('total_zero_club_nbde', models.PositiveIntegerField(verbose_name='Total zero club nbde')),
+ ('total_negative_club', models.PositiveIntegerField(verbose_name='Total negative club')),
+ ('balance_negative_club', models.PositiveIntegerField(verbose_name='Balance negative club')),
+ ('total_negative_club_nbde', models.PositiveIntegerField(verbose_name='Total negative club nbde')),
+ ('balance_negative_club_nbde', models.PositiveIntegerField(verbose_name='Balance negative club nbde')),
+ ],
+ options={
+ 'verbose_name': 'Summary',
+ 'verbose_name_plural': 'Summaries',
+ },
+ ),
+ ]
diff --git a/apps/treasury/models.py b/apps/treasury/models.py
index 69fc6e6b..26662336 100644
--- a/apps/treasury/models.py
+++ b/apps/treasury/models.py
@@ -460,3 +460,117 @@ class SogeCredit(models.Model):
self.credit_transaction._force_save = True
self.credit_transaction.save()
super().delete(**kwargs)
+
+
+class NoteSummary(models.Model):
+ """
+ Summary of every notes
+ """
+
+ date = models.DateField(
+ default=date.today,
+ verbose_name=_("Date"),
+ )
+
+ total_positive_user = models.PositiveIntegerField(
+ verbose_name=_("Total positive user"),
+ )
+
+ balance_positive_user = models.PositiveIntegerField(
+ verbose_name=_("Balance positive user"),
+ )
+
+ total_positive_user_bde = models.PositiveIntegerField(
+ verbose_name=_("Total positive user BDE"),
+ )
+
+ balance_positive_user_bde = models.PositiveIntegerField(
+ verbose_name=_("Balance positive user BDE"),
+ )
+
+ total_zero_user = models.PositiveIntegerField(
+ verbose_name=_("Total zero user"),
+ )
+
+ total_zero_user_bde = models.PositiveIntegerField(
+ verbose_name=_("Total zero user BDE"),
+ )
+
+ total_negative_user = models.PositiveIntegerField(
+ verbose_name=_("Total negative user"),
+ )
+
+ balance_negative_user = models.PositiveIntegerField(
+ verbose_name=_("Balance negative user"),
+ )
+
+ total_negative_user_bde = models.PositiveIntegerField(
+ verbose_name=_("Total negative user BDE"),
+ )
+
+ balance_negative_user_bde = models.PositiveIntegerField(
+ verbose_name=_("Balance negative user BDE"),
+ )
+
+ total_vnegative_user = models.PositiveIntegerField(
+ verbose_name=_("Total very negative user"),
+ )
+
+ balance_vnegative_user = models.PositiveIntegerField(
+ verbose_name=_("Balance very negative user"),
+ )
+
+ total_vnegative_user_bde = models.PositiveIntegerField(
+ verbose_name=_("Total very negative user BDE"),
+ )
+
+ balance_vnegative_user_bde = models.PositiveIntegerField(
+ verbose_name=_("Balance very negative user BDE"),
+ )
+
+ total_positive_club = models.PositiveIntegerField(
+ verbose_name=_("Total positive club"),
+ )
+
+ balance_positive_club = models.PositiveIntegerField(
+ verbose_name=_("Balance positive club"),
+ )
+
+ total_positive_club_nbde = models.PositiveIntegerField(
+ verbose_name=_("Total positive club nbde"),
+ )
+
+ balance_positive_club_nbde = models.PositiveIntegerField(
+ verbose_name=_("Balance positive club nbde"),
+ )
+
+ total_zero_club = models.PositiveIntegerField(
+ verbose_name=_("Total zero club"),
+ )
+
+ total_zero_club_nbde = models.PositiveIntegerField(
+ verbose_name=_("Total zero club nbde"),
+ )
+
+ total_negative_club = models.PositiveIntegerField(
+ verbose_name=_("Total negative club"),
+ )
+
+ balance_negative_club = models.PositiveIntegerField(
+ verbose_name=_("Balance negative club"),
+ )
+
+ total_negative_club_nbde = models.PositiveIntegerField(
+ verbose_name=_("Total negative club nbde"),
+ )
+
+ balance_negative_club_nbde = models.PositiveIntegerField(
+ verbose_name=_("Balance negative club nbde"),
+ )
+
+ class Meta:
+ verbose_name = _("Summary")
+ verbose_name_plural = _("Summaries")
+
+ def __str__(self):
+ return "Note summary of {date}".format(date=self.date)
diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po
index 2af3257e..80e63a78 100644
--- a/locale/fr/LC_MESSAGES/django.po
+++ b/locale/fr/LC_MESSAGES/django.po
@@ -1971,6 +1971,8 @@ msgstr "Historique des transactions récentes"
#: apps/note/templates/note/mails/negative_balance.txt:25
#: apps/note/templates/note/mails/negative_notes_report.html:46
#: apps/note/templates/note/mails/negative_notes_report.txt:13
+#: apps/note/templates/note/mails/summary_notes_report.html:62
+#: apps/note/templates/note/mails/summary_ntoes_report.txt:33
#: apps/note/templates/note/mails/weekly_report.html:51
#: apps/note/templates/note/mails/weekly_report.txt:32
#: apps/registration/templates/registration/mails/email_validation_email.html:40
@@ -2527,6 +2529,7 @@ msgid "Address"
msgstr "Adresse"
#: apps/treasury/models.py:69 apps/treasury/models.py:202
+#: apps/treasury/models.py:472
msgid "Date"
msgstr "Date"
@@ -2645,6 +2648,102 @@ msgstr ""
"Cet·te utilisateur·rice n'a pas assez d'argent pour payer les adhésions avec sa "
"note. Merci de lui demander de recharger sa note avant d'invalider ce crédit."
+#: apps/treasury/models.py:476
+msgid "Total positive user"
+msgstr "Nombre d'utilisateur⋅rices en positif"
+
+#: apps/treasury/models.py:480
+msgid "Balance positive user"
+msgstr "Solde des utilisateur⋅rices en positif"
+
+#: apps/treasury/models.py:484
+msgid "Total positive user BDE"
+msgstr "Nombre d'adhérent⋅es au BDE en positif"
+
+#: apps/treasury/models.py:488
+msgid "Balance positive user BDE"
+msgstr "Solde des adhérent⋅es au BDE en positif"
+
+#: apps/treasury/models.py:492
+msgid "Total zero user"
+msgstr "Nombre d'utilisateur⋅rices à zéro"
+
+#: apps/treasury/models.py:496
+msgid "Total zero user BDE"
+msgstr "Nombre d'adhérent⋅es au BDE à zéro"
+
+#: apps/treasury/models.py:500
+msgid "Total negative user"
+msgstr "Nombre d'utilisateur⋅rices en négatif"
+
+#: apps/treasury/models.py:504
+msgid "Balance negative user"
+msgstr "Solde des utilisateur⋅rices en négatif"
+
+#: apps/treasury/models.py:508
+msgid "Total negative user BDE"
+msgstr "Nombre d'adhérent⋅es au BDE en négatif"
+
+#: apps/treasury/models.py:512
+msgid "Balance negative user BDE"
+msgstr "Solde des adhérent⋅es au BDE en négatif"
+
+#: apps/treasury/models.py:516
+msgid "Total very negative user"
+msgstr "Nombre d'utilisateur⋅rices en négatif sévère"
+
+#: apps/treasury/models.py:520
+msgid "Balance very negative user"
+msgstr "Solde des utilisateur⋅rices en négatif sévère"
+
+#: apps/treasury/models.py:524
+msgid "Total very negative user BDE"
+msgstr "Nombre d'adhérent⋅es au BDE en négatif sévère"
+
+#: apps/treasury/models.py:528
+msgid "Balance very negative user BDE"
+msgstr "Solde des adhérent⋅es au BDE en négatif sévère"
+
+#: apps/treasury/models.py:532
+msgid "Total positive club"
+msgstr "Nombre de clubs en positif"
+
+#: apps/treasury/models.py:536
+msgid "Balance positive club"
+msgstr "Solde des clubs en positif"
+
+#: apps/treasury/models.py:540
+msgid "Total positive club nbde"
+msgstr "Nombre de clubs non-BDE en positif"
+
+#: apps/treasury/models.py:544
+msgid "Balance positive club nbde"
+msgstr "Solde des clubs non-BDE en positif"
+
+#: apps/treasury/models.py:548
+msgid "Total zero club"
+msgstr "Nombre de clubs à zéro"
+
+#: apps/treasury/models.py:552
+msgid "Total zero club nbde"
+msgstr "Nombre de clubs non-BDE à zéro"
+
+#: apps/treasury/models.py:556
+msgid "Total negative club"
+msgstr "Nombre de clubs en négatif"
+
+#: apps/treasury/models.py:560
+msgid "Balance negative club"
+msgstr "Solde des clubs en négatif"
+
+#: apps/treasury/models.py:564
+msgid "Total negative club nbde"
+msgstr "Nombre de clubs non-BDE en négatif"
+
+#: apps/treasury/models.py:568
+msgid "Balance negative club nbde"
+msgstr "Solde des clubs non-BDE en négatif"
+
#: apps/treasury/tables.py:20
msgid "Invoice #{:d}"
msgstr "Facture n°{:d}"
diff --git a/note.cron b/note.cron
index dc1f6460..70660ab2 100644
--- a/note.cron
+++ b/note.cron
@@ -20,6 +20,8 @@ MAILTO=notekfet2020@lists.crans.org
00 5 * * 2 root cd /var/www/note_kfet && env/bin/python manage.py send_mail_to_negative_balances --spam --negative-amount 1 -v 0
# Envoyer le rapport mensuel aux trésoriers et respos info
00 8 * * 5 root cd /var/www/note_kfet && env/bin/python manage.py send_mail_to_negative_balances --report --add-years 1 -v 0
+# Envoyer le recap de tresorerie
+ 00 8 * * 5 root cd /var/www/note_kfet && env/bin/python manage.py send_summary_notes_report --negative-amount 2000
# Envoyer les rapports aux gens
55 6 * * * root cd /var/www/note_kfet && env/bin/python manage.py send_reports -v 0
# Mettre à jour les boutons mis en avant