From 6c2cc0b5c27d3b941d19bde444c63de0c989d456 Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Thu, 23 Jan 2025 23:48:01 +0100 Subject: [PATCH 1/6] changed model to allow missing subsidy receiver --- ...8_alter_statement_allowance_to_and_more.py | 25 +++++++++++++++++++ jdav_web/finance/models.py | 8 ++++-- 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 jdav_web/finance/migrations/0008_alter_statement_allowance_to_and_more.py diff --git a/jdav_web/finance/migrations/0008_alter_statement_allowance_to_and_more.py b/jdav_web/finance/migrations/0008_alter_statement_allowance_to_and_more.py new file mode 100644 index 0000000..faf7504 --- /dev/null +++ b/jdav_web/finance/migrations/0008_alter_statement_allowance_to_and_more.py @@ -0,0 +1,25 @@ +# Generated by Django 4.0.1 on 2025-01-23 22:16 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('members', '0033_freizeit_approved_extra_youth_leader_count'), + ('finance', '0007_alter_statement_allowance_to'), + ] + + operations = [ + migrations.AlterField( + model_name='statement', + name='allowance_to', + field=models.ManyToManyField(blank=True, help_text='The youth leaders to which an allowance should be paid.', related_name='receives_allowance_for_statements', to='members.Member', verbose_name='Pay allowance to'), + ), + migrations.AlterField( + model_name='statement', + name='subsidy_to', + field=models.ForeignKey(blank=True, help_text='The person that should receive the subsidy for night and travel costs. Typically the person who paid for them.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='receives_subsidy_for_statements', to='members.member', verbose_name='Pay subsidy to'), + ), + ] diff --git a/jdav_web/finance/models.py b/jdav_web/finance/models.py index 8be4291..de10941 100644 --- a/jdav_web/finance/models.py +++ b/jdav_web/finance/models.py @@ -62,9 +62,10 @@ class Statement(CommonModel): allowance_to = models.ManyToManyField(Member, verbose_name=_('Pay allowance to'), related_name='receives_allowance_for_statements', blank=True, - help_text=_('The youth leaders to which an allowance should be paid. The count must match the number of permitted youth leaders.')) + help_text=_('The youth leaders to which an allowance should be paid.')) subsidy_to = models.ForeignKey(Member, verbose_name=_('Pay subsidy to'), null=True, + blank=True, on_delete=models.SET_NULL, related_name='receives_subsidy_for_statements', help_text=_('The person that should receive the subsidy for night and travel costs. Typically the person who paid for them.')) @@ -341,7 +342,10 @@ class Statement(CommonModel): The total amount of subsidies excluding the allowance, i.e. the transportation and night costs per youth leader multiplied with the real number of youth leaders. """ - return (self.transportation_per_yl + self.nights_per_yl) * self.real_staff_count + if self.subsidy_to: + return (self.transportation_per_yl + self.nights_per_yl) * self.real_staff_count + else: + return cvt_to_decimal(0) @property def total_staff(self): -- 2.38.4 From b056ff8881aea87205ee89764a35aff2cd36f513 Mon Sep 17 00:00:00 2001 From: mariusrklein <47218379+mariusrklein@users.noreply.github.com> Date: Sat, 25 Jan 2025 11:27:07 +0100 Subject: [PATCH 2/6] extended submitted statement overview to include iban checks --- .../admin/overview_submitted_statement.html | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/jdav_web/finance/templates/admin/overview_submitted_statement.html b/jdav_web/finance/templates/admin/overview_submitted_statement.html index 0546b81..f0d36b7 100644 --- a/jdav_web/finance/templates/admin/overview_submitted_statement.html +++ b/jdav_web/finance/templates/admin/overview_submitted_statement.html @@ -76,21 +76,29 @@

{% blocktrans %}The allowance of {{ allowance_per_yl }}€ per person should be paid to:{% endblocktrans %} -

