finance/statement: make subsidy_to and allowance_to optional #112

Merged
christian.merten merged 7 commits from MK/no_subsidies_allowances into main 11 months ago

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-01-19 14:26+0100\n" "POT-Creation-Date: 2025-01-25 11:56+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -32,6 +32,10 @@ msgstr ""
"Rechnung %(name)s erfolgreich eingereicht. Das Finanzreferat wird auf dich " "Rechnung %(name)s erfolgreich eingereicht. Das Finanzreferat wird auf dich "
"sobald wie möglich zukommen." "sobald wie möglich zukommen."
#: finance/admin.py
msgid "Finance overview"
msgstr "Kostenübersicht"
#: finance/admin.py #: finance/admin.py
msgid "Submit statement" msgid "Submit statement"
msgstr "Rechnung einreichen" msgstr "Rechnung einreichen"
@ -182,13 +186,10 @@ msgid "Pay allowance to"
msgstr "Aufwandsentschädigung auszahlen an" msgstr "Aufwandsentschädigung auszahlen an"
#: finance/models.py #: finance/models.py
msgid "" msgid "The youth leaders to which an allowance should be paid."
"The youth leaders to which an allowance should be paid. The count must match "
"the number of permitted youth leaders."
msgstr "" msgstr ""
"Die Jugendleiter*innen an die eine Aufwandsentschädigung ausgezahlt werden " "Die Jugendleiter*innen an die eine Aufwandsentschädigung ausgezahlt werden "
"soll. Die Anzahl muss mit der Anzahl an zugelassenen Jugendleiter*innen " "soll."
"übereinstimmen. "
#: finance/models.py #: finance/models.py
msgid "Pay subsidy to" msgid "Pay subsidy to"
@ -412,8 +413,8 @@ msgstr "Ausfahrt"
#, python-format #, python-format
msgid "This excursion featured %(staff_count)s youth leader(s), each costing" msgid "This excursion featured %(staff_count)s youth leader(s), each costing"
msgstr "" msgstr ""
"Diese Ausfahrt hatte %(staff_count)s genehmigte Jugendleiter*innen. Auf " "Diese Ausfahrt hatte %(staff_count)s genehmigte Jugendleiter*innen. Für "
"jede*n entfallen die folgenden Kosten:" "jede*n besteht ein Anspruch auf folgende Zuschüsse und Aufwandsentschädigungen:"
#: finance/templates/admin/overview_submitted_statement.html #: finance/templates/admin/overview_submitted_statement.html
#, python-format #, python-format
@ -427,29 +428,33 @@ msgstr ""
#: finance/templates/admin/overview_submitted_statement.html #: finance/templates/admin/overview_submitted_statement.html
#, python-format #, python-format
msgid "" msgid ""
"%(duration)s days for %(allowance_per_day)s€ per day making a total of " "%(kilometers_traveled)s km by %(means_of_transport)s (%(euro_per_km)s € / "
"%(allowance_per_yl)s€." "km) making a total of %(transportation_per_yl)s€."
msgstr "" msgstr ""
"%(duration)s Tage für %(allowance_per_day)s€ pro Tag. Das ergibt eine " "%(kilometers_traveled)s km mit %(means_of_transport)s (%(euro_per_km)s€ / "
"Gesamtsumme von %(allowance_per_yl)s€." "km). Das ergibt eine Gesamtsumme von %(transportation_per_yl)s€."
#: finance/templates/admin/overview_submitted_statement.html #: finance/templates/admin/overview_submitted_statement.html
#, python-format #, python-format
msgid "" msgid ""
"%(kilometers_traveled)s km by %(means_of_transport)s (%(euro_per_km)s € / " "%(duration)s days for %(allowance_per_day)s€ per day making a total of "
"km) making a total of %(transportation_per_yl)s€." "%(allowance_per_yl)s€."
msgstr "" msgstr ""
"%(kilometers_traveled)s km mit %(means_of_transport)s (%(euro_per_km)s€ / " "%(duration)s Tage für %(allowance_per_day)s€ pro Tag. Das ergibt eine "
"km). Das ergibt eine Gesamtsumme von %(transportation_per_yl)s€." "Gesamtsumme von %(allowance_per_yl)s€."
#: finance/templates/admin/overview_submitted_statement.html #: finance/templates/admin/overview_submitted_statement.html
#, python-format #, python-format
msgid "" msgid ""
"In total this is %(total_per_yl)s€ times %(staff_count)s, giving " "In total this is %(total_per_yl)s€ times %(staff_count)s, giving "
"%(total_staff)s€." "%(theoretical_total_staff)s€."
msgstr "" msgstr ""
"Insgesamt sind das Kosten von %(total_per_yl)s€ mal %(staff_count)s, " "Insgesamt sind das Kosten von %(total_per_yl)s€ mal %(staff_count)s, "
"insgesamt also %(total_staff)s€." "insgesamt also maximal %(theoretical_total_staff)s€."
#: finance/templates/admin/overview_submitted_statement.html
msgid "Payment of subsidies and allowances"
msgstr "Auszahlung von Sektionszuschüssen und Aufwandsentschädigungen"
#: finance/templates/admin/overview_submitted_statement.html #: finance/templates/admin/overview_submitted_statement.html
#, python-format #, python-format
@ -458,6 +463,27 @@ msgstr ""
"Die Aufwandsentschädigung von %(allowance_per_yl)s€ pro Person soll " "Die Aufwandsentschädigung von %(allowance_per_yl)s€ pro Person soll "
"ausgezahlt werden an:" "ausgezahlt werden an:"
#: finance/templates/admin/overview_submitted_statement.html
#: finance/templates/admin/submit_statement.html
msgid "IBAN valid"
msgstr "IBAN gültig"
#: finance/templates/admin/overview_submitted_statement.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."
#: finance/templates/admin/overview_submitted_statement.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."
#: finance/templates/admin/overview_submitted_statement.html #: finance/templates/admin/overview_submitted_statement.html
#, python-format #, python-format
msgid "" msgid ""
@ -465,7 +491,14 @@ msgid ""
"should be paid to:" "should be paid to:"
msgstr "" msgstr ""
"Die Zuschüsse für Übernachtungs- und Fahrtkosten von %(total_subsidies)s€ " "Die Zuschüsse für Übernachtungs- und Fahrtkosten von %(total_subsidies)s€ "
"sollen ausgezahlt werden an:" "für alle Jugendleiter*innen sollen ausgezahlt werden an:"
#: finance/templates/admin/overview_submitted_statement.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."
#: finance/templates/admin/overview_submitted_statement.html #: finance/templates/admin/overview_submitted_statement.html
#, python-format #, python-format
@ -542,10 +575,6 @@ msgstr ""
"Bitte überprüfe, ob alle Ausgaben korrekt erfasst sind und ob alle " "Bitte überprüfe, ob alle Ausgaben korrekt erfasst sind und ob alle "
"auslegenden Personen eine gültige IBAN haben." "auslegenden Personen eine gültige IBAN haben."
#: finance/templates/admin/submit_statement.html
msgid "IBAN valid"
msgstr "IBAN gültig"
#: finance/templates/admin/submit_statement.html #: finance/templates/admin/submit_statement.html
msgid "" msgid ""
"Do you want to submit the statement for further processing by the finance " "Do you want to submit the statement for further processing by the finance "

