diff --git a/src/pretix/base/migrations/0008_invoiceaddress.py b/src/pretix/base/migrations/0008_invoiceaddress.py
new file mode 100644
index 0000000000..a05f341c83
--- /dev/null
+++ b/src/pretix/base/migrations/0008_invoiceaddress.py
@@ -0,0 +1,32 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.2 on 2016-02-22 11:17
+from __future__ import unicode_literals
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('pretixbase', '0007_auto_20160211_1710'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='InvoiceAddress',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('last_modified', models.DateTimeField(auto_now=True)),
+ ('company', models.CharField(blank=True, max_length=255, verbose_name='Company name')),
+ ('name', models.CharField(blank=True, max_length=255, verbose_name='Name')),
+ ('street', models.TextField(verbose_name='Address')),
+ ('zipcode', models.CharField(max_length=30, verbose_name='ZIP code')),
+ ('city', models.CharField(max_length=255, verbose_name='City')),
+ ('country', models.CharField(max_length=255, verbose_name='Country')),
+ ('phone', models.CharField(blank=True, max_length=255, verbose_name='Phone number')),
+ ('vat_id', models.CharField(blank=True, max_length=255, verbose_name='VAT ID')),
+ ('order', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='pretixbase.Order')),
+ ],
+ ),
+ ]
diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py
index 11b383d8a1..991ea62aa8 100644
--- a/src/pretix/base/models/orders.py
+++ b/src/pretix/base/models/orders.py
@@ -3,6 +3,7 @@ import string
from datetime import datetime
from decimal import Decimal
+from django import forms
from django.db import models
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
@@ -461,3 +462,16 @@ class CartPosition(AbstractPosition):
if not self.tax_rate:
return Decimal('0.00')
return round_decimal(self.price * (1 - 100 / (100 + self.item.tax_rate)))
+
+
+class InvoiceAddress(models.Model):
+ last_modified = models.DateTimeField(auto_now=True)
+ order = models.OneToOneField(Order, null=True, blank=True, related_name='invoice_address')
+ company = models.CharField(max_length=255, blank=True, verbose_name=_('Company name'))
+ name = models.CharField(max_length=255, verbose_name=_('Name'), blank=True)
+ street = models.TextField(verbose_name=_('Address'), blank=False)
+ zipcode = models.CharField(max_length=30, verbose_name=_('ZIP code'), blank=False)
+ city = models.CharField(max_length=255, verbose_name=_('City'), blank=False)
+ country = models.CharField(max_length=255, verbose_name=_('Country'), blank=False)
+ phone = models.CharField(max_length=255, blank=True, verbose_name=_('Phone number'))
+ vat_id = models.CharField(max_length=255, blank=True, verbose_name=_('VAT ID'))
diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py
index 433dfe1e80..25a8b1dfcf 100644
--- a/src/pretix/base/services/orders.py
+++ b/src/pretix/base/services/orders.py
@@ -10,6 +10,7 @@ from pretix.base.i18n import LazyDate, LazyNumber
from pretix.base.models import (
CartPosition, Event, EventLock, Order, OrderPosition, Quota, User,
)
+from pretix.base.models.orders import InvoiceAddress
from pretix.base.payment import BasePaymentProvider
from pretix.base.services.mail import mail
from pretix.base.signals import (
@@ -216,7 +217,7 @@ def _create_order(event: Event, email: str, positions: List[CartPosition], dt: d
def _perform_order(event: str, payment_provider: str, position_ids: List[str],
- email: str, locale: str):
+ email: str, locale: str, address: int):
event = Event.objects.get(id=event)
responses = register_payment_providers.send(event)
pprov = None
@@ -237,6 +238,18 @@ def _perform_order(event: str, payment_provider: str, position_ids: List[str],
order = _create_order(event, email, positions, dt, pprov,
locale=locale)
+ if address is not None:
+ try:
+ addr = InvoiceAddress.objects.get(
+ pk=address
+ )
+ if addr.order is not None:
+ addr.pk = None
+ addr.order = order
+ addr.save()
+ except InvoiceAddress.DoesNotExist:
+ pass
+
mail(
order.email, _('Your order: %(code)s') % {'code': order.code},
event.settings.mail_text_order_placed,
@@ -257,9 +270,9 @@ def _perform_order(event: str, payment_provider: str, position_ids: List[str],
def perform_order(event: str, payment_provider: str, positions: List[str],
- email: str=None, locale: str=None):
+ email: str=None, locale: str=None, address: int=None):
try:
- return _perform_order(event, payment_provider, positions, email, locale)
+ return _perform_order(event, payment_provider, positions, email, locale, address)
except EventLock.LockTimeoutException:
# Is raised when there are too many threads asking for event locks and we were
# unable to get one
@@ -271,9 +284,9 @@ if settings.HAS_CELERY:
@app.task(bind=True, max_retries=5, default_retry_delay=2)
def perform_order_task(self, event: str, payment_provider: str, positions: List[str],
- email: str=None, locale: str=None):
+ email: str=None, locale: str=None, address: int=None):
try:
- return _perform_order(event, payment_provider, positions, email, locale)
+ return _perform_order(event, payment_provider, positions, email, locale, address)
except EventLock.LockTimeoutException:
self.retry(exc=OrderError(error_messages['busy']))
diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py
index 97a7e70972..a998701fa6 100644
--- a/src/pretix/base/settings.py
+++ b/src/pretix/base/settings.py
@@ -25,6 +25,18 @@ DEFAULTS = {
'default': 'False',
'type': bool
},
+ 'invoice_address_asked': {
+ 'default': 'True',
+ 'type': bool,
+ },
+ 'invoice_address_required': {
+ 'default': 'False',
+ 'type': bool,
+ },
+ 'invoice_address_vatid': {
+ 'default': 'False',
+ 'type': bool,
+ },
'reservation_time': {
'default': '30',
'type': int
diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py
index 44f0b7e116..77015fae61 100644
--- a/src/pretix/control/forms/event.py
+++ b/src/pretix/control/forms/event.py
@@ -130,6 +130,19 @@ class EventSettingsForm(SettingsForm):
help_text=_("Require customers to fill in the names of all attendees."),
required=False
)
+ invoice_address_asked = forms.BooleanField(
+ label=_("Ask for invoice address"),
+ required=False
+ )
+ invoice_address_required = forms.BooleanField(
+ label=_("Require invoice address"),
+ required=False
+ )
+ invoice_address_vatid = forms.BooleanField(
+ label=_("Ask for VAT ID"),
+ help_text=_("Does only work if an invoice address is asked for. VAT ID is not required."),
+ required=False
+ )
max_items_per_order = forms.IntegerField(
min_value=1,
label=_("Maximum number of items per order")
diff --git a/src/pretix/control/templates/pretixcontrol/event/settings.html b/src/pretix/control/templates/pretixcontrol/event/settings.html
index 65f014a923..d0b112a6df 100644
--- a/src/pretix/control/templates/pretixcontrol/event/settings.html
+++ b/src/pretix/control/templates/pretixcontrol/event/settings.html
@@ -41,6 +41,9 @@
{% bootstrap_field sform.max_items_per_order layout="horizontal" %}
{% bootstrap_field sform.attendee_names_asked layout="horizontal" %}
{% bootstrap_field sform.attendee_names_required layout="horizontal" %}
+ {% bootstrap_field sform.invoice_address_asked layout="horizontal" %}
+ {% bootstrap_field sform.invoice_address_required layout="horizontal" %}
+ {% bootstrap_field sform.invoice_address_vatid layout="horizontal" %}
+ {% if request.event.settings.invoice_address_asked %}
+
+
+
+ {% trans "Invoice information" %}
+
+
+
+
+ - {% trans "Company" %}
+ - {{ order.invoice_address.company }}
+ - {% trans "Name" %}
+ - {{ order.invoice_address.name }}
+ - {% trans "Address" %}
+ - {{ order.invoice_address.street|linebreaksbr }}
+ - {% trans "ZIP code and city" %}
+ - {{ order.invoice_address.zipcode }} {{ addr.city }}
+ - {% trans "Country" %}
+ - {{ order.invoice_address.country }}
+ - {% trans "Phone" %}
+ - {{ order.invoice_address.phone }}
+ {% if request.event.settings.invoice_address_vatid %}
+ - {% trans "VAT ID" %}
+ - {{ order.invoice_address.vat_id }}
+ {% endif %}
+
+
+
+ {% endif %}
{% endblock %}
diff --git a/src/pretix/locale/de/LC_MESSAGES/django.po b/src/pretix/locale/de/LC_MESSAGES/django.po
index db51779c2a..157e565c41 100644
--- a/src/pretix/locale/de/LC_MESSAGES/django.po
+++ b/src/pretix/locale/de/LC_MESSAGES/django.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-02-20 14:56+0000\n"
-"PO-Revision-Date: 2016-02-20 15:57+0100\n"
+"POT-Creation-Date: 2016-02-22 12:43+0000\n"
+"PO-Revision-Date: 2016-02-22 13:45+0100\n"
"Last-Translator: Raphael Michel \n"
"Language-Team: Raphael Michel \n"
"Language: de\n"
@@ -27,13 +27,13 @@ msgid "enabled"
msgstr "aktiviert"
#: pretix/base/forms/auth.py:13 pretix/base/forms/auth.py:140
-#: pretix/base/models/auth.py:63 pretix/base/models/orders.py:94
-#: pretix/presale/forms/checkout.py:8
+#: pretix/base/models/auth.py:63 pretix/base/models/orders.py:95
+#: pretix/presale/forms/checkout.py:10
msgid "E-mail"
msgstr "E-Mail"
#: pretix/base/forms/auth.py:14 pretix/base/forms/auth.py:77
-#: pretix/base/forms/auth.py:113 pretix/control/forms/event.py:239
+#: pretix/base/forms/auth.py:113 pretix/control/forms/event.py:252
msgid "Password"
msgstr "Passwort"
@@ -149,7 +149,10 @@ msgid "%(family)s, %(given)s"
msgstr "%(family)s, %(given)s"
#: pretix/base/models/event.py:53 pretix/base/models/items.py:417
-#: pretix/base/models/organizer.py:25
+#: pretix/base/models/orders.py:471 pretix/base/models/organizer.py:25
+#: pretix/control/templates/pretixcontrol/order/index.html:190
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:77
+#: pretix/presale/templates/pretixpresale/event/order.html:113
#: pretix/presale/templates/pretixpresale/organizers/index.html:21
msgid "Name"
msgstr "Name"
@@ -220,8 +223,8 @@ msgid "Plugins"
msgstr "Erweiterungen"
#: pretix/base/models/event.py:96 pretix/base/models/items.py:109
-#: pretix/base/models/items.py:413 pretix/base/models/orders.py:89
-#: pretix/base/models/orders.py:432 pretix/base/models/vouchers.py:25
+#: pretix/base/models/items.py:413 pretix/base/models/orders.py:90
+#: pretix/base/models/orders.py:433 pretix/base/models/vouchers.py:25
msgid "Event"
msgstr "Veranstaltung"
@@ -438,7 +441,7 @@ msgstr "Gesamtanzahl"
msgid "Leave empty for an unlimited number of tickets."
msgstr "Leer lassen für unbegrenzt viele Tickets."
-#: pretix/base/models/items.py:426 pretix/base/models/orders.py:293
+#: pretix/base/models/items.py:426 pretix/base/models/orders.py:294
msgid "Item"
msgstr "Produkt"
@@ -460,152 +463,189 @@ msgstr "Kontingent"
msgid "Quotas"
msgstr "Kontingente"
-#: pretix/base/models/orders.py:71
+#: pretix/base/models/orders.py:72
msgid "pending"
msgstr "ausstehend"
-#: pretix/base/models/orders.py:72
+#: pretix/base/models/orders.py:73
msgid "paid"
msgstr "bezahlt"
-#: pretix/base/models/orders.py:73
+#: pretix/base/models/orders.py:74
msgid "expired"
msgstr "abgelaufen"
-#: pretix/base/models/orders.py:74
+#: pretix/base/models/orders.py:75
msgid "cancelled"
msgstr "storniert"
-#: pretix/base/models/orders.py:75
+#: pretix/base/models/orders.py:76
msgid "refunded"
msgstr "erstattet"
-#: pretix/base/models/orders.py:80
+#: pretix/base/models/orders.py:81
#: pretix/control/templates/pretixcontrol/order/index.html:58
#: pretix/control/templates/pretixcontrol/orders/index.html:10
#: pretix/control/templates/pretixcontrol/orders/index.html:42
msgid "Order code"
msgstr "Bestellnummer"
-#: pretix/base/models/orders.py:85
+#: pretix/base/models/orders.py:86
#: pretix/control/templates/pretixcontrol/orders/index.html:46
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_confirm.html:18
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:31
msgid "Status"
msgstr "Status"
-#: pretix/base/models/orders.py:98
+#: pretix/base/models/orders.py:99
msgid "Locale"
msgstr "Sprache"
-#: pretix/base/models/orders.py:102 pretix/base/models/orders.py:439
+#: pretix/base/models/orders.py:103 pretix/base/models/orders.py:440
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:17
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_confirm.html:13
#: pretix/presale/templates/pretixpresale/organizers/index.html:22
msgid "Date"
msgstr "Datum"
-#: pretix/base/models/orders.py:105 pretix/base/models/orders.py:443
+#: pretix/base/models/orders.py:106 pretix/base/models/orders.py:444
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form.html:23
msgid "Expiration date"
msgstr "Ablaufdatum"
-#: pretix/base/models/orders.py:108
+#: pretix/base/models/orders.py:109
#: pretix/control/templates/pretixcontrol/order/index.html:63
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html:11
msgid "Payment date"
msgstr "Zahlungsdatum"
-#: pretix/base/models/orders.py:114
+#: pretix/base/models/orders.py:115
msgid "Payment provider"
msgstr "Zahlungsmethode"
-#: pretix/base/models/orders.py:118
+#: pretix/base/models/orders.py:119
#: pretix/control/templates/pretixcontrol/order/index.html:140
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:75
msgid "Payment method fee"
msgstr "Gebühr für gewählte Zahlungsmethode"
-#: pretix/base/models/orders.py:121
+#: pretix/base/models/orders.py:122
#: pretix/control/templates/pretixcontrol/order/index.html:162
msgid "Payment information"
msgstr "Zahlungsinformationen"
-#: pretix/base/models/orders.py:125
+#: pretix/base/models/orders.py:126
msgid "Payment state was manually modified"
msgstr "Der Bestellungsstatus wurde manuell verändert"
-#: pretix/base/models/orders.py:130
+#: pretix/base/models/orders.py:131
msgid "Total amount"
msgstr "Gesamtbetrag"
-#: pretix/base/models/orders.py:134 pretix/base/models/orders.py:361
+#: pretix/base/models/orders.py:135 pretix/base/models/orders.py:362
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_confirm.html:17
msgid "Order"
msgstr "Bestellung"
-#: pretix/base/models/orders.py:135
+#: pretix/base/models/orders.py:136
#: pretix/control/templates/pretixcontrol/event/base.html:101
#: pretix/control/templates/pretixcontrol/orders/index.html:3
#: pretix/control/templates/pretixcontrol/orders/index.html:5
msgid "Orders"
msgstr "Bestellungen"
-#: pretix/base/models/orders.py:184
+#: pretix/base/models/orders.py:185
msgid "The payment is too late to be accepted."
msgstr "Die Zahlung kommt zu spät, um akzeptiert werden zu können."
-#: pretix/base/models/orders.py:199
+#: pretix/base/models/orders.py:200
msgid "Some of the ordered products were no longer available."
msgstr "Einige der ausgewählten Produkte sind nicht mehr verfügbar."
-#: pretix/base/models/orders.py:299
+#: pretix/base/models/orders.py:300
msgid "Variation"
msgstr "Variante"
-#: pretix/base/models/orders.py:304
+#: pretix/base/models/orders.py:305
msgid "Price"
msgstr "Preis"
-#: pretix/base/models/orders.py:308
+#: pretix/base/models/orders.py:309
#: pretix/control/templates/pretixcontrol/order/index.html:106
-#: pretix/presale/forms/checkout.py:36
+#: pretix/presale/forms/checkout.py:65
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:16
msgid "Attendee name"
msgstr "Name des Teilnehmers"
-#: pretix/base/models/orders.py:310
+#: pretix/base/models/orders.py:311
msgid "Empty, if this product is not an admission ticket"
msgstr "Leer, wenn dies kein Eintrittsticket ist"
-#: pretix/base/models/orders.py:367
+#: pretix/base/models/orders.py:368
msgid "Tax rate"
msgstr "Steuersatz"
-#: pretix/base/models/orders.py:371
+#: pretix/base/models/orders.py:372
msgid "Tax value"
msgstr "Steuer"
-#: pretix/base/models/orders.py:375
+#: pretix/base/models/orders.py:376
msgid "Order position"
msgstr "Bestelltes Produkt"
-#: pretix/base/models/orders.py:376
+#: pretix/base/models/orders.py:377
msgid "Order positions"
msgstr "Bestellzeile"
-#: pretix/base/models/orders.py:436
+#: pretix/base/models/orders.py:437
msgid "Cart ID (e.g. session key)"
msgstr "Warenkorb-ID (z.B. Session-ID)"
-#: pretix/base/models/orders.py:447
+#: pretix/base/models/orders.py:448
msgid "Cart position"
msgstr "Produkt im Warenkorb"
-#: pretix/base/models/orders.py:448
+#: pretix/base/models/orders.py:449
msgid "Cart positions"
msgstr "Produkte im Warenkorb"
+#: pretix/base/models/orders.py:470
+msgid "Company name"
+msgstr "Firmenname"
+
+#: pretix/base/models/orders.py:472
+#: pretix/control/templates/pretixcontrol/order/index.html:192
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:79
+#: pretix/presale/templates/pretixpresale/event/order.html:115
+msgid "Address"
+msgstr "Adresse"
+
+#: pretix/base/models/orders.py:473
+msgid "ZIP code"
+msgstr "Postleitzahl"
+
+#: pretix/base/models/orders.py:474
+msgid "City"
+msgstr "Ort"
+
+#: pretix/base/models/orders.py:475
+#: pretix/control/templates/pretixcontrol/order/index.html:196
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:83
+#: pretix/presale/templates/pretixpresale/event/order.html:119
+msgid "Country"
+msgstr "Land"
+
+#: pretix/base/models/orders.py:476
+msgid "Phone number"
+msgstr "Telefonnummer"
+
+#: pretix/base/models/orders.py:477
+#: pretix/control/templates/pretixcontrol/order/index.html:201
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:88
+#: pretix/presale/templates/pretixpresale/event/order.html:124
+msgid "VAT ID"
+msgstr "USt-ID"
+
#: pretix/base/models/organizer.py:43
#: pretix/control/templates/pretixcontrol/events/index.html:20
#: pretix/control/templates/pretixcontrol/organizers/detail.html:4
@@ -753,7 +793,7 @@ msgstr "Kostenlos"
msgid "The order has been marked as refunded."
msgstr "Die Bestellung wurde als zurückerstattet markiert."
-#: pretix/base/services/cart.py:20 pretix/base/services/orders.py:29
+#: pretix/base/services/cart.py:20 pretix/base/services/orders.py:30
msgid ""
"We were not able to process your request completely as the server was too "
"busy. Please try again."
@@ -769,7 +809,7 @@ msgstr "Sie haben keine Produkte ausgewählt."
msgid "You selected a product which is not available for sale."
msgstr "Sie haben ein Produkt ausgewählt, das nicht zum Verkauf steht."
-#: pretix/base/services/cart.py:24 pretix/base/services/orders.py:21
+#: pretix/base/services/cart.py:24 pretix/base/services/orders.py:22
msgid ""
"Some of the products you selected were no longer available. Please see below "
"for details."
@@ -777,7 +817,7 @@ msgstr ""
"Einige der ausgewählten Produkte waren zwischenzeitlich nicht mehr "
"verfügbar, bitte überprüfen Sie Ihren Warenkorb."
-#: pretix/base/services/cart.py:26 pretix/base/services/orders.py:23
+#: pretix/base/services/cart.py:26 pretix/base/services/orders.py:24
msgid ""
"Some of the products you selected were no longer available in the quantity "
"you selected. Please see below for details."
@@ -785,7 +825,7 @@ msgstr ""
"Einige der ausgewählten Produkte waren zwischenzeitlich nicht mehr in der "
"gewünschten Anzahl verfügbar, bitte überprüfen Sie Ihren Warenkorb."
-#: pretix/base/services/cart.py:28 pretix/base/services/orders.py:27
+#: pretix/base/services/cart.py:28 pretix/base/services/orders.py:28
#, python-format
msgid "You cannot select more than %s items per order"
msgstr "Sie können nicht mehr als %s Produkte pro Bestellung auswählen"
@@ -819,7 +859,7 @@ msgstr ""
"Sie erhalten diese E-Mail, weil Sie eine Bestellung für die Veranstaltung %s "
"getätigt haben."
-#: pretix/base/services/orders.py:25
+#: pretix/base/services/orders.py:26
msgid ""
"The price of some of the items in your cart has changed in the meantime. "
"Please see below for details."
@@ -827,26 +867,26 @@ msgstr ""
"Der Preis einiger Produkte in Ihrem Warenkorb hat sich zwischenzeitlich "
"geändert."
-#: pretix/base/services/orders.py:28
+#: pretix/base/services/orders.py:29
msgid "An internal error occured, please try again."
msgstr "Ein interner Fehler ist aufgetreten, bitte erneut versuchen."
-#: pretix/base/services/orders.py:31
+#: pretix/base/services/orders.py:32
msgid "A voucher you tried to use already has been used."
msgstr ""
"Ein Gutscheincode, den Sie verwenden wollten, wurde zwischenzeitlich bereits "
"eingelöst."
-#: pretix/base/services/orders.py:32
+#: pretix/base/services/orders.py:33
msgid "A voucher you tried to use has expired."
msgstr "Ein Gutscheincode, den Sie verwenden wollten, ist abgelaufen."
-#: pretix/base/services/orders.py:76
+#: pretix/base/services/orders.py:77
#, python-format
msgid "Payment received for your order: %(code)s"
msgstr "Zahlung erhalten für die Bestellung: %(code)s"
-#: pretix/base/services/orders.py:241 pretix/control/views/orders.py:208
+#: pretix/base/services/orders.py:254 pretix/control/views/orders.py:208
#: pretix/presale/templates/pretixpresale/event/order.html:21
#, python-format
msgid "Your order: %(code)s"
@@ -860,7 +900,7 @@ msgstr "Unkategorisiert"
msgid "Payment method fees"
msgstr "Zahlungsgebühren"
-#: pretix/base/settings.py:102
+#: pretix/base/settings.py:114
#, python-brace-format
msgid ""
"Hello,\n"
@@ -886,7 +926,7 @@ msgstr ""
"Viele Grüße,\n"
"Das {event} Team"
-#: pretix/base/settings.py:115
+#: pretix/base/settings.py:127
#, python-brace-format
msgid ""
"Hello,\n"
@@ -915,7 +955,7 @@ msgstr ""
"Viele Grüße,\n"
"Das {event}s Team"
-#: pretix/base/settings.py:130
+#: pretix/base/settings.py:142
#, python-brace-format
msgid ""
"Hello,\n"
@@ -1194,56 +1234,75 @@ msgstr "Namen des Teilnehmer erfordern"
msgid "Require customers to fill in the names of all attendees."
msgstr "Erfordere die Eingabe aller Teilnehmer-Namen."
-#: pretix/control/forms/event.py:135
+#: pretix/control/forms/event.py:134
+msgid "Ask for invoice address"
+msgstr "Rechnungsadresse erfragen"
+
+#: pretix/control/forms/event.py:138
+msgid "Require invoice address"
+msgstr "Rechnungsadresse erforderlich"
+
+#: pretix/control/forms/event.py:142
+msgid "Ask for VAT ID"
+msgstr "Nach USt-ID fragen"
+
+#: pretix/control/forms/event.py:143
+msgid ""
+"Does only work if an invoice address is asked for. VAT ID is not required."
+msgstr ""
+"Funktioniert nur, wenn nach einer Rechnungsadresse gefragt wird. Die USt-ID-"
+"Eingabe ist freiwillig."
+
+#: pretix/control/forms/event.py:148
msgid "Maximum number of items per order"
msgstr "Maximale Anzahl Produkte pro Bestellung"
-#: pretix/control/forms/event.py:139
+#: pretix/control/forms/event.py:152
msgid "Reservation period"
msgstr "Reservierungszeitraum"
-#: pretix/control/forms/event.py:140
+#: pretix/control/forms/event.py:153
msgid ""
"The number of minutes the items in a user's card are reserved for this user."
msgstr ""
"Die Dauer in Minuten, die Produkte im Warenkorb eines Benutzers reserviert "
"werden."
-#: pretix/control/forms/event.py:143
+#: pretix/control/forms/event.py:156
msgid "Imprint URL"
msgstr "Impressum (URL)"
-#: pretix/control/forms/event.py:147
+#: pretix/control/forms/event.py:160
msgid "Contact address"
msgstr "Kontakt-E-Mail"
-#: pretix/control/forms/event.py:149
+#: pretix/control/forms/event.py:162
msgid "Public email address for contacting the organizer"
msgstr "Öffentliche E-Mail-Adresse zur Kontaktierung des Veranstalters"
-#: pretix/control/forms/event.py:156
+#: pretix/control/forms/event.py:169
msgid ""
"Your default locale must also be enebled for your event (see box above)."
msgstr ""
"Die Standardsprache muss eine der aktivierten Sprachen sein (siehe weiter "
"oben)."
-#: pretix/control/forms/event.py:160
+#: pretix/control/forms/event.py:173
msgid ""
"You cannot require specifying attendee names if you do not ask for them."
msgstr ""
"Sie können die Angabe von Teilnehmernamen nur erfordern, wenn Sie auch nach "
"Namen fragen."
-#: pretix/control/forms/event.py:189 pretix/control/forms/event.py:283
+#: pretix/control/forms/event.py:202 pretix/control/forms/event.py:296
msgid "This field is required."
msgstr "Dieses Feld ist erforderlich."
-#: pretix/control/forms/event.py:194
+#: pretix/control/forms/event.py:207
msgid "Subject prefix"
msgstr "Betreffs-Prefix"
-#: pretix/control/forms/event.py:195
+#: pretix/control/forms/event.py:208
msgid ""
"This will be prepended to the subject of all outgoing emails. This could be "
"a short form of your event name."
@@ -1251,19 +1310,19 @@ msgstr ""
"Dies wird jedem E-Mail-Betreff vorangestellt und könnten z.B. eine Kurzform "
"Ihres Veranstaltungsnamens enthalten."
-#: pretix/control/forms/event.py:200
+#: pretix/control/forms/event.py:213
msgid "Sender address"
msgstr "Absender-Adresse"
-#: pretix/control/forms/event.py:201
+#: pretix/control/forms/event.py:214
msgid "Sender address for outgoing e-mails"
msgstr "Absender-Adresse für ausgehende E-Mails"
-#: pretix/control/forms/event.py:204
+#: pretix/control/forms/event.py:217
msgid "Placed order"
msgstr "Getätigte Bestellung"
-#: pretix/control/forms/event.py:207
+#: pretix/control/forms/event.py:220
#, python-brace-format
msgid ""
"Available placeholders: {event}, {total}, {currency}, {date}, {paymentinfo}, "
@@ -1272,25 +1331,25 @@ msgstr ""
"Verfügbare Platzhalter: {event}, {total}, {currency}, {date}, {paymentinfo}, "
"{url}"
-#: pretix/control/forms/event.py:210
+#: pretix/control/forms/event.py:223
msgid "Paid order"
msgstr "Bezahlt Bestellung"
-#: pretix/control/forms/event.py:213 pretix/control/forms/event.py:219
+#: pretix/control/forms/event.py:226 pretix/control/forms/event.py:232
#, python-brace-format
msgid "Available placeholders: {event}, {url}"
msgstr "Verfügbare Platzhalter: {event}, {url}"
-#: pretix/control/forms/event.py:216
+#: pretix/control/forms/event.py:229
#: pretix/control/templates/pretixcontrol/order/index.html:76
msgid "Resend link"
msgstr "Link erneut senden"
-#: pretix/control/forms/event.py:222
+#: pretix/control/forms/event.py:235
msgid "Use custom SMTP server"
msgstr "Eigenen SMTP-Server verwenden"
-#: pretix/control/forms/event.py:223
+#: pretix/control/forms/event.py:236
msgid ""
"All mail related to your event will be sent over the smtp server specified "
"by you."
@@ -1298,49 +1357,49 @@ msgstr ""
"Alle E-Mails bezüglich Ihrer Veranstaltung werden über den von Ihnen "
"angegebenen SMTP-Server versendet."
-#: pretix/control/forms/event.py:227
+#: pretix/control/forms/event.py:240
msgid "Hostname"
msgstr "Hostname"
-#: pretix/control/forms/event.py:231
+#: pretix/control/forms/event.py:244
msgid "Port"
msgstr "Port"
-#: pretix/control/forms/event.py:235
+#: pretix/control/forms/event.py:248
msgid "Username"
msgstr "Benutzername"
-#: pretix/control/forms/event.py:244
+#: pretix/control/forms/event.py:257
msgid "Use STARTTLS"
msgstr "STARTTLS verwenden"
-#: pretix/control/forms/event.py:245
+#: pretix/control/forms/event.py:258
msgid "Commonly enabled on port 587."
msgstr "Meistens auf Port 587 verfügbar."
-#: pretix/control/forms/event.py:249
+#: pretix/control/forms/event.py:262
msgid "Use SSL"
msgstr "SSL verwenden"
-#: pretix/control/forms/event.py:250
+#: pretix/control/forms/event.py:263
msgid "Commonly enabled on port 465."
msgstr "Meistens auf Port 465 verfügbar."
-#: pretix/control/forms/event.py:257
+#: pretix/control/forms/event.py:270
msgid "Use feature"
msgstr "Funktion benutzen"
-#: pretix/control/forms/event.py:258
+#: pretix/control/forms/event.py:271
msgid "Use pretix to generate tickets for the user to download and print out."
msgstr ""
"Wenn diese Funktion aktiviert ist, generiert pretix Tickets, die der "
"Benutzer herunterladen und ausdrucken kann."
-#: pretix/control/forms/event.py:262
+#: pretix/control/forms/event.py:275
msgid "Download date"
msgstr "Download-Datum"
-#: pretix/control/forms/event.py:263
+#: pretix/control/forms/event.py:276
msgid "Ticket download will be offered after this date."
msgstr "Der Ticket-Download wird zu diesem Zeitpunkt freigeschaltet."
@@ -1414,7 +1473,7 @@ msgstr "Neues Passwort setzen"
#: pretix/control/templates/pretixcontrol/event/mail.html:30
#: pretix/control/templates/pretixcontrol/event/payment.html:31
#: pretix/control/templates/pretixcontrol/event/permissions.html:56
-#: pretix/control/templates/pretixcontrol/event/settings.html:47
+#: pretix/control/templates/pretixcontrol/event/settings.html:50
#: pretix/control/templates/pretixcontrol/event/tickets.html:36
#: pretix/control/templates/pretixcontrol/events/create.html:30
#: pretix/control/templates/pretixcontrol/item/index.html:28
@@ -1492,9 +1551,9 @@ msgid "General"
msgstr "Allgemeines"
#: pretix/control/templates/pretixcontrol/event/base.html:30
-#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:52
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:51
#: pretix/presale/templates/pretixpresale/event/order.html:31
-#: pretix/presale/templates/pretixpresale/event/order.html:111
+#: pretix/presale/templates/pretixpresale/event/order.html:148
msgid "Payment"
msgstr "Zahlung"
@@ -1959,7 +2018,7 @@ msgstr "Verbleibende Kapazität"
#: pretix/control/templates/pretixcontrol/order/cancel.html:4
#: pretix/control/templates/pretixcontrol/order/cancel.html:8
#: pretix/control/templates/pretixcontrol/order/index.html:28
-#: pretix/presale/templates/pretixpresale/event/order.html:101
+#: pretix/presale/templates/pretixpresale/event/order.html:138
#: pretix/presale/templates/pretixpresale/event/order_cancel.html:4
msgid "Cancel order"
msgstr "Stornieren"
@@ -2063,6 +2122,32 @@ msgstr "Der Status dieser Bestellung wurde manuell verändert."
msgid "The payment has to be completed before %(date)s."
msgstr "Die Zahlung muss bis zum %(date)s abgeschlossen sein."
+#: pretix/control/templates/pretixcontrol/order/index.html:183
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:70
+#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:30
+#: pretix/presale/templates/pretixpresale/event/order.html:106
+#: pretix/presale/templates/pretixpresale/event/order_modify.html:19
+msgid "Invoice information"
+msgstr "Rechnungsinformationen"
+
+#: pretix/control/templates/pretixcontrol/order/index.html:188
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:75
+#: pretix/presale/templates/pretixpresale/event/order.html:111
+msgid "Company"
+msgstr "Firma"
+
+#: pretix/control/templates/pretixcontrol/order/index.html:194
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:81
+#: pretix/presale/templates/pretixpresale/event/order.html:117
+msgid "ZIP code and city"
+msgstr "PLZ und Ort"
+
+#: pretix/control/templates/pretixcontrol/order/index.html:198
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:85
+#: pretix/presale/templates/pretixpresale/event/order.html:121
+msgid "Phone"
+msgstr "Telefon"
+
#: pretix/control/templates/pretixcontrol/order/refund.html:10
msgid "Do you really want to refund this order? You cannot revert this action."
msgstr ""
@@ -2374,11 +2459,11 @@ msgstr "Die Bestellung wurde storniert."
msgid "The order has been marked as not paid."
msgstr "Die Bestellung wurde als unbezahlt markiert."
-#: pretix/control/views/orders.py:236 pretix/presale/views/order.py:279
+#: pretix/control/views/orders.py:236 pretix/presale/views/order.py:296
msgid "You requested an invalid ticket output type."
msgstr "Sie haben einen ungültigen Ausgabetyp gewählt."
-#: pretix/control/views/orders.py:239 pretix/presale/views/order.py:284
+#: pretix/control/views/orders.py:239 pretix/presale/views/order.py:301
msgid "Order is not paid."
msgstr "Bestellung ist nicht bezahlt."
@@ -2557,7 +2642,7 @@ msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:11
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:43
-#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:56
+#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:72
#: pretix/presale/templates/pretixpresale/event/order_pay.html:26
msgid "Continue"
msgstr "Fortfahren"
@@ -3274,28 +3359,36 @@ msgstr "Veranstaltungsname-y-Position (mm)"
msgid "Event name size (mm)"
msgstr "Veranstaltungsname-Größe (mm)"
-#: pretix/presale/checkoutflow.py:147 pretix/presale/views/order.py:217
+#: pretix/presale/checkoutflow.py:166 pretix/presale/views/order.py:232
msgid ""
"We had difficulties processing your input. Please review the errors below."
msgstr "Wir hatten Schwierigkeiten, Ihre Eingabe zu verarbeiten."
-#: pretix/presale/checkoutflow.py:158 pretix/presale/checkoutflow.py:163
+#: pretix/presale/checkoutflow.py:181 pretix/presale/checkoutflow.py:186
msgid "Please enter a valid e-mail address."
msgstr "Bitte geben Sie eine gültige E-Mail-Adresse ein."
-#: pretix/presale/checkoutflow.py:173 pretix/presale/checkoutflow.py:178
+#: pretix/presale/checkoutflow.py:196 pretix/presale/checkoutflow.py:201
msgid "Please fill in answers to all required questions."
msgstr "Bitte füllen Sie Antworten zu allen benötigten Fragen ein."
-#: pretix/presale/checkoutflow.py:229
+#: pretix/presale/checkoutflow.py:253
msgid "Please select a payment method."
msgstr "Bitte wählen Sie eine Zahlungsmethode aus."
-#: pretix/presale/checkoutflow.py:250 pretix/presale/checkoutflow.py:256
-#: pretix/presale/views/order.py:154 pretix/presale/views/order.py:184
+#: pretix/presale/checkoutflow.py:274 pretix/presale/checkoutflow.py:280
+#: pretix/presale/views/order.py:156 pretix/presale/views/order.py:186
msgid "The payment information you entered was incomplete."
msgstr "Die eingegebenen Zahlungsinformationen sind unvollständig."
+#: pretix/presale/forms/checkout.py:19
+msgid "Street and Number"
+msgstr "Straße und Hausnummer"
+
+#: pretix/presale/forms/checkout.py:37
+msgid "You need to provide either a company name or your name."
+msgstr "Sie müssen entweder einen Firmennamen oder Ihren Namen eingeben."
+
#: pretix/presale/middleware.py:25
msgid "The selected event was not found."
msgstr "Die ausgewählte Veranstaltung wurde nicht gefunden."
@@ -3332,8 +3425,9 @@ msgstr ""
"Bestellung."
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:17
-#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:47
-#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:65
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:46
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:66
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:102
msgid "Modify"
msgstr "Bearbeiten"
@@ -3355,22 +3449,22 @@ msgstr ""
msgid "The items in your cart are no longer reserved for you."
msgstr "Die Produkte in Ihrem Warenkorb sind nicht mehr für Sie reserviert."
-#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:69
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:106
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:15
msgid "Contact information"
msgstr "Kontaktinformationen"
-#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:74
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:111
msgid "E-mail address"
msgstr "E-Mail-Adresse"
-#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:84
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:122
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:38
-#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:51
+#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:67
msgid "Go back"
msgstr "Zurück"
-#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:89
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:127
msgid "Place binding order"
msgstr "Zahlungspflichtig bestellen"
@@ -3489,6 +3583,7 @@ msgid "You will be able to download your tickets here on %(date)s."
msgstr "Sie können Ihre Tickets hier ab %(date)s herunterladen."
#: pretix/presale/templates/pretixpresale/event/order.html:82
+#: pretix/presale/templates/pretixpresale/event/order.html:101
msgid "Change details"
msgstr "Details bearbeiten"
@@ -3506,11 +3601,11 @@ msgstr "Bestellung bearbeiten"
msgid "Modify order: %(code)s"
msgstr "Bestellung bearbeiten: %(code)s"
-#: pretix/presale/templates/pretixpresale/event/order_modify.html:40
+#: pretix/presale/templates/pretixpresale/event/order_modify.html:56
msgid "Revert changes"
msgstr "Zurücksetzen"
-#: pretix/presale/templates/pretixpresale/event/order_modify.html:45
+#: pretix/presale/templates/pretixpresale/event/order_modify.html:61
msgid "Save changes"
msgstr "Änderungen speichern"
@@ -3594,27 +3689,27 @@ msgstr "Die gewählten Produkte wurden Ihrem Warenkorb hinzugefügt."
msgid "Your cart is empty"
msgstr "Ihr Warenkorb ist leer."
-#: pretix/presale/views/order.py:53 pretix/presale/views/order.py:105
-#: pretix/presale/views/order.py:147 pretix/presale/views/order.py:180
-#: pretix/presale/views/order.py:229 pretix/presale/views/order.py:249
-#: pretix/presale/views/order.py:282
+#: pretix/presale/views/order.py:55 pretix/presale/views/order.py:107
+#: pretix/presale/views/order.py:149 pretix/presale/views/order.py:182
+#: pretix/presale/views/order.py:245 pretix/presale/views/order.py:266
+#: pretix/presale/views/order.py:299
msgid "Unknown order code or not authorized to access this order."
msgstr ""
"Unbekannte Bestellnummer oder Bestellung gehört einem anderen Benutzer."
-#: pretix/presale/views/order.py:109 pretix/presale/views/order.py:149
+#: pretix/presale/views/order.py:111 pretix/presale/views/order.py:151
msgid "The payment for this order cannot be continued."
msgstr "Diese Bestellung kann nicht mehr bezahlt werden."
-#: pretix/presale/views/order.py:231
+#: pretix/presale/views/order.py:247
msgid "You cannot modify this order"
msgstr "Sie können diese Bestellung nicht bearbeiten"
-#: pretix/presale/views/order.py:251
+#: pretix/presale/views/order.py:268
msgid "You cannot cancel this order"
msgstr "Sie können diese Bestellung nicht stornieren"
-#: pretix/presale/views/order.py:289
+#: pretix/presale/views/order.py:306
msgid "Ticket download is not (yet) enabled."
msgstr "Der Ticket-Download ist (noch) nicht freigeschaltet."
@@ -3732,9 +3827,6 @@ msgstr "Deutsch (Du)"
#~ msgid "Deselect all"
#~ msgstr "Keine auswählen"
-#~ msgid "Require e-mail adresses"
-#~ msgstr "E-Mail-Adresse erfordern"
-
#~ msgid "Require all customers to provide an e-mail address."
#~ msgstr "Erfordere eine E-Mail-Adresse von allen Käufern."
diff --git a/src/pretix/locale/de_Informal/LC_MESSAGES/django.po b/src/pretix/locale/de_Informal/LC_MESSAGES/django.po
index 377e9f7446..7b009c51fa 100644
--- a/src/pretix/locale/de_Informal/LC_MESSAGES/django.po
+++ b/src/pretix/locale/de_Informal/LC_MESSAGES/django.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-02-20 14:56+0000\n"
-"PO-Revision-Date: 2016-02-20 15:57+0100\n"
+"POT-Creation-Date: 2016-02-22 12:43+0000\n"
+"PO-Revision-Date: 2016-02-22 13:44+0100\n"
"Last-Translator: Raphael Michel \n"
"Language-Team: Raphael Michel \n"
"Language: de\n"
@@ -27,13 +27,13 @@ msgid "enabled"
msgstr "aktiviert"
#: pretix/base/forms/auth.py:13 pretix/base/forms/auth.py:140
-#: pretix/base/models/auth.py:63 pretix/base/models/orders.py:94
-#: pretix/presale/forms/checkout.py:8
+#: pretix/base/models/auth.py:63 pretix/base/models/orders.py:95
+#: pretix/presale/forms/checkout.py:10
msgid "E-mail"
msgstr "E-Mail"
#: pretix/base/forms/auth.py:14 pretix/base/forms/auth.py:77
-#: pretix/base/forms/auth.py:113 pretix/control/forms/event.py:239
+#: pretix/base/forms/auth.py:113 pretix/control/forms/event.py:252
msgid "Password"
msgstr "Passwort"
@@ -149,7 +149,10 @@ msgid "%(family)s, %(given)s"
msgstr "%(family)s, %(given)s"
#: pretix/base/models/event.py:53 pretix/base/models/items.py:417
-#: pretix/base/models/organizer.py:25
+#: pretix/base/models/orders.py:471 pretix/base/models/organizer.py:25
+#: pretix/control/templates/pretixcontrol/order/index.html:190
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:77
+#: pretix/presale/templates/pretixpresale/event/order.html:113
#: pretix/presale/templates/pretixpresale/organizers/index.html:21
msgid "Name"
msgstr "Name"
@@ -220,8 +223,8 @@ msgid "Plugins"
msgstr "Erweiterungen"
#: pretix/base/models/event.py:96 pretix/base/models/items.py:109
-#: pretix/base/models/items.py:413 pretix/base/models/orders.py:89
-#: pretix/base/models/orders.py:432 pretix/base/models/vouchers.py:25
+#: pretix/base/models/items.py:413 pretix/base/models/orders.py:90
+#: pretix/base/models/orders.py:433 pretix/base/models/vouchers.py:25
msgid "Event"
msgstr "Veranstaltung"
@@ -438,7 +441,7 @@ msgstr "Gesamtanzahl"
msgid "Leave empty for an unlimited number of tickets."
msgstr "Leer lassen für unbegrenzt viele Tickets."
-#: pretix/base/models/items.py:426 pretix/base/models/orders.py:293
+#: pretix/base/models/items.py:426 pretix/base/models/orders.py:294
msgid "Item"
msgstr "Produkt"
@@ -460,152 +463,189 @@ msgstr "Kontingent"
msgid "Quotas"
msgstr "Kontingente"
-#: pretix/base/models/orders.py:71
+#: pretix/base/models/orders.py:72
msgid "pending"
msgstr "ausstehend"
-#: pretix/base/models/orders.py:72
+#: pretix/base/models/orders.py:73
msgid "paid"
msgstr "bezahlt"
-#: pretix/base/models/orders.py:73
+#: pretix/base/models/orders.py:74
msgid "expired"
msgstr "abgelaufen"
-#: pretix/base/models/orders.py:74
+#: pretix/base/models/orders.py:75
msgid "cancelled"
msgstr "storniert"
-#: pretix/base/models/orders.py:75
+#: pretix/base/models/orders.py:76
msgid "refunded"
msgstr "erstattet"
-#: pretix/base/models/orders.py:80
+#: pretix/base/models/orders.py:81
#: pretix/control/templates/pretixcontrol/order/index.html:58
#: pretix/control/templates/pretixcontrol/orders/index.html:10
#: pretix/control/templates/pretixcontrol/orders/index.html:42
msgid "Order code"
msgstr "Bestellnummer"
-#: pretix/base/models/orders.py:85
+#: pretix/base/models/orders.py:86
#: pretix/control/templates/pretixcontrol/orders/index.html:46
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_confirm.html:18
#: pretix/plugins/stripe/templates/pretixplugins/stripe/control.html:31
msgid "Status"
msgstr "Status"
-#: pretix/base/models/orders.py:98
+#: pretix/base/models/orders.py:99
msgid "Locale"
msgstr "Sprache"
-#: pretix/base/models/orders.py:102 pretix/base/models/orders.py:439
+#: pretix/base/models/orders.py:103 pretix/base/models/orders.py:440
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:17
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_confirm.html:13
#: pretix/presale/templates/pretixpresale/organizers/index.html:22
msgid "Date"
msgstr "Datum"
-#: pretix/base/models/orders.py:105 pretix/base/models/orders.py:443
+#: pretix/base/models/orders.py:106 pretix/base/models/orders.py:444
#: pretix/plugins/stripe/templates/pretixplugins/stripe/checkout_payment_form.html:23
msgid "Expiration date"
msgstr "Ablaufdatum"
-#: pretix/base/models/orders.py:108
+#: pretix/base/models/orders.py:109
#: pretix/control/templates/pretixcontrol/order/index.html:63
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/control.html:11
msgid "Payment date"
msgstr "Zahlungsdatum"
-#: pretix/base/models/orders.py:114
+#: pretix/base/models/orders.py:115
msgid "Payment provider"
msgstr "Zahlungsmethode"
-#: pretix/base/models/orders.py:118
+#: pretix/base/models/orders.py:119
#: pretix/control/templates/pretixcontrol/order/index.html:140
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:75
msgid "Payment method fee"
msgstr "Gebühr für gewählte Zahlungsmethode"
-#: pretix/base/models/orders.py:121
+#: pretix/base/models/orders.py:122
#: pretix/control/templates/pretixcontrol/order/index.html:162
msgid "Payment information"
msgstr "Zahlungsinformationen"
-#: pretix/base/models/orders.py:125
+#: pretix/base/models/orders.py:126
msgid "Payment state was manually modified"
msgstr "Der Bestellungsstatus wurde manuell verändert"
-#: pretix/base/models/orders.py:130
+#: pretix/base/models/orders.py:131
msgid "Total amount"
msgstr "Gesamtbetrag"
-#: pretix/base/models/orders.py:134 pretix/base/models/orders.py:361
+#: pretix/base/models/orders.py:135 pretix/base/models/orders.py:362
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_confirm.html:17
msgid "Order"
msgstr "Bestellung"
-#: pretix/base/models/orders.py:135
+#: pretix/base/models/orders.py:136
#: pretix/control/templates/pretixcontrol/event/base.html:101
#: pretix/control/templates/pretixcontrol/orders/index.html:3
#: pretix/control/templates/pretixcontrol/orders/index.html:5
msgid "Orders"
msgstr "Bestellungen"
-#: pretix/base/models/orders.py:184
+#: pretix/base/models/orders.py:185
msgid "The payment is too late to be accepted."
msgstr "Die Zahlung kommt zu spät, um akzeptiert werden zu können."
-#: pretix/base/models/orders.py:199
+#: pretix/base/models/orders.py:200
msgid "Some of the ordered products were no longer available."
msgstr "Einige der ausgewählten Produkte sind nicht mehr verfügbar."
-#: pretix/base/models/orders.py:299
+#: pretix/base/models/orders.py:300
msgid "Variation"
msgstr "Variante"
-#: pretix/base/models/orders.py:304
+#: pretix/base/models/orders.py:305
msgid "Price"
msgstr "Preis"
-#: pretix/base/models/orders.py:308
+#: pretix/base/models/orders.py:309
#: pretix/control/templates/pretixcontrol/order/index.html:106
-#: pretix/presale/forms/checkout.py:36
+#: pretix/presale/forms/checkout.py:65
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:16
msgid "Attendee name"
msgstr "Name des Teilnehmers"
-#: pretix/base/models/orders.py:310
+#: pretix/base/models/orders.py:311
msgid "Empty, if this product is not an admission ticket"
msgstr "Leer, wenn dies kein Eintrittsticket ist"
-#: pretix/base/models/orders.py:367
+#: pretix/base/models/orders.py:368
msgid "Tax rate"
msgstr "Steuersatz"
-#: pretix/base/models/orders.py:371
+#: pretix/base/models/orders.py:372
msgid "Tax value"
msgstr "Steuer"
-#: pretix/base/models/orders.py:375
+#: pretix/base/models/orders.py:376
msgid "Order position"
msgstr "Bestelltes Produkt"
-#: pretix/base/models/orders.py:376
+#: pretix/base/models/orders.py:377
msgid "Order positions"
msgstr "Bestellzeile"
-#: pretix/base/models/orders.py:436
+#: pretix/base/models/orders.py:437
msgid "Cart ID (e.g. session key)"
msgstr "Warenkorb-ID (z.B. Session-ID)"
-#: pretix/base/models/orders.py:447
+#: pretix/base/models/orders.py:448
msgid "Cart position"
msgstr "Produkt im Warenkorb"
-#: pretix/base/models/orders.py:448
+#: pretix/base/models/orders.py:449
msgid "Cart positions"
msgstr "Produkte im Warenkorb"
+#: pretix/base/models/orders.py:470
+msgid "Company name"
+msgstr "Firmenname"
+
+#: pretix/base/models/orders.py:472
+#: pretix/control/templates/pretixcontrol/order/index.html:192
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:79
+#: pretix/presale/templates/pretixpresale/event/order.html:115
+msgid "Address"
+msgstr "Adresse"
+
+#: pretix/base/models/orders.py:473
+msgid "ZIP code"
+msgstr "Postleitzahl"
+
+#: pretix/base/models/orders.py:474
+msgid "City"
+msgstr "Ort"
+
+#: pretix/base/models/orders.py:475
+#: pretix/control/templates/pretixcontrol/order/index.html:196
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:83
+#: pretix/presale/templates/pretixpresale/event/order.html:119
+msgid "Country"
+msgstr "Land"
+
+#: pretix/base/models/orders.py:476
+msgid "Phone number"
+msgstr "Telefonnummer"
+
+#: pretix/base/models/orders.py:477
+#: pretix/control/templates/pretixcontrol/order/index.html:201
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:88
+#: pretix/presale/templates/pretixpresale/event/order.html:124
+msgid "VAT ID"
+msgstr "USt-ID"
+
#: pretix/base/models/organizer.py:43
#: pretix/control/templates/pretixcontrol/events/index.html:20
#: pretix/control/templates/pretixcontrol/organizers/detail.html:4
@@ -753,7 +793,7 @@ msgstr "Kostenlos"
msgid "The order has been marked as refunded."
msgstr "Die Bestellung wurde als zurückerstattet markiert."
-#: pretix/base/services/cart.py:20 pretix/base/services/orders.py:29
+#: pretix/base/services/cart.py:20 pretix/base/services/orders.py:30
msgid ""
"We were not able to process your request completely as the server was too "
"busy. Please try again."
@@ -769,7 +809,7 @@ msgstr "Du hast keine Produkte ausgewählt."
msgid "You selected a product which is not available for sale."
msgstr "Du hsat ein Produkt ausgewählt, das nicht zum Verkauf steht."
-#: pretix/base/services/cart.py:24 pretix/base/services/orders.py:21
+#: pretix/base/services/cart.py:24 pretix/base/services/orders.py:22
msgid ""
"Some of the products you selected were no longer available. Please see below "
"for details."
@@ -777,7 +817,7 @@ msgstr ""
"Einige der ausgewählten Produkte waren zwischenzeitlich nicht mehr "
"verfügbar, bitte überprüfe deinen Warenkorb."
-#: pretix/base/services/cart.py:26 pretix/base/services/orders.py:23
+#: pretix/base/services/cart.py:26 pretix/base/services/orders.py:24
msgid ""
"Some of the products you selected were no longer available in the quantity "
"you selected. Please see below for details."
@@ -785,7 +825,7 @@ msgstr ""
"Einige der ausgewählten Produkte waren zwischenzeitlich nicht mehr in der "
"gewünschten Anzahl verfügbar, bitte überprüfe deinen Warenkorb."
-#: pretix/base/services/cart.py:28 pretix/base/services/orders.py:27
+#: pretix/base/services/cart.py:28 pretix/base/services/orders.py:28
#, python-format
msgid "You cannot select more than %s items per order"
msgstr "Du kannst nicht mehr als %s Produkte pro Bestellung auswählen"
@@ -819,7 +859,7 @@ msgstr ""
"Du erhältst diese E-Mail, weil du eine Bestellung für die Veranstaltung %s "
"getätigt hast."
-#: pretix/base/services/orders.py:25
+#: pretix/base/services/orders.py:26
msgid ""
"The price of some of the items in your cart has changed in the meantime. "
"Please see below for details."
@@ -827,26 +867,26 @@ msgstr ""
"Der Preis einiger Produkte in deinem Warenkorb hat sich zwischenzeitlich "
"geändert."
-#: pretix/base/services/orders.py:28
+#: pretix/base/services/orders.py:29
msgid "An internal error occured, please try again."
msgstr "Ein interner Fehler ist aufgetreten, bitte erneut versuchen."
-#: pretix/base/services/orders.py:31
+#: pretix/base/services/orders.py:32
msgid "A voucher you tried to use already has been used."
msgstr ""
"Ein Gutscheincode, den du verwenden wolltest, wurde zwischenzeitlich bereits "
"eingelöst."
-#: pretix/base/services/orders.py:32
+#: pretix/base/services/orders.py:33
msgid "A voucher you tried to use has expired."
msgstr "Ein Gutscheincode, den du verwenden wolltest, ist abgelaufen."
-#: pretix/base/services/orders.py:76
+#: pretix/base/services/orders.py:77
#, python-format
msgid "Payment received for your order: %(code)s"
msgstr "Zahlung erhalten für die Bestellung: %(code)s"
-#: pretix/base/services/orders.py:241 pretix/control/views/orders.py:208
+#: pretix/base/services/orders.py:254 pretix/control/views/orders.py:208
#: pretix/presale/templates/pretixpresale/event/order.html:21
#, python-format
msgid "Your order: %(code)s"
@@ -860,7 +900,7 @@ msgstr "Unkategorisiert"
msgid "Payment method fees"
msgstr "Zahlungsgebühren"
-#: pretix/base/settings.py:102
+#: pretix/base/settings.py:114
#, python-brace-format
msgid ""
"Hello,\n"
@@ -886,7 +926,7 @@ msgstr ""
"Viele Grüße,\n"
"Das {event} Team"
-#: pretix/base/settings.py:115
+#: pretix/base/settings.py:127
#, python-brace-format
msgid ""
"Hello,\n"
@@ -914,7 +954,7 @@ msgstr ""
"Viele Grüße,\n"
"Das {event} Team"
-#: pretix/base/settings.py:130
+#: pretix/base/settings.py:142
#, python-brace-format
msgid ""
"Hello,\n"
@@ -1191,56 +1231,75 @@ msgstr "Namen des Teilnehmer erfordern"
msgid "Require customers to fill in the names of all attendees."
msgstr "Erfordere die Eingabe aller Teilnehmer-Namen."
-#: pretix/control/forms/event.py:135
+#: pretix/control/forms/event.py:134
+msgid "Ask for invoice address"
+msgstr "Rechnungsadresse erfragen"
+
+#: pretix/control/forms/event.py:138
+msgid "Require invoice address"
+msgstr "Rechnungsadresse erforderlich"
+
+#: pretix/control/forms/event.py:142
+msgid "Ask for VAT ID"
+msgstr "Nach USt-ID fragen"
+
+#: pretix/control/forms/event.py:143
+msgid ""
+"Does only work if an invoice address is asked for. VAT ID is not required."
+msgstr ""
+"Funktioniert nur, wenn nach einer Rechnungsadresse gefragt wird. Die USt-ID-"
+"Eingabe ist freiwillig."
+
+#: pretix/control/forms/event.py:148
msgid "Maximum number of items per order"
msgstr "Maximale Anzahl Produkte pro Bestellung"
-#: pretix/control/forms/event.py:139
+#: pretix/control/forms/event.py:152
msgid "Reservation period"
msgstr "Reservierungszeitraum"
-#: pretix/control/forms/event.py:140
+#: pretix/control/forms/event.py:153
msgid ""
"The number of minutes the items in a user's card are reserved for this user."
msgstr ""
"Die Dauer in Minuten, die Produkte im Warenkorb eines Benutzers reserviert "
"werden."
-#: pretix/control/forms/event.py:143
+#: pretix/control/forms/event.py:156
msgid "Imprint URL"
msgstr "Impressum (URL)"
-#: pretix/control/forms/event.py:147
+#: pretix/control/forms/event.py:160
msgid "Contact address"
msgstr "Kontakt-E-Mail"
-#: pretix/control/forms/event.py:149
+#: pretix/control/forms/event.py:162
msgid "Public email address for contacting the organizer"
msgstr "Öffentliche E-Mail-Adresse zur Kontaktierung des Veranstalters"
-#: pretix/control/forms/event.py:156
+#: pretix/control/forms/event.py:169
msgid ""
"Your default locale must also be enebled for your event (see box above)."
msgstr ""
"Die Standardsprache muss eine der aktivierten Sprachen sein (siehe weiter "
"oben)."
-#: pretix/control/forms/event.py:160
+#: pretix/control/forms/event.py:173
msgid ""
"You cannot require specifying attendee names if you do not ask for them."
msgstr ""
"Du kannst die Angabe von Teilnehmernamen nur erfordern, wenn auch nach Namen "
"gefragt wird."
-#: pretix/control/forms/event.py:189 pretix/control/forms/event.py:283
+#: pretix/control/forms/event.py:202 pretix/control/forms/event.py:296
msgid "This field is required."
msgstr "Dieses Feld ist erforderlich."
-#: pretix/control/forms/event.py:194
+#: pretix/control/forms/event.py:207
msgid "Subject prefix"
msgstr "Betreffs-Prefix"
-#: pretix/control/forms/event.py:195
+#: pretix/control/forms/event.py:208
msgid ""
"This will be prepended to the subject of all outgoing emails. This could be "
"a short form of your event name."
@@ -1248,19 +1307,19 @@ msgstr ""
"Dies wird jedem E-Mail-Betreff vorangestellt und könnten z.B. eine Kurzform "
"Ihres Veranstaltungsnamens enthalten."
-#: pretix/control/forms/event.py:200
+#: pretix/control/forms/event.py:213
msgid "Sender address"
msgstr "Absender-Adresse"
-#: pretix/control/forms/event.py:201
+#: pretix/control/forms/event.py:214
msgid "Sender address for outgoing e-mails"
msgstr "Absender-Adresse für ausgehende E-Mails"
-#: pretix/control/forms/event.py:204
+#: pretix/control/forms/event.py:217
msgid "Placed order"
msgstr "Getätigte Bestellung"
-#: pretix/control/forms/event.py:207
+#: pretix/control/forms/event.py:220
#, python-brace-format
msgid ""
"Available placeholders: {event}, {total}, {currency}, {date}, {paymentinfo}, "
@@ -1269,25 +1328,25 @@ msgstr ""
"Verfügbare Platzhalter: {event}, {total}, {currency}, {date}, {paymentinfo}, "
"{url}"
-#: pretix/control/forms/event.py:210
+#: pretix/control/forms/event.py:223
msgid "Paid order"
msgstr "Bezahlt Bestellung"
-#: pretix/control/forms/event.py:213 pretix/control/forms/event.py:219
+#: pretix/control/forms/event.py:226 pretix/control/forms/event.py:232
#, python-brace-format
msgid "Available placeholders: {event}, {url}"
msgstr "Verfügbare Platzhalter: {event}, {url}"
-#: pretix/control/forms/event.py:216
+#: pretix/control/forms/event.py:229
#: pretix/control/templates/pretixcontrol/order/index.html:76
msgid "Resend link"
msgstr "Link erneut senden"
-#: pretix/control/forms/event.py:222
+#: pretix/control/forms/event.py:235
msgid "Use custom SMTP server"
msgstr "Eigenen SMTP-Server verwenden"
-#: pretix/control/forms/event.py:223
+#: pretix/control/forms/event.py:236
msgid ""
"All mail related to your event will be sent over the smtp server specified "
"by you."
@@ -1295,49 +1354,49 @@ msgstr ""
"Alle E-Mails bezüglich deiner Veranstaltung werden über den von dir "
"angegebenen SMTP-Server versendet."
-#: pretix/control/forms/event.py:227
+#: pretix/control/forms/event.py:240
msgid "Hostname"
msgstr "Hostname"
-#: pretix/control/forms/event.py:231
+#: pretix/control/forms/event.py:244
msgid "Port"
msgstr "Port"
-#: pretix/control/forms/event.py:235
+#: pretix/control/forms/event.py:248
msgid "Username"
msgstr "Benutzername"
-#: pretix/control/forms/event.py:244
+#: pretix/control/forms/event.py:257
msgid "Use STARTTLS"
msgstr "STARTTLS verwenden"
-#: pretix/control/forms/event.py:245
+#: pretix/control/forms/event.py:258
msgid "Commonly enabled on port 587."
msgstr "Meistens auf Port 587 verfügbar."
-#: pretix/control/forms/event.py:249
+#: pretix/control/forms/event.py:262
msgid "Use SSL"
msgstr "SSL verwenden"
-#: pretix/control/forms/event.py:250
+#: pretix/control/forms/event.py:263
msgid "Commonly enabled on port 465."
msgstr "Meistens auf Port 465 verfügbar."
-#: pretix/control/forms/event.py:257
+#: pretix/control/forms/event.py:270
msgid "Use feature"
msgstr "Funktion benutzen"
-#: pretix/control/forms/event.py:258
+#: pretix/control/forms/event.py:271
msgid "Use pretix to generate tickets for the user to download and print out."
msgstr ""
"Wenn diese Funktion aktiviert ist, generiert pretix Tickets, die der "
"Benutzer herunterladen und ausdrucken kann."
-#: pretix/control/forms/event.py:262
+#: pretix/control/forms/event.py:275
msgid "Download date"
msgstr "Download-Datum"
-#: pretix/control/forms/event.py:263
+#: pretix/control/forms/event.py:276
msgid "Ticket download will be offered after this date."
msgstr "Der Ticket-Download wird zu diesem Zeitpunkt freigeschaltet."
@@ -1408,7 +1467,7 @@ msgstr "Neues Passwort setzen"
#: pretix/control/templates/pretixcontrol/event/mail.html:30
#: pretix/control/templates/pretixcontrol/event/payment.html:31
#: pretix/control/templates/pretixcontrol/event/permissions.html:56
-#: pretix/control/templates/pretixcontrol/event/settings.html:47
+#: pretix/control/templates/pretixcontrol/event/settings.html:50
#: pretix/control/templates/pretixcontrol/event/tickets.html:36
#: pretix/control/templates/pretixcontrol/events/create.html:30
#: pretix/control/templates/pretixcontrol/item/index.html:28
@@ -1486,9 +1545,9 @@ msgid "General"
msgstr "Allgemeines"
#: pretix/control/templates/pretixcontrol/event/base.html:30
-#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:52
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:51
#: pretix/presale/templates/pretixpresale/event/order.html:31
-#: pretix/presale/templates/pretixpresale/event/order.html:111
+#: pretix/presale/templates/pretixpresale/event/order.html:148
msgid "Payment"
msgstr "Zahlung"
@@ -1952,7 +2011,7 @@ msgstr "Verbleibende Kapazität"
#: pretix/control/templates/pretixcontrol/order/cancel.html:4
#: pretix/control/templates/pretixcontrol/order/cancel.html:8
#: pretix/control/templates/pretixcontrol/order/index.html:28
-#: pretix/presale/templates/pretixpresale/event/order.html:101
+#: pretix/presale/templates/pretixpresale/event/order.html:138
#: pretix/presale/templates/pretixpresale/event/order_cancel.html:4
msgid "Cancel order"
msgstr "Stornieren"
@@ -2056,6 +2115,32 @@ msgstr "Der Status dieser Bestellung wurde manuell verändert."
msgid "The payment has to be completed before %(date)s."
msgstr "Die Zahlung muss bis zum %(date)s abgeschlossen sein."
+#: pretix/control/templates/pretixcontrol/order/index.html:183
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:70
+#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:30
+#: pretix/presale/templates/pretixpresale/event/order.html:106
+#: pretix/presale/templates/pretixpresale/event/order_modify.html:19
+msgid "Invoice information"
+msgstr "Rechnungsinformationen"
+
+#: pretix/control/templates/pretixcontrol/order/index.html:188
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:75
+#: pretix/presale/templates/pretixpresale/event/order.html:111
+msgid "Company"
+msgstr "Firma"
+
+#: pretix/control/templates/pretixcontrol/order/index.html:194
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:81
+#: pretix/presale/templates/pretixpresale/event/order.html:117
+msgid "ZIP code and city"
+msgstr "PLZ und Ort"
+
+#: pretix/control/templates/pretixcontrol/order/index.html:198
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:85
+#: pretix/presale/templates/pretixpresale/event/order.html:121
+msgid "Phone"
+msgstr "Telefon"
+
#: pretix/control/templates/pretixcontrol/order/refund.html:10
msgid "Do you really want to refund this order? You cannot revert this action."
msgstr ""
@@ -2367,11 +2452,11 @@ msgstr "Die Bestellung wurde storniert."
msgid "The order has been marked as not paid."
msgstr "Die Bestellung wurde als unbezahlt markiert."
-#: pretix/control/views/orders.py:236 pretix/presale/views/order.py:279
+#: pretix/control/views/orders.py:236 pretix/presale/views/order.py:296
msgid "You requested an invalid ticket output type."
msgstr "Du hast einen ungültigen Ausgabetyp gewählt."
-#: pretix/control/views/orders.py:239 pretix/presale/views/order.py:284
+#: pretix/control/views/orders.py:239 pretix/presale/views/order.py:301
msgid "Order is not paid."
msgstr "Bestellung ist nicht bezahlt."
@@ -2548,7 +2633,7 @@ msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:11
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:43
-#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:56
+#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:72
#: pretix/presale/templates/pretixpresale/event/order_pay.html:26
msgid "Continue"
msgstr "Fortfahren"
@@ -3264,28 +3349,36 @@ msgstr "Veranstaltungsname-y-Position (mm)"
msgid "Event name size (mm)"
msgstr "Veranstaltungsname-Größe (mm)"
-#: pretix/presale/checkoutflow.py:147 pretix/presale/views/order.py:217
+#: pretix/presale/checkoutflow.py:166 pretix/presale/views/order.py:232
msgid ""
"We had difficulties processing your input. Please review the errors below."
msgstr "Wir hatten Schwierigkeiten, deine Eingabe zu verarbeiten."
-#: pretix/presale/checkoutflow.py:158 pretix/presale/checkoutflow.py:163
+#: pretix/presale/checkoutflow.py:181 pretix/presale/checkoutflow.py:186
msgid "Please enter a valid e-mail address."
msgstr "Bitte gib eine gültige E-Mail-Adresse ein."
-#: pretix/presale/checkoutflow.py:173 pretix/presale/checkoutflow.py:178
+#: pretix/presale/checkoutflow.py:196 pretix/presale/checkoutflow.py:201
msgid "Please fill in answers to all required questions."
msgstr "Bitte fülle Antworten zu allen benötigten Fragen ein."
-#: pretix/presale/checkoutflow.py:229
+#: pretix/presale/checkoutflow.py:253
msgid "Please select a payment method."
msgstr "Bitte wähle eine Zahlungsmethode aus."
-#: pretix/presale/checkoutflow.py:250 pretix/presale/checkoutflow.py:256
-#: pretix/presale/views/order.py:154 pretix/presale/views/order.py:184
+#: pretix/presale/checkoutflow.py:274 pretix/presale/checkoutflow.py:280
+#: pretix/presale/views/order.py:156 pretix/presale/views/order.py:186
msgid "The payment information you entered was incomplete."
msgstr "Die eingegebenen Zahlungsinformationen sind unvollständig."
+#: pretix/presale/forms/checkout.py:19
+msgid "Street and Number"
+msgstr "Straße und Hausnummer"
+
+#: pretix/presale/forms/checkout.py:37
+msgid "You need to provide either a company name or your name."
+msgstr "Du musst entweder einen Firmennamen oder deinen Namen eingeben."
+
#: pretix/presale/middleware.py:25
msgid "The selected event was not found."
msgstr "Die ausgewählte Veranstaltung wurde nicht gefunden."
@@ -3321,8 +3414,9 @@ msgstr ""
"Bitte überprüfe die untenstehenden Details und bestätige deine Bestellung."
#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:17
-#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:47
-#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:65
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:46
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:66
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:102
msgid "Modify"
msgstr "Bearbeiten"
@@ -3344,22 +3438,22 @@ msgstr ""
msgid "The items in your cart are no longer reserved for you."
msgstr "Die Produkte in deinem Warenkorb sind nicht mehr für dich reserviert."
-#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:69
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:106
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:15
msgid "Contact information"
msgstr "Kontaktinformationen"
-#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:74
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:111
msgid "E-mail address"
msgstr "E-Mail-Adresse"
-#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:84
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:122
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:38
-#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:51
+#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:67
msgid "Go back"
msgstr "Zurück"
-#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:89
+#: pretix/presale/templates/pretixpresale/event/checkout_confirm.html:127
msgid "Place binding order"
msgstr "Zahlungspflichtig bestellen"
@@ -3479,6 +3573,7 @@ msgid "You will be able to download your tickets here on %(date)s."
msgstr "Du kannst deine Tickets hier ab %(date)s herunterladen."
#: pretix/presale/templates/pretixpresale/event/order.html:82
+#: pretix/presale/templates/pretixpresale/event/order.html:101
msgid "Change details"
msgstr "Details bearbeiten"
@@ -3496,11 +3591,11 @@ msgstr "Bestellung bearbeiten"
msgid "Modify order: %(code)s"
msgstr "Bestellung bearbeiten: %(code)s"
-#: pretix/presale/templates/pretixpresale/event/order_modify.html:40
+#: pretix/presale/templates/pretixpresale/event/order_modify.html:56
msgid "Revert changes"
msgstr "Zurücksetzen"
-#: pretix/presale/templates/pretixpresale/event/order_modify.html:45
+#: pretix/presale/templates/pretixpresale/event/order_modify.html:61
msgid "Save changes"
msgstr "Änderungen speichern"
@@ -3584,27 +3679,27 @@ msgstr "Die gewählten Produkte wurden deinem Warenkorb hinzugefügt."
msgid "Your cart is empty"
msgstr "Dein Warenkorb ist leer."
-#: pretix/presale/views/order.py:53 pretix/presale/views/order.py:105
-#: pretix/presale/views/order.py:147 pretix/presale/views/order.py:180
-#: pretix/presale/views/order.py:229 pretix/presale/views/order.py:249
-#: pretix/presale/views/order.py:282
+#: pretix/presale/views/order.py:55 pretix/presale/views/order.py:107
+#: pretix/presale/views/order.py:149 pretix/presale/views/order.py:182
+#: pretix/presale/views/order.py:245 pretix/presale/views/order.py:266
+#: pretix/presale/views/order.py:299
msgid "Unknown order code or not authorized to access this order."
msgstr ""
"Unbekannte Bestellnummer oder Bestellung gehört einem anderen Benutzer."
-#: pretix/presale/views/order.py:109 pretix/presale/views/order.py:149
+#: pretix/presale/views/order.py:111 pretix/presale/views/order.py:151
msgid "The payment for this order cannot be continued."
msgstr "Diese Bestellung kann nicht mehr bezahlt werden."
-#: pretix/presale/views/order.py:231
+#: pretix/presale/views/order.py:247
msgid "You cannot modify this order"
msgstr "Sie können diese Bestellung nicht bearbeiten"
-#: pretix/presale/views/order.py:251
+#: pretix/presale/views/order.py:268
msgid "You cannot cancel this order"
msgstr "Sie können diese Bestellung nicht stornieren"
-#: pretix/presale/views/order.py:289
+#: pretix/presale/views/order.py:306
msgid "Ticket download is not (yet) enabled."
msgstr "Der Ticket-Download ist (noch) nicht freigeschaltet."
@@ -3722,9 +3817,6 @@ msgstr "Deutsch (Du)"
#~ msgid "Deselect all"
#~ msgstr "Keine auswählen"
-#~ msgid "Require e-mail adresses"
-#~ msgstr "E-Mail-Adresse erfordern"
-
#~ msgid "Require all customers to provide an e-mail address."
#~ msgstr "Erfordere eine E-Mail-Adresse von allen Käufern."
diff --git a/src/pretix/presale/checkoutflow.py b/src/pretix/presale/checkoutflow.py
index 84edd55ae6..3d05f499eb 100644
--- a/src/pretix/presale/checkoutflow.py
+++ b/src/pretix/presale/checkoutflow.py
@@ -11,10 +11,11 @@ from django.utils.translation import ugettext_lazy as _
from django.views.generic.base import TemplateResponseMixin
from pretix.base.models import CartPosition, Order
+from pretix.base.models.orders import InvoiceAddress
from pretix.base.services.orders import OrderError, perform_order
from pretix.base.signals import register_payment_providers
from pretix.multidomain.urlreverse import eventreverse
-from pretix.presale.forms.checkout import ContactForm
+from pretix.presale.forms.checkout import ContactForm, InvoiceAddressForm
from pretix.presale.signals import checkout_flow_steps
from pretix.presale.views import CartMixin
from pretix.presale.views.async import AsyncAction
@@ -139,14 +140,36 @@ class QuestionsStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
'email': self.request.session.get('email', '')
})
+ @cached_property
+ def invoice_address(self):
+ try:
+ return InvoiceAddress.objects.get(
+ pk=self.request.session.get('invoice_address'),
+ order__isnull=True
+ )
+ except InvoiceAddress.DoesNotExist:
+ return InvoiceAddress()
+
+ @cached_property
+ def invoice_form(self):
+ return InvoiceAddressForm(data=self.request.POST if self.request.method == "POST" else None,
+ event=self.request.event,
+ instance=self.invoice_address)
+
def post(self, request):
self.request = request
failed = not self.save() or not self.contact_form.is_valid()
+ if request.event.settings.invoice_address_asked:
+ failed = failed or not self.invoice_form.is_valid()
if failed:
messages.error(request,
_("We had difficulties processing your input. Please review the errors below."))
return self.render()
request.session['email'] = self.contact_form.cleaned_data['email']
+ if request.event.settings.invoice_address_asked:
+ addr = self.invoice_form.save()
+ request.session['invoice_address'] = addr.pk
+
return redirect(self.get_next_url(request))
def is_completed(self, request, warn=False):
@@ -183,6 +206,7 @@ class QuestionsStep(QuestionsViewMixin, CartMixin, TemplateFlowStep):
ctx = super().get_context_data(**kwargs)
ctx['forms'] = self.forms
ctx['contact_form'] = self.contact_form
+ ctx['invoice_form'] = self.invoice_form
return ctx
@@ -282,6 +306,7 @@ class ConfirmStep(CartMixin, AsyncAction, TemplateFlowStep):
ctx['cart'] = self.get_cart(answers=True)
ctx['payment'] = self.payment_provider.checkout_confirm_render(self.request)
ctx['payment_provider'] = self.payment_provider
+ ctx['addr'] = self.invoice_address
return ctx
@cached_property
@@ -292,6 +317,16 @@ class ConfirmStep(CartMixin, AsyncAction, TemplateFlowStep):
if provider.identifier == self.request.session['payment']:
return provider
+ @cached_property
+ def invoice_address(self):
+ try:
+ return InvoiceAddress.objects.get(
+ pk=self.request.session.get('invoice_address'),
+ order__isnull=True
+ )
+ except InvoiceAddress.DoesNotExist:
+ return InvoiceAddress()
+
def get(self, request):
self.request = request
if 'async_id' in request.GET and settings.HAS_CELERY:
@@ -302,7 +337,7 @@ class ConfirmStep(CartMixin, AsyncAction, TemplateFlowStep):
self.request = request
return self.do(self.request.event.id, self.payment_provider.identifier,
[p.id for p in self.positions], request.session.get('email'),
- translation.get_language())
+ translation.get_language(), self.invoice_address.pk)
def get_success_message(self, value):
return None
diff --git a/src/pretix/presale/forms/checkout.py b/src/pretix/presale/forms/checkout.py
index 131ea2ac25..bc3581a1ce 100644
--- a/src/pretix/presale/forms/checkout.py
+++ b/src/pretix/presale/forms/checkout.py
@@ -1,13 +1,42 @@
from django import forms
+from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _
from pretix.base.models import Question
+from pretix.base.models.orders import InvoiceAddress
class ContactForm(forms.Form):
email = forms.EmailField(label=_('E-mail'))
+class InvoiceAddressForm(forms.ModelForm):
+
+ class Meta:
+ model = InvoiceAddress
+ fields = ('company', 'name', 'street', 'zipcode', 'city', 'country', 'phone', 'vat_id')
+ widgets = {
+ 'street': forms.Textarea(attrs={'rows': 2, 'placeholder': _('Street and Number')}),
+ }
+
+ def __init__(self, *args, **kwargs):
+ self.event = event = kwargs.pop('event')
+ super().__init__(*args, **kwargs)
+ if not event.settings.invoice_address_vatid:
+ del self.fields['vat_id']
+ if not event.settings.invoice_address_required:
+ for k, f in self.fields.items():
+ f.required = False
+ f.widget.is_required = False
+ if 'required' in f.widget.attrs:
+ del f.widget.attrs['required']
+
+ def clean(self):
+ data = self.cleaned_data
+ if not data['name'] and not data['company'] and self.event.settings.invoice_address_required:
+ raise ValidationError(_('You need to provide either a company name or your name.'))
+
+
class QuestionsForm(forms.Form):
"""
This form class is responsible for asking order-related questions. This includes
diff --git a/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html b/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html
index be9c5ff924..79649a696c 100644
--- a/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html
+++ b/src/pretix/presale/templates/pretixpresale/event/checkout_confirm.html
@@ -37,26 +37,63 @@
-
-
-
- {% if payment_provider.identifier != "free" %}
-
- {% endif %}
-
- {% trans "Payment" %}
-
-
-
- {{ payment }}
-
+
+
+ {% if payment_provider.identifier != "free" %}
+
+ {% endif %}
+
+ {% trans "Payment" %}
+
-
+
+ {% if request.event.settings.invoice_address_asked %}
+
+ {% endif %}
+
-
+
{% endblock %}
diff --git a/src/pretix/presale/templates/pretixpresale/event/checkout_questions.html b/src/pretix/presale/templates/pretixpresale/event/checkout_questions.html
index c06eee9d35..bce73e22e9 100644
--- a/src/pretix/presale/templates/pretixpresale/event/checkout_questions.html
+++ b/src/pretix/presale/templates/pretixpresale/event/checkout_questions.html
@@ -22,6 +22,22 @@
+ {% if event.settings.invoice_address_asked %}
+
+
+
+
+ {% bootstrap_form invoice_form layout="horizontal" %}
+
+
+
+ {% endif %}
{% for form in forms %}
diff --git a/src/pretix/presale/templates/pretixpresale/event/order.html b/src/pretix/presale/templates/pretixpresale/event/order.html
index e3b5e1e9c0..015dde17f5 100644
--- a/src/pretix/presale/templates/pretixpresale/event/order.html
+++ b/src/pretix/presale/templates/pretixpresale/event/order.html
@@ -91,6 +91,43 @@
{% include "pretixpresale/event/fragment_cart.html" with cart=cart event=request.event editable=False %}
+ {% if request.event.settings.invoice_address_asked %}
+
+
+ {% if order.can_modify_answers %}
+
+ {% endif %}
+
+ {% trans "Invoice information" %}
+
+
+
+
+ - {% trans "Company" %}
+ - {{ order.invoice_address.company }}
+ - {% trans "Name" %}
+ - {{ order.invoice_address.name }}
+ - {% trans "Address" %}
+ - {{ order.invoice_address.street|linebreaksbr }}
+ - {% trans "ZIP code and city" %}
+ - {{ order.invoice_address.zipcode }} {{ addr.city }}
+ - {% trans "Country" %}
+ - {{ order.invoice_address.country }}
+ - {% trans "Phone" %}
+ - {{ order.invoice_address.phone }}
+ {% if request.event.settings.invoice_address_vatid %}
+ - {% trans "VAT ID" %}
+ - {{ order.invoice_address.vat_id }}
+ {% endif %}
+
+
+
+ {% endif %}
{% if order.status == "n" %}
diff --git a/src/pretix/presale/templates/pretixpresale/event/order_modify.html b/src/pretix/presale/templates/pretixpresale/event/order_modify.html
index 439b2c7a10..1ed1b512b0 100644
--- a/src/pretix/presale/templates/pretixpresale/event/order_modify.html
+++ b/src/pretix/presale/templates/pretixpresale/event/order_modify.html
@@ -11,6 +11,22 @@