-{% blocktrans %}In total this is {{ total_per_yl }}€ times {{ staff_count }}, giving {{ total_staff }}€.{% endblocktrans %} +{% blocktrans %}In total this is {{ total_per_yl }}€ times {{ staff_count }}, giving {{ theoretical_total_staff }}€.{% endblocktrans %}

- +

{% trans "Payment of subsidies and allowances" %}

+{% if allowances_paid > 0 %}

{% blocktrans %}The allowance of {{ allowance_per_yl }}€ per person should be paid to:{% endblocktrans %} @@ -81,25 +82,36 @@ {% for member in statement.allowance_to.all %} - - + + - + {% endfor %}
{% trans "IBAN valid" %}
{{ member.name }}
{{ member.name }} {{ member.iban_valid|render_bool }}

+{% if allowances_paid < real_staff_count %} +

{% blocktrans %}Only {{ allowances_paid }} of the {{ real_staff_count }} youth leaders have requested the outpayment of their allowance.{% endblocktrans %}

+{% endif %} + +{% else %} +

{% blocktrans %}No receivers of the allowance were provided. Allowance will not be used.{% endblocktrans %}

+{% endif %} +{% if statement.subsidy_to %}

{% blocktrans %}The subsidies for night and transportation costs of {{ total_subsidies }}€ should be paid to:{% endblocktrans %} + - +
- {% trans "IBAN valid" %}{% trans "IBAN valid" %}
{{ statement.subsidy_to.name }}{{ statement.subsidy_to.name }} {{ statement.subsidy_to.iban_valid|render_bool }}

+{% else %} +

{% blocktrans %}No receivers of the subsidies were provided. Subsidies will not be used.{% endblocktrans %}