@ -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'),
),
]

@ -62,9 +62,10 @@ class Statement(CommonModel):
allowance_to = models.ManyToManyField(Member, verbose_name=_('Pay allowance to'), allowance_to = models.ManyToManyField(Member, verbose_name=_('Pay allowance to'),
related_name='receives_allowance_for_statements', related_name='receives_allowance_for_statements',
blank=True, 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'), subsidy_to = models.ForeignKey(Member, verbose_name=_('Pay subsidy to'),
null=True, null=True,
blank=True,
on_delete=models.SET_NULL, on_delete=models.SET_NULL,
related_name='receives_subsidy_for_statements', 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.')) help_text=_('The person that should receive the subsidy for night and travel costs. Typically the person who paid for them.'))
@ -163,7 +164,8 @@ class Statement(CommonModel):
@property @property
def allowance_to_valid(self): def allowance_to_valid(self):
"""Checks if the configured `allowance_to` field matches the regulations.""" """Checks if the configured `allowance_to` field matches the regulations."""
if self.allowance_to.count() != self.real_staff_count: if self.allowances_paid > self.real_staff_count:
# it is allowed that less allowances are utilized than youth leaders are enlisted
return False return False
if self.excursion is not None: if self.excursion is not None:
yls = self.excursion.jugendleiter.all() yls = self.excursion.jugendleiter.all()
@ -239,8 +241,7 @@ class Statement(CommonModel):
if self.subsidy_to: if self.subsidy_to:
ref = _("Night and travel costs for %(excu)s") % {'excu': self.excursion.name} ref = _("Night and travel costs for %(excu)s") % {'excu': self.excursion.name}
Transaction(statement=self, member=self.subsidy_to, amount=self.total_subsidies, confirmed=False, reference=ref).save() Transaction(statement=self, member=self.subsidy_to, amount=self.total_subsidies, confirmed=False, reference=ref).save()
else:
return False
return True return True
def reduce_transactions(self): def reduce_transactions(self):
@ -299,9 +300,13 @@ class Statement(CommonModel):
return cvt_to_decimal(self.excursion.duration * settings.ALLOWANCE_PER_DAY) return cvt_to_decimal(self.excursion.duration * settings.ALLOWANCE_PER_DAY)
@property
def allowances_paid(self):
return self.allowance_to.count()
@property @property
def total_allowance(self): def total_allowance(self):
return self.allowance_per_yl * self.real_staff_count return self.allowance_per_yl * self.allowances_paid
@property @property
def total_transportation(self): def total_transportation(self):
@ -341,11 +346,24 @@ class Statement(CommonModel):
The total amount of subsidies excluding the allowance, i.e. the transportation 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. 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 theoretical_total_staff(self):
"""
the sum of subsidies and allowances if all eligible youth leaders would collect them.
"""
return self.total_per_yl * self.real_staff_count
@property @property
def total_staff(self): def total_staff(self):
return self.total_per_yl * self.real_staff_count """
the sum of subsidies and allowances that youth leaders are actually collecting
"""
return self.total_allowance + self.total_subsidies
@property @property
def real_staff_count(self): def real_staff_count(self):
@ -397,11 +415,14 @@ class Statement(CommonModel):
'means_of_transport': self.excursion.get_tour_approach(), 'means_of_transport': self.excursion.get_tour_approach(),
'euro_per_km': self.euro_per_km, 'euro_per_km': self.euro_per_km,
'allowance_per_day': settings.ALLOWANCE_PER_DAY, 'allowance_per_day': settings.ALLOWANCE_PER_DAY,
'allowances_paid': self.allowances_paid,
'nights_per_yl': self.nights_per_yl, 'nights_per_yl': self.nights_per_yl,
'allowance_per_yl': self.allowance_per_yl, 'allowance_per_yl': self.allowance_per_yl,
'transportation_per_yl': self.transportation_per_yl, 'transportation_per_yl': self.transportation_per_yl,
'total_per_yl': self.total_per_yl, 'total_per_yl': self.total_per_yl,
'total_staff': self.total_staff, 'total_staff': self.total_staff,
'theoretical_total_staff': self.theoretical_total_staff,
'real_staff_count': self.real_staff_count,
'total_subsidies': self.total_subsidies, 'total_subsidies': self.total_subsidies,
} }
return dict(context, **excursion_context) return dict(context, **excursion_context)

