mirror of
https://github.com/pretix/pretix.git
synced 2026-05-05 15:14:04 +00:00
Allow to store strucutred SEPA bank transfer details
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
# Generated by Django 2.1 on 2018-10-23 22:09
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
def set_type(app, schema_editor):
|
||||
EventSettingsStore = app.get_model('pretixbase', 'Event_SettingsStore')
|
||||
|
||||
for setting in EventSettingsStore.objects.filter(key='payment_banktransfer_bank_details').select_related('object'):
|
||||
EventSettingsStore.objects.create(
|
||||
object=setting.object,
|
||||
key='payment_banktransfer_bank_details_type',
|
||||
value='other'
|
||||
)
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('banktransfer', '0004_auto_20170619_1125'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(set_type, migrations.RunPython.noop)
|
||||
]
|
||||
@@ -3,11 +3,13 @@ import textwrap
|
||||
from collections import OrderedDict
|
||||
|
||||
from django import forms
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.http import HttpRequest
|
||||
from django.template.loader import get_template
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from i18nfield.fields import I18nFormField, I18nTextarea
|
||||
from i18nfield.strings import LazyI18nString
|
||||
from localflavor.generic.forms import BICFormField, IBANFormField
|
||||
|
||||
from pretix.base.models import OrderPayment
|
||||
from pretix.base.payment import BasePaymentProvider
|
||||
@@ -19,30 +21,80 @@ class BankTransfer(BasePaymentProvider):
|
||||
abort_pending_allowed = True
|
||||
|
||||
@staticmethod
|
||||
def form_field(**kwargs):
|
||||
return I18nFormField(
|
||||
label=_('Bank account details'),
|
||||
widget=I18nTextarea,
|
||||
help_text=_('Include everything that your customers need to send you a bank transfer payment. Within SEPA '
|
||||
'countries, IBAN, BIC and account owner should suffice. If you have lots of international '
|
||||
'customers, they might also need your full address and your bank\'s full address.'),
|
||||
widget_kwargs={'attrs': {
|
||||
'rows': '4',
|
||||
'placeholder': _(
|
||||
'e.g. IBAN: DE12 1234 5678 8765 4321\n'
|
||||
'BIC: GENEXAMPLE1\n'
|
||||
'Account owner: John Doe\n'
|
||||
'Name of Bank: Professional Banking Institute Ltd., London'
|
||||
)
|
||||
}},
|
||||
**kwargs
|
||||
)
|
||||
def form_fields():
|
||||
return OrderedDict([
|
||||
('bank_details_type', forms.ChoiceField(
|
||||
label=_('Bank account type'),
|
||||
widget=forms.RadioSelect,
|
||||
choices=(
|
||||
('sepa', _('SEPA bank account')),
|
||||
('other', _('Other bank account')),
|
||||
),
|
||||
initial='sepa'
|
||||
)),
|
||||
('bank_details_sepa_name', forms.CharField(
|
||||
label=_('Name of account holder'),
|
||||
widget=forms.TextInput(
|
||||
attrs={
|
||||
'data-display-dependency': '#id_payment_banktransfer_bank_details_type_0',
|
||||
'data-required-if': '#id_payment_banktransfer_bank_details_type_0'
|
||||
}
|
||||
),
|
||||
required=False
|
||||
)),
|
||||
('bank_details_sepa_iban', IBANFormField(
|
||||
label=_('IBAN'),
|
||||
required=False,
|
||||
widget=forms.TextInput(
|
||||
attrs={
|
||||
'data-display-dependency': '#id_payment_banktransfer_bank_details_type_0',
|
||||
'data-required-if': '#id_payment_banktransfer_bank_details_type_0'
|
||||
}
|
||||
),
|
||||
)),
|
||||
('bank_details_sepa_bic', BICFormField(
|
||||
label=_('BIC'),
|
||||
widget=forms.TextInput(
|
||||
attrs={
|
||||
'data-display-dependency': '#id_payment_banktransfer_bank_details_type_0',
|
||||
'data-required-if': '#id_payment_banktransfer_bank_details_type_0'
|
||||
}
|
||||
),
|
||||
required=False
|
||||
)),
|
||||
('bank_details_sepa_bank', forms.CharField(
|
||||
label=_('Name of bank'),
|
||||
widget=forms.TextInput(
|
||||
attrs={
|
||||
'data-display-dependency': '#id_payment_banktransfer_bank_details_type_0',
|
||||
'data-required-if': '#id_payment_banktransfer_bank_details_type_0'
|
||||
}
|
||||
),
|
||||
required=False
|
||||
)),
|
||||
('bank_details', I18nFormField(
|
||||
label=_('Bank account details'),
|
||||
widget=I18nTextarea,
|
||||
help_text=_(
|
||||
'Include everything else that your customers might need to send you a bank transfer payment. '
|
||||
'If you have lots of international customers, they might need your full address and your '
|
||||
'bank\'s full address.'),
|
||||
widget_kwargs={'attrs': {
|
||||
'rows': '4',
|
||||
'placeholder': _(
|
||||
'For SEPA accounts, you can leave this empty. Otherwise, please add everything that '
|
||||
'your customers need to transfer the money, e.g. account numbers, routing numbers, '
|
||||
'addresses, etc.'
|
||||
),
|
||||
}},
|
||||
required=False
|
||||
))
|
||||
])
|
||||
|
||||
@property
|
||||
def settings_form_fields(self):
|
||||
d = OrderedDict(
|
||||
list(super().settings_form_fields.items()) + [
|
||||
('bank_details', self.form_field()),
|
||||
list(super().settings_form_fields.items()) + list(BankTransfer.form_fields().items()) + [
|
||||
('omit_hyphen', forms.BooleanField(
|
||||
label=_('Do not include a hypen in the payment reference.'),
|
||||
help_text=_('This is required in some countries.'),
|
||||
@@ -52,14 +104,34 @@ class BankTransfer(BasePaymentProvider):
|
||||
]
|
||||
)
|
||||
d.move_to_end('bank_details', last=False)
|
||||
d.move_to_end('bank_details_sepa_bank', last=False)
|
||||
d.move_to_end('bank_details_sepa_bic', last=False)
|
||||
d.move_to_end('bank_details_sepa_iban', last=False)
|
||||
d.move_to_end('bank_details_sepa_name', last=False)
|
||||
d.move_to_end('bank_details_type', last=False)
|
||||
d.move_to_end('_enabled', last=False)
|
||||
return d
|
||||
|
||||
def settings_form_clean(self, cleaned_data):
|
||||
if cleaned_data.get('payment_banktransfer_bank_details_type') == 'sepa':
|
||||
for f in (
|
||||
'bank_details_sepa_name', 'bank_details_sepa_bank', 'bank_details_sepa_bic',
|
||||
'bank_details_sepa_iban'):
|
||||
if not cleaned_data.get('payment_banktransfer_%s' % f):
|
||||
raise ValidationError(
|
||||
{'payment_banktransfer_%s' % f: _('Please fill out your bank account details.')})
|
||||
else:
|
||||
if not cleaned_data.get('payment_banktransfer_bank_details'):
|
||||
raise ValidationError(
|
||||
{'payment_banktransfer_bank_details': _('Please enter your bank account details.')})
|
||||
return cleaned_data
|
||||
|
||||
def payment_form_render(self, request) -> str:
|
||||
template = get_template('pretixplugins/banktransfer/checkout_payment_form.html')
|
||||
ctx = {
|
||||
'request': request,
|
||||
'event': self.event,
|
||||
'settings': self.settings,
|
||||
'details': self.settings.get('bank_details', as_type=LazyI18nString),
|
||||
}
|
||||
return template.render(ctx)
|
||||
@@ -78,11 +150,22 @@ class BankTransfer(BasePaymentProvider):
|
||||
|
||||
def order_pending_mail_render(self, order) -> str:
|
||||
template = get_template('pretixplugins/banktransfer/email/order_pending.txt')
|
||||
bankdetails = []
|
||||
if self.settings.get('bank_details_type') == 'sepa':
|
||||
bankdetails += [
|
||||
_("Account holder"), ": ", self.settings.get('bank_details_sepa_name'), "\n",
|
||||
_("IBAN"), ": ", self.settings.get('bank_details_sepa_iban'), "\n",
|
||||
_("BIC"), ": ", self.settings.get('bank_details_sepa_bic'), "\n",
|
||||
_("Bank"), ": ", self.settings.get('bank_details_sepa_bank'),
|
||||
]
|
||||
if bankdetails and self.settings.get('bank_details', as_type=LazyI18nString):
|
||||
bankdetails.append("\n")
|
||||
bankdetails.append(self.settings.get('bank_details', as_type=LazyI18nString))
|
||||
ctx = {
|
||||
'event': self.event,
|
||||
'order': order,
|
||||
'code': self._code(order),
|
||||
'details': textwrap.indent(str(self.settings.get('bank_details', as_type=LazyI18nString)), ' '),
|
||||
'details': textwrap.indent(''.join(str(i) for i in bankdetails), ' '),
|
||||
}
|
||||
return template.render(ctx)
|
||||
|
||||
@@ -92,6 +175,7 @@ class BankTransfer(BasePaymentProvider):
|
||||
'event': self.event,
|
||||
'code': self._code(payment.order),
|
||||
'order': payment.order,
|
||||
'settings': self.settings,
|
||||
'details': self.settings.get('bank_details', as_type=LazyI18nString),
|
||||
}
|
||||
return template.render(ctx)
|
||||
|
||||
@@ -6,7 +6,15 @@
|
||||
{% endblocktrans %}</p>
|
||||
|
||||
<address>
|
||||
{{ details|linebreaksbr }}<br>
|
||||
{% if settings.bank_details_type == "sepa" %}
|
||||
{% trans "Account holder" %}: {{ settings.bank_details_sepa_name }}<br>
|
||||
{% trans "IBAN" %}: {{ settings.bank_details_sepa_iban }}<br>
|
||||
{% trans "BIC" %}: {{ settings.bank_details_sepa_bic }}<br>
|
||||
{% trans "Bank" %}: {{ settings.bank_details_sepa_bank }}<br>
|
||||
{% endif %}
|
||||
{% if details %}
|
||||
{{ details|linebreaksbr }}<br>
|
||||
{% endif %}
|
||||
<strong>
|
||||
{% trans "We will assign you a personal reference code to use after you completed the order." %}
|
||||
</strong>
|
||||
|
||||
@@ -7,7 +7,15 @@
|
||||
{% endblocktrans %}</p>
|
||||
|
||||
<address>
|
||||
{{ details|linebreaksbr }}<br />
|
||||
{% trans "Amount:" %} {{ order.total|money:event.currency }}<br />
|
||||
{% if settings.bank_details_type == "sepa" %}
|
||||
<strong>{% trans "Account holder" %}:</strong> {{ settings.bank_details_sepa_name }}<br>
|
||||
<strong>{% trans "IBAN" %}:</strong> {{ settings.bank_details_sepa_iban }}<br>
|
||||
<strong>{% trans "BIC" %}:</strong> {{ settings.bank_details_sepa_bic }}<br>
|
||||
<strong>{% trans "Bank" %}:</strong> {{ settings.bank_details_sepa_bank }}<br>
|
||||
{% endif %}
|
||||
{% if details %}
|
||||
{{ details|linebreaksbr }}<br>
|
||||
{% endif %}
|
||||
<strong>{% trans "Amount:" %}</strong> {{ order.total|money:event.currency }}<br />
|
||||
<strong>{% trans "Reference code (important):" %} {{ code }}</strong>
|
||||
</address>
|
||||
|
||||
Reference in New Issue
Block a user