+{% endif %} {% endif %} diff --git a/jdav_web/members/locale/de/LC_MESSAGES/django.po b/jdav_web/members/locale/de/LC_MESSAGES/django.po index 45701ba..0f4a8d9 100644 --- a/jdav_web/members/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/members/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-19 19:16+0100\n" +"POT-Creation-Date: 2025-01-25 11:56+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -268,15 +268,6 @@ msgstr "" "Diese Ausfahrt hat nur bis zu %(approved_count)s zugelassene " "Jugendleiter*innen, aber du hast %(entered_count)s eingetragen." -#: members/admin.py -#, python-format -msgid "" -"This excursion has %(approved_count)s approved youth leaders, but you listed " -"only %(entered_count)s." -msgstr "" -"Diese Ausfahrt hat %(approved_count)s zugelassene Jugendleiter*innen, aber " -"du hast nur %(entered_count)s eingetragen." - #: members/admin.py msgid "" "Please list here all expenses in relation with this excursion and upload " @@ -1129,20 +1120,20 @@ msgstr "" #: members/templates/admin/freizeit_finance_overview.html #, python-format msgid "" -"%(duration)s days for %(allowance_per_day)s€ per day making a total of " -"%(allowance_per_yl)s€." +"%(kilometers_traveled)s km by %(means_of_transport)s (%(euro_per_km)s € / " +"km) making a total of %(transportation_per_yl)s€." msgstr "" -"%(duration)s Tage für %(allowance_per_day)s€ pro Tag. Das ergibt eine " -"Gesamtsumme von %(allowance_per_yl)s€." +"%(kilometers_traveled)s km mit %(means_of_transport)s (%(euro_per_km)s€ / " +"km). Das ergibt eine Gesamtsumme von %(transportation_per_yl)s€." #: members/templates/admin/freizeit_finance_overview.html #, python-format msgid "" -"%(kilometers_traveled)s km by %(means_of_transport)s (%(euro_per_km)s € / " -"km) making a total of %(transportation_per_yl)s€." +"%(duration)s days for %(allowance_per_day)s€ per day making a total of " +"%(allowance_per_yl)s€." msgstr "" -"%(kilometers_traveled)s km mit %(means_of_transport)s (%(euro_per_km)s€ / " -"km). Das ergibt eine Gesamtsumme von %(transportation_per_yl)s€." +"%(duration)s Tage für %(allowance_per_day)s€ pro Tag. Das ergibt eine " +"Gesamtsumme von %(allowance_per_yl)s€." #: members/templates/admin/freizeit_finance_overview.html #, python-format @@ -1153,6 +1144,22 @@ msgstr "" "Die Aufwandsentschädigung von %(allowance_per_yl)s€ pro Person wird " "ausgezahlt an:" +#: members/templates/admin/freizeit_finance_overview.html +#, python-format +msgid "" +"Only %(allowances_paid)s of the %(real_staff_count)s youth leaders have " +"requested the outpayment of their allowance." +msgstr "" +"Achtung: Nur für %(allowances_paid)s der %(real_staff_count)s " +"Jugendleiter*innen wird die Aufwandsentschädigung abgerufen." + +#: members/templates/admin/freizeit_finance_overview.html +msgid "" +"No receivers of the allowance were provided. Allowance will not be used." +msgstr "" +"Keine Empfänger*innen für eine Aufwandsentschädigung angegeben. Es wird " +"daher keine Aufwandsentschädigung ausbezahlt." + #: members/templates/admin/freizeit_finance_overview.html #, python-format msgid "" @@ -1160,7 +1167,14 @@ msgid "" "configured to be paid to:" msgstr "" "Die Zuschüsse für Übernachtungs- und Fahrtkosten von %(total_subsidies)s€ " -"werden ausgezahlt an:" +"für alle Jugendleiter*innen werden ausgezahlt an:" + +#: members/templates/admin/freizeit_finance_overview.html +msgid "" +"No receivers of the subsidies were provided. Subsidies will not be used." +msgstr "" +"Keine Empfänger*innen für Sektionszuschüsse angegeben. Es werden daher keine " +"Sektionszuschüsse ausbezahlt." #: members/templates/admin/freizeit_finance_overview.html msgid "" @@ -1486,13 +1500,13 @@ msgstr "Speichern und Registrierung bestätigen" msgid "Echo" msgstr "Rückmeldung" -#: members/templates/members/echo.html +#: members/templates/members/echo.html members/tests.py msgid "Thanks for echoing back. Here is your current data:" msgstr "" "Vielen Dank, dass du dich rückmeldest. Hier siehst du deine aktuellen Daten. " "Falls sich etwas geändert hat, trage das bitte hier ein." -#: members/templates/members/echo_failed.html +#: members/templates/members/echo_failed.html members/tests.py msgid "Echo failed" msgstr "Rückmeldung fehlgeschlagen" @@ -1513,7 +1527,7 @@ msgstr "Wenn du denkst, dass das ein Fehler ist, " msgid "contact us." msgstr "kontaktiere uns." -#: members/templates/members/echo_password.html +#: members/templates/members/echo_password.html members/tests.py msgid "" "Thanks for echoing back. Please enter the password, which you can find in " "the email we sent you.\n" @@ -1535,7 +1549,7 @@ msgstr "Rückmeldung erfolgreich" msgid "Thank you" msgstr "Danke" -#: members/templates/members/echo_success.html +#: members/templates/members/echo_success.html members/tests.py msgid "Your data was successfully updated." msgstr "Deine Daten wurden erfolgreich aktualisiert." @@ -1562,16 +1576,16 @@ msgstr "Registrierung fehlgeschlagen" msgid "Registration" msgstr "Registrierung" -#: members/templates/members/mail_confirmation_invalid.html +#: members/templates/members/mail_confirmation_invalid.html members/tests.py msgid "Mail confirmation failed" msgstr "Emailbestätigung fehlgeschlagen" #: members/templates/members/mail_confirmation_invalid.html -#: members/templates/members/waiting_confirmation_invalid.html +#: members/templates/members/waiting_confirmation_invalid.html members/tests.py msgid "The supplied link is invalid." msgstr "Der verwendete Link ist ungültig." -#: members/templates/members/mail_confirmation_success.html +#: members/templates/members/mail_confirmation_success.html members/tests.py msgid "Mail confirmed" msgstr "Emailadresse bestätigt" @@ -1644,7 +1658,7 @@ msgstr "Registrieren" msgid "Here you can register for group" msgstr "Hier kannst du dich registrieren für die Gruppe" -#: members/templates/members/register_failed.html +#: members/templates/members/register_failed.html members/tests.py msgid "Something went wrong while processing your registration." msgstr "Etwas ist schief gelaufen, bei der Verarbeitung deiner Registrierung." @@ -1699,6 +1713,7 @@ msgid "Registration for waiting list." msgstr "Registrierung für die Warteliste." #: members/templates/members/register_waiting_list_success.html +#: members/tests.py msgid "Your registration for the waiting list was successful." msgstr "Du wurdest auf die Warteliste gesetzt." @@ -1724,7 +1739,7 @@ msgstr "" msgid "Reject invitation" msgstr "Einladung ablehnen" -#: members/templates/members/reject_invalid.html +#: members/templates/members/reject_invalid.html members/tests.py msgid "This invitation is invalid or expired." msgstr "Diese Einladung ist ungültig oder abgelaufen." @@ -1792,7 +1807,7 @@ msgstr "" "zustimmst, unterschreibe bitte das Formular und lade hier einen Scan oder " "ein Bild hoch." -#: members/templates/members/upload_registration_form.html +#: members/templates/members/upload_registration_form.html members/tests.py msgid "" "If you are not an adult yet, please let someone responsible for you sign the " "agreement." @@ -1805,10 +1820,12 @@ msgid "Upload" msgstr "Hochladen" #: members/templates/members/upload_registration_form_invalid.html +#: members/tests.py msgid "The supplied key for uploading a registration form is invalid." msgstr "Der verwendete Link zum Hochladen eines Anmeldeformulars ist ungültig." #: members/templates/members/upload_registration_form_success.html +#: members/tests.py msgid "" "Thank you for uploading the registration form. Our team will process your " "registration shortly." @@ -1828,11 +1845,11 @@ msgstr "" "Leider hast du deinen Wartelistenplatz nicht rechtzeitig bestätigt und hast " "somit deinen Platz verloren. Du kannst" -#: members/templates/members/waiting_confirmation_invalid.html +#: members/templates/members/waiting_confirmation_invalid.html members/tests.py msgid "rejoin the waiting list" msgstr "der Warteliste erneut beitreten" -#: members/templates/members/waiting_confirmation_success.html +#: members/templates/members/waiting_confirmation_success.html members/tests.py msgid "Waiting confirmed" msgstr "Wartelistenplatz bestätigt" @@ -1854,6 +1871,22 @@ msgstr "" "Danke %(prename)s für dein Interesse auf der Warteliste zu bleiben.\n" "Dein Platz wurde bestätigt." +#: members/tests.py +msgid "This field is required." +msgstr "" + +#: members/tests.py members/views.py +msgid "The entered password is wrong." +msgstr "Das eingegebene Passwort ist falsch." + +#: members/tests.py members/views.py +msgid "invalid" +msgstr "ungültig" + +#: members/tests.py members/views.py +msgid "expired" +msgstr "abgelaufen" + #: members/views.py msgid "Prename of the member." msgstr "Vorname des*der Teilnehmenden" @@ -1876,22 +1909,18 @@ msgstr "" msgid "optional additional email address" msgstr "Optionale zusätzliche E-Mailadresse" -#: members/views.py -msgid "The entered password is wrong." -msgstr "Das eingegebene Passwort ist falsch." - -#: members/views.py -msgid "invalid" -msgstr "ungültig" - -#: members/views.py -msgid "expired" -msgstr "abgelaufen" - #: members/views.py msgid "Invalid emergency contacts" msgstr "Ungültige Notfallkontakte" +#, python-format +#~ msgid "" +#~ "This excursion has %(approved_count)s approved youth leaders, but you " +#~ "listed only %(entered_count)s." +#~ msgstr "" +#~ "Diese Ausfahrt hat %(approved_count)s zugelassene Jugendleiter*innen, " +#~ "aber du hast nur %(entered_count)s eingetragen." + #, python-format #~ msgid "" #~ "In total these are contributions of %(total_per_yl)s€ times " diff --git a/jdav_web/members/templates/admin/freizeit_finance_overview.html b/jdav_web/members/templates/admin/freizeit_finance_overview.html index ae14716..3a68dfe 100644 --- a/jdav_web/members/templates/admin/freizeit_finance_overview.html +++ b/jdav_web/members/templates/admin/freizeit_finance_overview.html @@ -86,6 +86,7 @@ cost plan!