@ -71,27 +71,47 @@
</ul> </ul>
</p> </p>
<p> <p>
{% 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 %}
</p> </p>
<h2>{% trans "Payment of subsidies and allowances" %}</h2>
{% if allowances_paid > 0 %}
<p> <p>
{% blocktrans %}The allowance of {{ allowance_per_yl }}€ per person should be paid to:{% endblocktrans %} {% blocktrans %}The allowance of {{ allowance_per_yl }}€ per person should be paid to:{% endblocktrans %}
<ul> <table>
<th>
<td>{% trans "IBAN valid" %}</td>
</th>
{% for member in statement.allowance_to.all %} {% for member in statement.allowance_to.all %}
<li> <tr>
{{ member.name }} <td>{{ member.name }}</td>
</li> <td>{{ member.iban_valid|render_bool }}</td>
</tr>
{% endfor %} {% endfor %}
</ul> </table>
</p> </p>
{% if allowances_paid < real_staff_count %}
<p>{% blocktrans %}Only {{ allowances_paid }} of the {{ real_staff_count }} youth leaders have requested the outpayment of their allowance.{% endblocktrans %}</p>
{% endif %}
{% else %}
<p>{% blocktrans %}No receivers of the allowance were provided. Allowance will not be used.{% endblocktrans %}</p>
{% endif %}
{% if statement.subsidy_to %}
<p> <p>
{% blocktrans %}The subsidies for night and transportation costs of {{ total_subsidies }}€ should be paid to:{% endblocktrans %} {% blocktrans %}The subsidies for night and transportation costs of {{ total_subsidies }}€ should be paid to:{% endblocktrans %}
<ul> <table>
<li> <th>
{{ statement.subsidy_to.name }} <td>{% trans "IBAN valid" %}</td>
</li> </th>
</ul> <tr>
<td>{{ statement.subsidy_to.name }}</td>
<td>{{ statement.subsidy_to.iban_valid|render_bool }}</td>
</tr>
</table>
</p> </p>
{% else %}
<p>{% blocktrans %}No receivers of the subsidies were provided. Subsidies will not be used.{% endblocktrans %}</p>
{% endif %}
{% endif %} {% endif %}

