Allow to store strucutred SEPA bank transfer details

This commit is contained in:
Raphael Michel
2018-10-24 00:13:49 +02:00
parent 3a0ef3760c
commit e60ff6b777
12 changed files with 220 additions and 47 deletions

View File

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

View File

@@ -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)

View File

@@ -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>

View File

@@ -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>