+{% if allowances_paid > 0 %} {% blocktrans %}The allowance of {{ allowance_per_yl }}€ per person is configured to be paid to:{% endblocktrans %}
@@ -99,6 +100,14 @@ cost plan! {% endfor %}

+{% if memberlist.statement.allowances_paid < memberlist.statement.real_staff_count %} +

{% blocktrans %}Only {{ allowances_paid }} of the {{ real_staff_count }} youth leaders have requested the outpayment of their allowance.{% endblocktrans %}

+{% endif %} + +{% else %} +

{% blocktrans %}No receivers of the allowance were provided. Allowance will not be used.{% endblocktrans %}

+{% endif %} +{% if memberlist.statement.subsidy_to %}

{% blocktrans %}The subsidies for night and transportation costs of {{ total_subsidies }}€ is configured to be paid to:{% endblocktrans %} @@ -111,6 +120,10 @@ cost plan!

+{% else %} +

{% blocktrans %}No receivers of the subsidies were provided. Subsidies will not be used.{% endblocktrans %}

+ +{% endif %} {% if not memberlist.statement.allowance_to_valid %}

{% blocktrans %}Warning: The configured recipients of the allowance don't match the regulations. This might be because the number of recipients is bigger then the number of admissable youth leaders for this excursion.{% endblocktrans %} -- 2.38.4 From 019e37568ad04f25ef5c41e7f370ab2e2a332a1a Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Mon, 27 Jan 2025 21:30:22 +0100 Subject: [PATCH 5/6] remove fuzzy translation --- jdav_web/finance/locale/de/LC_MESSAGES/django.po | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/jdav_web/finance/locale/de/LC_MESSAGES/django.po b/jdav_web/finance/locale/de/LC_MESSAGES/django.po index ee8c986..d1fb9d9 100644 --- a/jdav_web/finance/locale/de/LC_MESSAGES/django.po +++ b/jdav_web/finance/locale/de/LC_MESSAGES/django.po @@ -33,10 +33,8 @@ msgstr "" "sobald wie möglich zukommen." #: finance/admin.py -#, fuzzy -#| msgid "Finance" msgid "Finance overview" -msgstr "Finanzen" +msgstr "Kostenübersicht" #: finance/admin.py msgid "Submit statement" -- 2.38.4 From 03a0d2e3c3d465d05b92018d0621ee59ef886715 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Mon, 27 Jan 2025 21:34:27 +0100 Subject: [PATCH 6/6] unskip test --- jdav_web/finance/tests.py | 1 - 1 file changed, 1 deletion(-) diff --git a/jdav_web/finance/tests.py b/jdav_web/finance/tests.py index 6d8b34f..9e04c97 100644 --- a/jdav_web/finance/tests.py +++ b/jdav_web/finance/tests.py @@ -209,7 +209,6 @@ class StatementTestCase(TestCase): self.assertFalse(self.st.is_valid(), 'Transaction is valid, although an unreasonable gift is paid.') - @skip('This fails on main, but will be resolved when #112 is merged.') def test_allowance_to_valid(self): self.assertEqual(self.st3.excursion.participant_count, self.participant_count) # st3 should have 3 admissible yls and all of them should receive allowance -- 2.38.4