@ -209,7 +209,6 @@ class StatementTestCase(TestCase):
self.assertFalse(self.st.is_valid(), self.assertFalse(self.st.is_valid(),
'Transaction is valid, although an unreasonable gift is paid.') '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): def test_allowance_to_valid(self):
self.assertEqual(self.st3.excursion.participant_count, self.participant_count) self.assertEqual(self.st3.excursion.participant_count, self.participant_count)
# st3 should have 3 admissible yls and all of them should receive allowance # st3 should have 3 admissible yls and all of them should receive allowance

@ -866,11 +866,6 @@ class StatementOnListForm(forms.ModelForm):
'allowance_to': _("This excursion only has up to %(approved_count)s approved youth leaders, but you listed %(entered_count)s.") % {'approved_count': str(excursion.approved_staff_count), 'allowance_to': _("This excursion only has up to %(approved_count)s approved youth leaders, but you listed %(entered_count)s.") % {'approved_count': str(excursion.approved_staff_count),
'entered_count': str(allowance_to.count())}, 'entered_count': str(allowance_to.count())},
}) })
if allowance_to.count() < min(excursion.approved_staff_count, excursion.jugendleiter.count()):
raise ValidationError({
'allowance_to': _("This excursion has %(approved_count)s approved youth leaders, but you listed only %(entered_count)s.") % {'approved_count': str(excursion.approved_staff_count),
'entered_count': str(allowance_to.count())},
})
class StatementOnListInline(CommonAdminInlineMixin, nested_admin.NestedStackedInline): class StatementOnListInline(CommonAdminInlineMixin, nested_admin.NestedStackedInline):

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -268,15 +268,6 @@ msgstr ""
"Diese Ausfahrt hat nur bis zu %(approved_count)s zugelassene " "Diese Ausfahrt hat nur bis zu %(approved_count)s zugelassene "
"Jugendleiter*innen, aber du hast %(entered_count)s eingetragen." "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 #: members/admin.py
msgid "" msgid ""
"Please list here all expenses in relation with this excursion and upload " "Please list here all expenses in relation with this excursion and upload "
@ -1129,20 +1120,20 @@ msgstr ""
#: members/templates/admin/freizeit_finance_overview.html #: members/templates/admin/freizeit_finance_overview.html
#, python-format #, python-format
msgid "" msgid ""
"%(duration)s days for %(allowance_per_day)s€ per day making a total of " "%(kilometers_traveled)s km by %(means_of_transport)s (%(euro_per_km)s € / "
"%(allowance_per_yl)s€." "km) making a total of %(transportation_per_yl)s€."
msgstr "" msgstr ""
"%(duration)s Tage für %(allowance_per_day)s€ pro Tag. Das ergibt eine " "%(kilometers_traveled)s km mit %(means_of_transport)s (%(euro_per_km)s€ / "
"Gesamtsumme von %(allowance_per_yl)s€." "km). Das ergibt eine Gesamtsumme von %(transportation_per_yl)s€."
#: members/templates/admin/freizeit_finance_overview.html #: members/templates/admin/freizeit_finance_overview.html
#, python-format #, python-format
msgid "" msgid ""
"%(kilometers_traveled)s km by %(means_of_transport)s (%(euro_per_km)s € / " "%(duration)s days for %(allowance_per_day)s€ per day making a total of "
"km) making a total of %(transportation_per_yl)s€." "%(allowance_per_yl)s€."
msgstr "" msgstr ""
"%(kilometers_traveled)s km mit %(means_of_transport)s (%(euro_per_km)s€ / " "%(duration)s Tage für %(allowance_per_day)s€ pro Tag. Das ergibt eine "
"km). Das ergibt eine Gesamtsumme von %(transportation_per_yl)s€." "Gesamtsumme von %(allowance_per_yl)s€."
#: members/templates/admin/freizeit_finance_overview.html #: members/templates/admin/freizeit_finance_overview.html
#, python-format #, python-format
@ -1153,6 +1144,22 @@ msgstr ""
"Die Aufwandsentschädigung von %(allowance_per_yl)s€ pro Person wird " "Die Aufwandsentschädigung von %(allowance_per_yl)s€ pro Person wird "
"ausgezahlt an:" "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 #: members/templates/admin/freizeit_finance_overview.html
#, python-format #, python-format
msgid "" msgid ""
@ -1160,7 +1167,14 @@ msgid ""
"configured to be paid to:" "configured to be paid to:"
msgstr "" msgstr ""
"Die Zuschüsse für Übernachtungs- und Fahrtkosten von %(total_subsidies)s€ " "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 #: members/templates/admin/freizeit_finance_overview.html
msgid "" msgid ""
@ -1486,13 +1500,13 @@ msgstr "Speichern und Registrierung bestätigen"
msgid "Echo" msgid "Echo"
msgstr "Rückmeldung" 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:" msgid "Thanks for echoing back. Here is your current data:"
msgstr "" msgstr ""
"Vielen Dank, dass du dich rückmeldest. Hier siehst du deine aktuellen Daten. " "Vielen Dank, dass du dich rückmeldest. Hier siehst du deine aktuellen Daten. "
"Falls sich etwas geändert hat, trage das bitte hier ein." "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" msgid "Echo failed"
msgstr "Rückmeldung fehlgeschlagen" msgstr "Rückmeldung fehlgeschlagen"
@ -1513,7 +1527,7 @@ msgstr "Wenn du denkst, dass das ein Fehler ist, "
msgid "contact us." msgid "contact us."
msgstr "kontaktiere uns." msgstr "kontaktiere uns."
#: members/templates/members/echo_password.html #: members/templates/members/echo_password.html members/tests.py
msgid "" msgid ""
"Thanks for echoing back. Please enter the password, which you can find in " "Thanks for echoing back. Please enter the password, which you can find in "
"the email we sent you.\n" "the email we sent you.\n"
@ -1535,7 +1549,7 @@ msgstr "Rückmeldung erfolgreich"
msgid "Thank you" msgid "Thank you"
msgstr "Danke" msgstr "Danke"
#: members/templates/members/echo_success.html #: members/templates/members/echo_success.html members/tests.py
msgid "Your data was successfully updated." msgid "Your data was successfully updated."
msgstr "Deine Daten wurden erfolgreich aktualisiert." msgstr "Deine Daten wurden erfolgreich aktualisiert."
@ -1562,16 +1576,16 @@ msgstr "Registrierung fehlgeschlagen"
msgid "Registration" msgid "Registration"
msgstr "Registrierung" msgstr "Registrierung"
#: members/templates/members/mail_confirmation_invalid.html #: members/templates/members/mail_confirmation_invalid.html members/tests.py
msgid "Mail confirmation failed" msgid "Mail confirmation failed"
msgstr "Emailbestätigung fehlgeschlagen" msgstr "Emailbestätigung fehlgeschlagen"
#: members/templates/members/mail_confirmation_invalid.html #: 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." msgid "The supplied link is invalid."
msgstr "Der verwendete Link ist ungültig." 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" msgid "Mail confirmed"
msgstr "Emailadresse bestätigt" msgstr "Emailadresse bestätigt"
@ -1644,7 +1658,7 @@ msgstr "Registrieren"
msgid "Here you can register for group" msgid "Here you can register for group"
msgstr "Hier kannst du dich registrieren für die Gruppe" 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." msgid "Something went wrong while processing your registration."
msgstr "Etwas ist schief gelaufen, bei der Verarbeitung deiner Registrierung." 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." msgstr "Registrierung für die Warteliste."
#: members/templates/members/register_waiting_list_success.html #: members/templates/members/register_waiting_list_success.html
#: members/tests.py
msgid "Your registration for the waiting list was successful." msgid "Your registration for the waiting list was successful."
msgstr "Du wurdest auf die Warteliste gesetzt." msgstr "Du wurdest auf die Warteliste gesetzt."
@ -1724,7 +1739,7 @@ msgstr ""
msgid "Reject invitation" msgid "Reject invitation"
msgstr "Einladung ablehnen" 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." msgid "This invitation is invalid or expired."
msgstr "Diese Einladung ist ungültig oder abgelaufen." msgstr "Diese Einladung ist ungültig oder abgelaufen."
@ -1792,7 +1807,7 @@ msgstr ""
"zustimmst, unterschreibe bitte das Formular und lade hier einen Scan oder " "zustimmst, unterschreibe bitte das Formular und lade hier einen Scan oder "
"ein Bild hoch." "ein Bild hoch."
#: members/templates/members/upload_registration_form.html #: members/templates/members/upload_registration_form.html members/tests.py
msgid "" msgid ""
"If you are not an adult yet, please let someone responsible for you sign the " "If you are not an adult yet, please let someone responsible for you sign the "
"agreement." "agreement."
@ -1805,10 +1820,12 @@ msgid "Upload"
msgstr "Hochladen" msgstr "Hochladen"
#: members/templates/members/upload_registration_form_invalid.html #: members/templates/members/upload_registration_form_invalid.html
#: members/tests.py
msgid "The supplied key for uploading a registration form is invalid." msgid "The supplied key for uploading a registration form is invalid."
msgstr "Der verwendete Link zum Hochladen eines Anmeldeformulars ist ungültig." msgstr "Der verwendete Link zum Hochladen eines Anmeldeformulars ist ungültig."
#: members/templates/members/upload_registration_form_success.html #: members/templates/members/upload_registration_form_success.html
#: members/tests.py
msgid "" msgid ""
"Thank you for uploading the registration form. Our team will process your " "Thank you for uploading the registration form. Our team will process your "
"registration shortly." "registration shortly."
@ -1828,11 +1845,11 @@ msgstr ""
"Leider hast du deinen Wartelistenplatz nicht rechtzeitig bestätigt und hast " "Leider hast du deinen Wartelistenplatz nicht rechtzeitig bestätigt und hast "
"somit deinen Platz verloren. Du kannst" "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" msgid "rejoin the waiting list"
msgstr "der Warteliste erneut beitreten" 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" msgid "Waiting confirmed"
msgstr "Wartelistenplatz bestätigt" msgstr "Wartelistenplatz bestätigt"
@ -1854,6 +1871,22 @@ msgstr ""
"Danke %(prename)s für dein Interesse auf der Warteliste zu bleiben.\n" "Danke %(prename)s für dein Interesse auf der Warteliste zu bleiben.\n"
"Dein Platz wurde bestätigt." "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 #: members/views.py
msgid "Prename of the member." msgid "Prename of the member."
msgstr "Vorname des*der Teilnehmenden" msgstr "Vorname des*der Teilnehmenden"
@ -1876,22 +1909,18 @@ msgstr ""
msgid "optional additional email address" msgid "optional additional email address"
msgstr "Optionale zusätzliche E-Mailadresse" 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 #: members/views.py
msgid "Invalid emergency contacts" msgid "Invalid emergency contacts"
msgstr "Ungültige Notfallkontakte" 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 #, python-format
#~ msgid "" #~ msgid ""
#~ "In total these are contributions of %(total_per_yl)s€ times " #~ "In total these are contributions of %(total_per_yl)s€ times "

