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" %} +

-
+
+ {{ payment }} +
+
+
+ {% if request.event.settings.invoice_address_asked %} +
+
+
+ +

+ {% trans "Invoice information" %} +

+
+
+
+
{% trans "Company" %}
+
{{ addr.company }}
+
{% trans "Name" %}
+
{{ addr.name }}
+
{% trans "Address" %}
+
{{ addr.street|linebreaksbr }}
+
{% trans "ZIP code and city" %}
+
{{ addr.zipcode }} {{ addr.city }}
+
{% trans "Country" %}
+
{{ addr.country }}
+
{% trans "Phone" %}
+
{{ addr.phone }}
+ {% if request.event.settings.invoice_address_vatid %} +
{% trans "VAT ID" %}
+
{{ addr.vat_id }}
+ {% endif %} +
+
+
+
+ {% endif %} +
@@ -77,20 +114,20 @@
-
- -
- -
-
+
+
+ +
+ +
+
{% 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 %} +
+ + +
+ {% 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 @@
{% csrf_token %}
+ {% if event.settings.invoice_address_asked %} +
+ + +
+ {% endif %} {% for form in forms %}
diff --git a/src/pretix/presale/views/order.py b/src/pretix/presale/views/order.py index d0aad2b795..743c7fe648 100644 --- a/src/pretix/presale/views/order.py +++ b/src/pretix/presale/views/order.py @@ -10,12 +10,14 @@ from django.utils.translation import ugettext_lazy as _ from django.views.generic import TemplateView, View from pretix.base.models import CachedFile, CachedTicket, Order, OrderPosition +from pretix.base.models.orders import InvoiceAddress from pretix.base.services.orders import cancel_order from pretix.base.services.tickets import generate from pretix.base.signals import ( register_payment_providers, register_ticket_outputs, ) from pretix.multidomain.urlreverse import eventreverse +from pretix.presale.forms.checkout import InvoiceAddressForm from pretix.presale.views import CartMixin, EventViewMixin from pretix.presale.views.questions import QuestionsViewMixin @@ -210,12 +212,26 @@ class OrderModify(EventViewMixin, OrderDetailMixin, QuestionsViewMixin, Template 'item__questions', 'answers' )) + @cached_property + def invoice_address(self): + if self.order.invoice_address: + return self.order.invoice_address + else: + return InvoiceAddress(order=self.order) + + @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, *args, **kwargs): - failed = not self.save() + failed = not self.save() or not self.invoice_form.is_valid() if failed: messages.error(self.request, _("We had difficulties processing your input. Please review the errors below.")) return self.get(request, *args, **kwargs) + self.invoice_form.save() self.order.log_action('pretix.event.order.modified') return redirect(self.get_order_url()) @@ -236,6 +252,7 @@ class OrderModify(EventViewMixin, OrderDetailMixin, QuestionsViewMixin, Template ctx = super().get_context_data(**kwargs) ctx['order'] = self.order ctx['forms'] = self.forms + ctx['invoice_form'] = self.invoice_form return ctx