Allow to set payment term per sales channel (#6459)

* Allow to set payment term per sales channel

* Apply suggestion from @luelista

Co-authored-by: luelista <weller@rami.io>

---------

Co-authored-by: luelista <weller@rami.io>
This commit is contained in:
Raphael Michel
2026-08-24 09:09:47 +02:00
committed by GitHub
co-authored by luelista
parent 91a3993cef
commit 58f331ba1f
5 changed files with 108 additions and 11 deletions
+44
View File
@@ -856,6 +856,50 @@ class PaymentSettingsForm(EventSettingsValidationMixin, SettingsForm):
'tax_rule_payment',
]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.term_channel_fields = {}
for c in self.obj.organizer.sales_channels.all():
if c.type_instance.payment_restrictions_supported and c.identifier != "web":
# At the moment, it seems sufficient to allow this for the same channel types as other payment settings
# We can always introduce more flags later if needed
suffix = '_' + c.identifier.replace(".", "_")
self.term_channel_fields[c] = [
'payment_term_mode' + suffix,
'payment_term_days' + suffix,
'payment_term_minutes' + suffix,
]
self.fields['payment_term_mode' + suffix] = DEFAULTS['payment_term_mode']['form_class'](
label=_("Payment term"),
widget=forms.RadioSelect,
required=False,
choices=(
('', _("same as above")),
('days', _("different payment term in days")),
('minutes', _("different payment term in minutes"))
),
)
self.fields['payment_term_days' + suffix] = DEFAULTS['payment_term_days']['form_class'](
required=False,
**DEFAULTS['payment_term_days']['form_kwargs'](suffix, 1),
)
self.fields['payment_term_minutes' + suffix] = DEFAULTS['payment_term_minutes']['form_class'](
required=False,
**DEFAULTS['payment_term_minutes']['form_kwargs'](suffix, 2),
)
def clean(self):
data = super().clean()
for c in self.term_channel_fields.keys():
suffix = '_' + c.identifier.replace(".", "_")
mode = self.cleaned_data.get(f'payment_term_mode{suffix}')
if mode == 'days' and self.cleaned_data.get(f'payment_term_days{suffix}') is None:
raise ValidationError({f'payment_term_days{suffix}': _("This field is required.")})
if mode == 'minutes' and self.cleaned_data.get(f'payment_term_minutes{suffix}') is None:
raise ValidationError({f'payment_term_minutes{suffix}': _("This field is required.")})
return data
def clean_payment_term_days(self):
value = self.cleaned_data.get('payment_term_days')
if self.cleaned_data.get('payment_term_mode') == 'days' and value is None:
@@ -2,9 +2,10 @@
{% load i18n %}
{% load static %}
{% load bootstrap3 %}
{% load getitem %}
{% block inside %}
<h1>{% trans "Payment settings" %}</h1>
<form action="" method="post" class="form-horizontal form-plugins">
<form action="" method="post" class="form-horizontal">
{% csrf_token %}
<div class="tabbed-form">
<fieldset>
@@ -71,14 +72,37 @@
{% bootstrap_form_errors form layout="control" %}
{% bootstrap_field form.payment_term_mode layout="control" %}
{% bootstrap_field form.payment_term_days layout="control" %}
{% bootstrap_field form.payment_term_weekdays layout="control" %}
{% bootstrap_field form.payment_term_minutes layout="control" %}
{% bootstrap_field form.payment_term_weekdays layout="control" %}
{% bootstrap_field form.payment_term_last layout="control" %}
{% bootstrap_field form.payment_term_expire_automatically layout="control" %}
{% trans "days" context "unit" as days %}
{% bootstrap_field form.payment_term_expire_delay_days layout="control" addon_after=days %}
{% bootstrap_field form.payment_term_accept_late layout="control" %}
{% bootstrap_field form.payment_pending_hidden layout="control" %}
{% for c, fields in form.term_channel_fields.items %}
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">
{% if "." in c.icon %}
<img src="{% static c.icon %}" class="fa-like-image"
data-toggle="tooltip" title="{{ c.type_instance.verbose_name }}">
{% else %}
<span class="fa fa-fw fa-{{ c.icon }} text-muted"
data-toggle="tooltip" title="{{ c.type_instance.verbose_name }}"></span>
{% endif %}
{{ c.label }}
</h3>
</div>
<div class="panel-body">
{% for f in fields %}
{% bootstrap_field form|getitem:f layout="control" %}
{% endfor %}
</div>
</div>
{% endfor %}
</fieldset>
<fieldset>
<legend>{% trans "Advanced" %}</legend>