@ -86,6 +86,7 @@ cost plan!
</ul> </ul>
</p> </p>
<p> <p>
{% if allowances_paid > 0 %}
{% blocktrans %}The allowance of {{ allowance_per_yl }}€ per person is configured to be paid to:{% endblocktrans %} {% blocktrans %}The allowance of {{ allowance_per_yl }}€ per person is configured to be paid to:{% endblocktrans %}
<table> <table>
<th> <th>
@ -99,6 +100,14 @@ cost plan!
{% endfor %} {% endfor %}
</table> </table>
</p> </p>
{% if memberlist.statement.allowances_paid < memberlist.statement.real_staff_count %}
<p>{% blocktrans %}Only {{ allowances_paid }} of the {{ real_staff_count }} youth leaders have requested the outpayment of their allowance.{% endblocktrans %}</p>
{% endif %}
{% else %}
<p>{% blocktrans %}No receivers of the allowance were provided. Allowance will not be used.{% endblocktrans %}</p>
{% endif %}
{% if memberlist.statement.subsidy_to %}
<p> <p>
{% blocktrans %}The subsidies for night and transportation costs of {{ total_subsidies }}€ is configured to be paid to:{% endblocktrans %} {% blocktrans %}The subsidies for night and transportation costs of {{ total_subsidies }}€ is configured to be paid to:{% endblocktrans %}
<table> <table>
@ -111,6 +120,10 @@ cost plan!
</tr> </tr>
</table> </table>
</p> </p>
{% else %}
<p>{% blocktrans %}No receivers of the subsidies were provided. Subsidies will not be used.{% endblocktrans %}</p>
{% endif %}
{% if not memberlist.statement.allowance_to_valid %} {% if not memberlist.statement.allowance_to_valid %}
<p> <p>
{% 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 %} {% 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 %}

Loading…
Cancel
Save