Compare commits

..

30 Commits

Author SHA1 Message Date
Raphael Michel
45bff138d7 Send security notification when recovery code is used or created by admin
"Where to store recovery codes" is one of these problems there is no
right answer to, so many people store them in a less-than-optimal place.
If that's the reality we live in, this PR adds at least a little
security so one notices when they get used :)
2025-12-12 15:30:22 +01:00
Raphael Michel
510c4850a5 Merge branch 'Add-Promptpay-for-stripe' (#5670) 2025-12-12 09:08:12 +01:00
Raphael Michel
b13368d614 Event creation: Do not declare tax rate as optional (fixes #4794) (#5619) 2025-12-12 08:59:07 +01:00
Ana Rute Pacheco Vivas
b5cc8b368b Translations: Update Portuguese (Portugal)
Currently translated at 83.2% (5140 of 6172 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt_PT/

powered by weblate
2025-12-12 08:59:04 +01:00
Renne Rocha
87c30d0acb Translations: Update Portuguese (Brazil)
Currently translated at 90.4% (5585 of 6172 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt_BR/

powered by weblate
2025-12-12 08:59:04 +01:00
Raphael Michel
ffed8b29b1 Bank transfer: Allow CAMT import (#5601) 2025-12-12 08:58:52 +01:00
Ana Rute Pacheco Vivas
53fbb64225 Translations: Update Portuguese (Portugal)
Currently translated at 50.3% (128 of 254 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/pt_PT/

powered by weblate
2025-12-10 17:02:20 +01:00
Ana Rute Pacheco Vivas
e10ec4074b Translations: Update Portuguese (Portugal)
Currently translated at 83.1% (5135 of 6172 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt_PT/

powered by weblate
2025-12-10 17:02:20 +01:00
Lachlan Struthers
7f2dc77aca Translations: Update Albanian
Currently translated at 41.3% (105 of 254 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/sq/

powered by weblate
2025-12-10 17:02:20 +01:00
Lachlan Struthers
199a3bf1e7 Translations: Update Albanian
Currently translated at 0.6% (39 of 6172 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/sq/

powered by weblate
2025-12-10 17:02:20 +01:00
Raphael Michel
904aa807a3 Footer link form: Add placeholder (Z#23217115) 2025-12-10 16:49:09 +01:00
Praveen Kathirvasan
0e41353a0e Add "Pay by bank" option for UK customers via Stripe (#5648)
* Add support for 'Pay by bank (UK)' payment method via Stripe

* Add 'Pay by bank' payment provider to Stripe integration

* Enhance Stripe integration: Allow UK bank payments and update imports

* Remove UK-specific payment method options from StripePayByBank integration

* Remove some UK references

---------

Co-authored-by: Raphael Michel <michel@rami.io>
2025-12-09 13:25:52 +01:00
Raphael Michel
82ca50c7ff Fix templates 2025-12-09 12:42:47 +01:00
Daniel
3437b64947 Add PromptPay support (#5)
* Handle PromptPay QR flow

* Send billing email for PromptPay

* fix isort

* Update payment.py

* Update signals.py

---------

Co-authored-by: Chondaen <chondaen12@1000WA>
2025-12-09 12:28:28 +01:00
Raphael Michel
b895d9bbca Import large package lazily to speed up startup (#5636)
* Import large package lazily to speed up startup

* Make all jsonschema imports lazy
2025-12-09 09:52:53 +01:00
Raphael Michel
f214edaf34 Timeline: Fix incorrect string formatting (fixes #5614) (#5617) 2025-12-09 08:52:09 +01:00
Raphael Michel
165a47b593 Bank transfer: Auto-ignore all 0-valued transactions (fixes #5168) (#5620)
* Bank transfer: Auto-ignore all 0-valued transactions (fixes #5168)

* Fix failing test
2025-12-09 08:50:04 +01:00
Renne Rocha
e06f281f1e Translations: Update Portuguese (Brazil)
Currently translated at 90.3% (5575 of 6172 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt_BR/

powered by weblate
2025-12-09 08:49:57 +01:00
Renne Rocha
203c7e660d Translations: Update Portuguese (Brazil)
Currently translated at 100.0% (254 of 254 strings)

Translation: pretix/pretix (JavaScript parts)
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix-js/pt_BR/

powered by weblate
2025-12-09 08:49:57 +01:00
Renne Rocha
8c360b8754 Translations: Update Portuguese (Brazil)
Currently translated at 90.2% (5572 of 6172 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt_BR/

powered by weblate
2025-12-09 08:49:57 +01:00
Ruud Hendrickx
90b6511d11 Translations: Update Dutch (informal) (nl_Informal)
Currently translated at 64.0% (3951 of 6172 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/nl_Informal/

powered by weblate
2025-12-09 08:49:57 +01:00
Ruud Hendrickx
bb356257cb Translations: Update Dutch
Currently translated at 96.3% (5945 of 6172 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/nl/

powered by weblate
2025-12-09 08:49:57 +01:00
sandra r
e1950e408e Translations: Update Galician
Currently translated at 15.5% (958 of 6172 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/gl/

powered by weblate
2025-12-09 08:49:57 +01:00
Yasunobu YesNo Kawaguchi
99d5722ce1 Translations: Update Japanese
Currently translated at 99.9% (6166 of 6172 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/ja/

powered by weblate
2025-12-09 08:49:57 +01:00
luelista
324eeb8d40 Fix crash when imported CSV has invalid syntax (#5702) 2025-12-09 08:09:34 +01:00
Raphael Michel
449e8dc905 Event cancel form: Add missing rich=True flag 2025-12-08 09:58:54 +01:00
Raphael Michel
c491c8232e Bank transfer: Allow dashes in event slug to be missing (Z#23216859) (#5682)
* Bank transfer: Allow dashes in event slug to be missing (Z#23216859)

* Update src/pretix/plugins/banktransfer/tasks.py

Co-authored-by: Richard Schreiber <schreiber@pretix.eu>

* Update src/pretix/plugins/banktransfer/tasks.py

Co-authored-by: Richard Schreiber <schreiber@pretix.eu>

* Apply suggestions from code review

Co-authored-by: Richard Schreiber <schreiber@pretix.eu>

---------

Co-authored-by: Richard Schreiber <schreiber@pretix.eu>
2025-12-05 10:54:03 +01:00
sandra r
aa02cc7968 Translations: Update Galician
Currently translated at 15.5% (961 of 6172 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/gl/

powered by weblate
2025-12-05 10:36:32 +01:00
Renne Rocha
cfa13d6b9d Translations: Update Portuguese (Brazil)
Currently translated at 90.2% (5572 of 6172 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/pt_BR/

powered by weblate
2025-12-05 10:36:32 +01:00
Raphael Michel
af4eabc800 URL generation: Fix bug if plugins declare both event_urls and organizer_urls (#5688)
* URL generation: Fix bug if plugins declare both event_urls and organizer_urls

* Add missing file

* Add license header
2025-12-05 10:22:28 +01:00
48 changed files with 2672 additions and 640 deletions

View File

@@ -3,7 +3,7 @@ name = "pretix"
dynamic = ["version"]
description = "Reinventing presales, one ticket at a time"
readme = "README.rst"
requires-python = ">=3.10"
requires-python = ">=3.9"
license = {file = "LICENSE"}
keywords = ["tickets", "web", "shop", "ecommerce"]
authors = [
@@ -22,7 +22,7 @@ classifiers = [
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Framework :: Django :: 5.2",
"Framework :: Django :: 4.2",
]
dependencies = [
@@ -36,7 +36,7 @@ dependencies = [
"css-inline==0.18.*",
"defusedcsv>=1.1.0",
"dnspython==2.*",
"Django[argon2]==5.2.*",
"Django[argon2]==4.2.*,>=4.2.26",
"django-bootstrap3==25.2",
"django-compressor==4.5.1",
"django-countries==7.6.*",

View File

@@ -53,7 +53,6 @@ from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from django_otp.models import Device
from django_scopes import scopes_disabled
from webauthn.helpers.structs import PublicKeyCredentialDescriptor
from pretix.base.i18n import language
from pretix.helpers.urls import build_absolute_uri
@@ -708,6 +707,8 @@ class U2FDevice(Device):
@property
def webauthndevice(self):
from webauthn.helpers.structs import PublicKeyCredentialDescriptor
d = json.loads(self.json_data)
return PublicKeyCredentialDescriptor(websafe_decode(d['keyHandle']))
@@ -737,6 +738,8 @@ class WebAuthnDevice(Device):
@property
def webauthndevice(self):
from webauthn.helpers.structs import PublicKeyCredentialDescriptor
return PublicKeyCredentialDescriptor(websafe_decode(self.credential_id))
@property

View File

@@ -22,7 +22,6 @@
import json
from collections import namedtuple
import jsonschema
from django.contrib.staticfiles import finders
from django.core.exceptions import ValidationError
from django.db import models
@@ -38,6 +37,8 @@ from pretix.base.models import Event, Item, LoggedModel, Organizer, SubEvent
@deconstructible
class SeatingPlanLayoutValidator:
def __call__(self, value):
import jsonschema
if not isinstance(value, dict):
try:
val = json.loads(value)

View File

@@ -23,7 +23,6 @@ import json
from decimal import Decimal
from typing import Optional
import jsonschema
from django.contrib.staticfiles import finders
from django.core.exceptions import ValidationError
from django.core.validators import MaxValueValidator, MinValueValidator
@@ -298,6 +297,8 @@ def cc_to_vat_prefix(country_code):
@deconstructible
class CustomRulesValidator:
def __call__(self, value):
import jsonschema
if not isinstance(value, dict):
try:
val = json.loads(value)

View File

@@ -47,7 +47,6 @@ from collections import OrderedDict, defaultdict
from functools import partial
from io import BytesIO
import jsonschema
import pypdf
import pypdf.generic
import reportlab.rl_config
@@ -1311,6 +1310,8 @@ def _correct_page_media_box(page: pypdf.PageObject):
@deconstructible
class PdfLayoutValidator:
def __call__(self, value):
import jsonschema
if not isinstance(value, dict):
try:
val = json.loads(value)

View File

@@ -47,7 +47,6 @@ from urllib.parse import urljoin, urlparse
from zoneinfo import ZoneInfo
import requests
from bs4 import BeautifulSoup
from celery import chain
from celery.exceptions import MaxRetriesExceededError
from django.conf import settings
@@ -764,6 +763,8 @@ def render_mail(template, context, placeholder_mode=SafeFormatter.MODE_RICH_TO_P
def replace_images_with_cid_paths(body_html):
from bs4 import BeautifulSoup
if body_html:
email = BeautifulSoup(body_html, "lxml")
cid_images = []

View File

@@ -60,25 +60,23 @@ def _populate_app_cache():
def get_defining_app(o):
# If sentry packed this in a wrapper, unpack that
module = getattr(o, "__module__", None)
if module and "sentry" in module:
if "sentry" in o.__module__:
o = o.__wrapped__
if hasattr(o, "__mocked_app"):
return o.__mocked_app
# Find the Django application this belongs to
searchpath = module or getattr(o.__class__, "__module__", None) or ""
searchpath = o.__module__
# Core modules are always active
if searchpath and any(searchpath.startswith(cm) for cm in settings.CORE_MODULES):
if any(searchpath.startswith(cm) for cm in settings.CORE_MODULES):
return 'CORE'
if not app_cache:
_populate_app_cache()
app = None
while searchpath:
while True:
app = app_cache.get(searchpath)
if "." not in searchpath or app:
break
@@ -159,11 +157,7 @@ class PluginSignal(Generic[T], django.dispatch.Signal):
if not app_cache:
_populate_app_cache()
for receiver in self._sorted_receivers(sender)[0]:
if self._is_receiver_active(sender, receiver):
response = receiver(signal=self, sender=sender, **named)
responses.append((receiver, response))
for receiver in self._sorted_receivers(sender)[1]:
for receiver in self._sorted_receivers(sender):
if self._is_receiver_active(sender, receiver):
response = receiver(signal=self, sender=sender, **named)
responses.append((receiver, response))
@@ -185,11 +179,7 @@ class PluginSignal(Generic[T], django.dispatch.Signal):
if not app_cache:
_populate_app_cache()
for receiver in self._sorted_receivers(sender)[0]:
if self._is_receiver_active(sender, receiver):
named[chain_kwarg_name] = response
response = receiver(signal=self, sender=sender, **named)
for receiver in self._sorted_receivers(sender)[1]:
for receiver in self._sorted_receivers(sender):
if self._is_receiver_active(sender, receiver):
named[chain_kwarg_name] = response
response = receiver(signal=self, sender=sender, **named)
@@ -214,15 +204,7 @@ class PluginSignal(Generic[T], django.dispatch.Signal):
if not app_cache:
_populate_app_cache()
for receiver in self._sorted_receivers(sender)[0]:
if self._is_receiver_active(sender, receiver):
try:
response = receiver(signal=self, sender=sender, **named)
except Exception as err:
responses.append((receiver, err))
else:
responses.append((receiver, response))
for receiver in self._sorted_receivers(sender)[1]:
for receiver in self._sorted_receivers(sender):
if self._is_receiver_active(sender, receiver):
try:
response = receiver(signal=self, sender=sender, **named)
@@ -233,33 +215,16 @@ class PluginSignal(Generic[T], django.dispatch.Signal):
return responses
def _sorted_receivers(self, sender):
orig_list_sync = self._live_receivers(sender)[0]
# todo: _live_receivers changed return value from [] to [], []
orig_list_async = self._live_receivers(sender)[1]
def _receiver_module(receiver):
return getattr(receiver, "__module__", receiver.__class__.__module__)
def _receiver_name(receiver):
return getattr(receiver, "__name__", receiver.__class__.__name__)
sorted_list_sync = sorted(
orig_list_sync,
orig_list = self._live_receivers(sender)
sorted_list = sorted(
orig_list,
key=lambda receiver: (
0 if any(_receiver_module(receiver).startswith(m) for m in settings.CORE_MODULES) else 1,
_receiver_module(receiver),
_receiver_name(receiver),
0 if any(receiver.__module__.startswith(m) for m in settings.CORE_MODULES) else 1,
receiver.__module__,
receiver.__name__,
)
)
sorted_list_async = sorted(
orig_list_async,
key=lambda receiver: (
0 if any(_receiver_module(receiver).startswith(m) for m in settings.CORE_MODULES) else 1,
_receiver_module(receiver),
_receiver_name(receiver),
)
)
return sorted_list_sync, sorted_list_async
return sorted_list
class EventPluginSignal(PluginSignal[Event]):

View File

@@ -93,7 +93,9 @@ def timeline_for_event(event, subevent=None):
description=format_lazy(
'{} ({})',
pgettext_lazy('timeline', 'End of ticket sales'),
pgettext_lazy('timeline', 'automatically because the event is over and no end of presale has been configured') if not ev.presale_end else ""
pgettext_lazy('timeline', 'automatically because the event is over and no end of presale has been configured')
) if not ev.presale_end else (
pgettext_lazy('timeline', 'End of ticket sales')
),
edit_url=ev_edit_url + '#id_presale_end_0'
))

View File

@@ -207,6 +207,7 @@ class EventWizardBasicsForm(I18nModelForm):
'Sample Conference Center\nHeidelberg, Germany'
)
self.fields['slug'].widget.prefix = build_absolute_uri(self.organizer, 'presale:organizer.index')
self.fields['tax_rate']._required = True # Do not render as optional because it is conditionally required
if self.has_subevents:
del self.fields['presale_start']
del self.fields['presale_end']
@@ -1958,6 +1959,13 @@ class EventFooterLinkForm(I18nModelForm):
class Meta:
model = EventFooterLink
fields = ('label', 'url')
widgets = {
"url": forms.URLInput(
attrs={
"placeholder": "https://..."
}
)
}
class BaseEventFooterLinkFormSet(I18nFormSetMixin, forms.BaseInlineFormSet):

View File

@@ -974,7 +974,7 @@ class EventCancelForm(FormPlaceholderMixin, forms.Form):
self._set_field_placeholders('send_subject', ['event_or_subevent', 'refund_amount', 'position_or_address',
'order', 'event'])
self._set_field_placeholders('send_message', ['event_or_subevent', 'refund_amount', 'position_or_address',
'order', 'event'])
'order', 'event'], rich=True)
self.fields['send_waitinglist_subject'] = I18nFormField(
label=_("Subject"),
required=True,
@@ -998,7 +998,7 @@ class EventCancelForm(FormPlaceholderMixin, forms.Form):
))
)
self._set_field_placeholders('send_waitinglist_subject', ['event_or_subevent', 'event'])
self._set_field_placeholders('send_waitinglist_message', ['event_or_subevent', 'event'])
self._set_field_placeholders('send_waitinglist_message', ['event_or_subevent', 'event'], rich=True)
if self.event.has_subevents:
self.fields['subevent'].queryset = self.event.subevents.all()

View File

@@ -1024,6 +1024,13 @@ class OrganizerFooterLinkForm(I18nModelForm):
class Meta:
model = OrganizerFooterLink
fields = ('label', 'url')
widgets = {
"url": forms.URLInput(
attrs={
"placeholder": "https://..."
}
)
}
class BaseOrganizerFooterLinkFormSet(I18nFormSetMixin, forms.BaseInlineFormSet):

View File

@@ -57,6 +57,7 @@ from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from django.views.generic import TemplateView
from django_otp import match_token
from django_otp.plugins.otp_static.models import StaticDevice
from webauthn.helpers import generate_challenge
from pretix.base.auth import get_auth_backends
@@ -538,6 +539,10 @@ class Login2FAView(TemplateView):
break
else:
valid = match_token(self.user, token)
if isinstance(valid, StaticDevice):
self.user.send_security_notice([
_("A recovery code for two-factor authentification was used to log in.")
])
if valid:
logger.info(f"Backend login successful for user {self.user.pk} with 2FA.")

View File

@@ -60,7 +60,6 @@ from pretix.base.models import (
)
from pretix.base.services.quotas import QuotaAvailability
from pretix.base.timeline import timeline_for_event
from pretix.control.forms.event import CommentForm
from pretix.control.signals import (
event_dashboard_widgets, user_dashboard_widgets,
)
@@ -341,6 +340,8 @@ def welcome_wizard_widget(sender, **kwargs):
def event_index(request, organizer, event):
from pretix.control.forms.event import CommentForm
subevent = None
if request.GET.get("subevent", "") != "" and request.event.has_subevents:
i = request.GET.get("subevent", "")

View File

@@ -98,7 +98,6 @@ from pretix.control.views.mailsetup import MailSettingsSetupView
from pretix.control.views.user import RecentAuthenticationRequiredMixin
from pretix.helpers.database import rolledback_transaction
from pretix.multidomain.urlreverse import build_absolute_uri, get_event_domain
from pretix.plugins.stripe.payment import StripeSettingsHolder
from pretix.presale.views.widget import (
version_default as widget_version_default,
)
@@ -1666,6 +1665,8 @@ class QuickSetupView(FormView):
'or take your event live to start selling!'))
if form.cleaned_data.get('payment_stripe__enabled', False):
from pretix.plugins.stripe.payment import StripeSettingsHolder
self.request.session['payment_stripe_oauth_enable'] = True
return redirect(StripeSettingsHolder(self.request.event).get_connect_url(self.request))

View File

@@ -156,7 +156,7 @@ class BaseProcessView(AsyncAction, FormView):
)
)
reader = parse_csv(self.file.file, 1024 * 1024, "replace", charset=charset)
if reader._had_duplicates:
if reader and reader._had_duplicates:
messages.warning(
self.request,
_(

View File

@@ -165,6 +165,9 @@ class UserEmergencyTokenView(AdministratorPermissionRequiredMixin, RecentAuthent
d, __ = StaticDevice.objects.get_or_create(user=self.object, name='emergency')
token = d.token_set.create(token=get_random_string(length=12, allowed_chars='1234567890'))
self.object.log_action('pretix.user.settings.2fa.emergency', user=self.request.user)
self.object.send_security_notice([
_('A two-factor emergency code has been generated by a system administrator.')
])
messages.success(request, _(
'The emergency token for this user is "{token}". It can only be used once. Please make sure to transmit '

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-27 13:57+0000\n"
"PO-Revision-Date: 2025-12-03 23:00+0000\n"
"PO-Revision-Date: 2025-12-05 18:00+0000\n"
"Last-Translator: sandra r <sandrarial@gestiontickets.online>\n"
"Language-Team: Galician <https://translate.pretix.eu/projects/pretix/pretix/"
"gl/>\n"
@@ -721,7 +721,7 @@ msgid_plural ""
msgstr[0] "O teu contrasinal non sexa o mesmo que o teu contrasinal anterior."
msgstr[1] ""
"O teu contrasinal non sexa o mesmo que un dos teus contrasinais anteriores "
"de %(history_length)."
"de %(history_length)s."
#: pretix/base/channels.py:168
msgid "Online shop"
@@ -3329,42 +3329,48 @@ msgid ""
"Upload a valid image. The file you uploaded was either not an image or a "
"corrupted image."
msgstr ""
"Carga unha imaxe válida. O ficheiro que cargaches ou non era unha imaxe ou "
"estaba danado."
#: pretix/base/forms/questions.py:653 pretix/base/forms/questions.py:662
msgid ""
"If you keep this empty, the ticket will be valid starting at the time of "
"purchase."
msgstr ""
"Se o deixas baleiro, o billete será válido a partir do momento da compra."
#: pretix/base/forms/questions.py:709 pretix/base/forms/questions.py:1102
#, fuzzy
msgid "Street and Number"
msgstr "Calle y número"
msgstr "Rúa e Número"
#: pretix/base/forms/questions.py:1166
msgid ""
"Optional, but depending on the country you reside in we might need to charge "
"you additional taxes if you do not enter it."
msgstr ""
"Opcional, pero dependendo do país no que residas, pode que teñamos que "
"cobrarche impostos adicionais se non o introduces."
#: pretix/base/forms/questions.py:1168 pretix/base/forms/questions.py:1174
msgid "If you are registered in Switzerland, you can enter your UID instead."
msgstr ""
"Se estás rexistrado/a en Suíza, podes introducir o teu UID no seu lugar."
#: pretix/base/forms/questions.py:1172
msgid ""
"Optional, but it might be required for you to claim tax benefits on your "
"invoice depending on your and the sellers country of residence."
msgstr ""
"Opcional, pero pode ser necesario para que solicites beneficios fiscais na "
"túa factura dependendo do teu país de residencia e do vendedor."
#: pretix/base/forms/questions.py:1181
#, fuzzy
msgid "No invoice requested"
msgstr "Tarifa de cancelación"
msgstr "Non se solicitou factura"
#: pretix/base/forms/questions.py:1183
msgid "Invoice transmission method"
msgstr ""
msgstr "Método de transmisión de facturas"
#: pretix/base/forms/questions.py:1329
msgid "You need to provide a company name."
@@ -3379,111 +3385,101 @@ msgid ""
"If you enter an invoice address, you also need to select an invoice "
"transmission method."
msgstr ""
"Se introduces un enderezo de facturación, tamén debes seleccionar un método "
"de transmisión da factura."
#: pretix/base/forms/questions.py:1385
#, fuzzy
msgid ""
"The selected transmission type is not available in your country or for your "
"type of address."
msgstr "El producto seleccionado no está activo o no tiene precio fijo."
msgstr ""
"O tipo de transmisión seleccionado non está dispoñible no seu país nin para "
"o seu tipo de enderezo."
#: pretix/base/forms/questions.py:1394
msgid ""
"The selected type of invoice transmission requires a field that is currently "
"not available, please reach out to the organizer."
msgstr ""
"O tipo de transmisión de factura seleccionado require un campo que non está "
"dispoñible actualmente. Ponte en contacto co organizador."
#: pretix/base/forms/questions.py:1398
msgid "This field is required for the selected type of invoice transmission."
msgstr ""
"Este campo é obrigatorio para o tipo de transmisión de factura seleccionado."
#: pretix/base/forms/user.py:54 pretix/control/forms/organizer.py:458
#: pretix/control/forms/users.py:58
#, fuzzy
msgid "Default timezone"
msgstr "Zona horaria predefinida"
msgstr "Fuso horario predeterminado"
#: pretix/base/forms/user.py:55 pretix/control/forms/users.py:59
#, fuzzy
msgid ""
"Only used for views that are not bound to an event. For all event views, the "
"event timezone is used instead."
msgstr ""
"Sólo se utiliza para vistas que no están vinculadas a un evento. Para todas "
"las vistas de eventos, se utiliza la zona horaria de eventos."
"Só se usa para vistas que non están vinculadas a un evento. Para todas as "
"vistas de eventos, úsase o fuso horario do evento."
#: pretix/base/forms/user.py:77
#, fuzzy
#| msgid "Attendee email address"
msgid "Change email address"
msgstr "Correo electrónico do participante"
msgstr "Cambiar enderezo de correo electrónico"
#: pretix/base/forms/user.py:83
msgid "Device name"
msgstr "Nombre do dispositivo"
#: pretix/base/forms/user.py:84
#, fuzzy
msgid "Device type"
msgstr "Tipo de dispositivo"
#: pretix/base/forms/user.py:85
#, fuzzy
msgid "Smartphone with the Authenticator application"
msgstr "Celular con aplicación de autenticación"
msgstr "Teléfono intelixente coa aplicación Authenticator"
#: pretix/base/forms/user.py:86
#, fuzzy
msgid "WebAuthn-compatible hardware token (e.g. Yubikey)"
msgstr "Hardware compatible con token WebAuthn (p. ej. Yubikey)"
msgstr "Token de hardware compatible con WebAuthn (por exemplo, Yubikey)"
#: pretix/base/forms/user.py:92 pretix/presale/forms/customer.py:383
#: pretix/presale/forms/customer.py:456
#, fuzzy
msgid "The current password you entered was not correct."
msgstr "La contraseña actual que ingresó no es correcta."
msgstr "O contrasinal actual que introduciches non era correcto."
#: pretix/base/forms/user.py:95
msgid "Please choose a password different to your current one."
msgstr ""
msgstr "Escolle un contrasinal diferente ao teu actual."
#: pretix/base/forms/user.py:105 pretix/presale/forms/customer.py:392
#: pretix/presale/forms/customer.py:461
#, fuzzy
msgid "Your current password"
msgstr "Su contraseña actual"
msgstr "O teu contrasinal actual"
#: pretix/base/forms/user.py:111 pretix/control/forms/users.py:50
#: pretix/presale/forms/customer.py:397
#, fuzzy
msgid "New password"
msgstr "Nueva contraseña"
msgstr "New password"
#: pretix/base/forms/user.py:117 pretix/control/forms/users.py:54
#, fuzzy
msgid "Repeat new password"
msgstr "Repetir la nueva contraseña"
msgstr "Repita o novo contrasinal"
#: pretix/base/forms/user.py:176 pretix/control/forms/users.py:43
#, fuzzy
msgid ""
"There already is an account associated with this email address. Please "
"choose a different one."
msgstr ""
"Ya existe una cuenta asociada a este correo electrónico. Por favor, escoja "
"otro."
"Xa existe unha conta asociada a este enderezo de correo electrónico. Escolle "
"unha diferente."
#: pretix/base/forms/user.py:179
#, fuzzy
#| msgid "Email address"
msgid "Old email address"
msgstr "Correo electrónico"
msgstr "Enderezo de correo electrónico antigo"
#: pretix/base/forms/user.py:180
#, fuzzy
#| msgid "Email address"
msgid "New email address"
msgstr "Correo electrónico"
msgstr "Novo enderezo de correo electrónico"
#: pretix/base/forms/validators.py:51
msgid ""
@@ -3492,29 +3488,32 @@ msgid ""
"up. Please note: to use literal \"{\" or \"}\", you need to double them as "
"\"{{\" and \"}}\"."
msgstr ""
"Hai un erro coa sintaxe dos marcadores de posición. Comproba que as "
"corchetes de apertura \"{\" e de peche \"}\" dos marcadores de posición "
"coincidan. Ten en conta que para usar \"{\" ou \"}\" literal, debes "
"duplicalos como \"{{\" e \"}}\"."
#: pretix/base/forms/validators.py:72 pretix/control/views/event.py:870
#, fuzzy, python-format
#, python-format
msgid "Invalid placeholder: {%(value)s}"
msgstr "Persona(s) interesada(s) inválida(s): %(value)s"
msgstr "Marcador de posición non válido: {%(value)s}"
#: pretix/base/forms/widgets.py:68
#, fuzzy, python-format
#, python-format
msgid "Sample: %s"
msgstr "Ciudad de ejemplo"
msgstr "Mostra: %s"
#: pretix/base/forms/widgets.py:71
#, python-brace-format
msgid "Available placeholders: {list}"
msgstr ""
msgstr "Marcadores de posición dispoñibles: {list}"
#: pretix/base/forms/widgets.py:214 pretix/base/models/items.py:1655
#: pretix/plugins/checkinlists/exporters.py:757
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_create.html:40
#: pretix/plugins/sendmail/templates/pretixplugins/sendmail/rule_update.html:54
#, fuzzy
msgid "Time"
msgstr "Hora"
msgstr "Tempo"
#: pretix/base/forms/widgets.py:234 pretix/base/forms/widgets.py:239
msgid "Business or institutional customer"
@@ -3527,53 +3526,49 @@ msgstr "Cliente individual"
#: pretix/base/invoicing/email.py:50
msgid "Email invoice directly to accounting department"
msgstr ""
"Enviar factura por correo electrónico directamente ao departamento de "
"contabilidade"
#: pretix/base/invoicing/email.py:51
#, fuzzy
#| msgid "Please enter the same email address twice."
msgid ""
"If not selected, the invoice will be sent to you using the email address "
"listed above."
msgstr "Introduce o mesmo enderezo de correo electrónico dúas veces."
msgstr ""
"Se non se selecciona, a factura enviaraseche usando o enderezo de correo "
"electrónico indicado anteriormente."
#: pretix/base/invoicing/email.py:55
#, fuzzy
#| msgid "Email address verified"
msgid "Email address for invoice"
msgstr "Correo electrónico verificado"
msgstr "Enderezo de correo electrónico para factura"
#: pretix/base/invoicing/email.py:91
#, fuzzy
msgid "PDF via email"
msgstr "Vista previa del correo electrónico"
msgstr "PDF por correo electrónico"
#: pretix/base/invoicing/national.py:37
msgctxt "italian_invoice"
msgid "Italian Exchange System (SdI)"
msgstr ""
msgstr "Sistema de intercambio italiano (SdI)"
#: pretix/base/invoicing/national.py:38
msgctxt "italian_invoice"
msgid "Exchange System (SdI)"
msgstr ""
msgstr "Sistema de intercambio (SdI)"
#: pretix/base/invoicing/national.py:49
#, fuzzy
#| msgid "Gift card code"
msgctxt "italian_invoice"
msgid "Fiscal code"
msgstr "Código da tarxeta de regalo"
msgstr "Código fiscal"
#: pretix/base/invoicing/national.py:53
msgctxt "italian_invoice"
msgid "Address for certified electronic mail"
msgstr ""
msgstr "Enderezo para correo electrónico certificado"
#: pretix/base/invoicing/national.py:57
#, fuzzy
msgctxt "italian_invoice"
msgid "Recipient code"
msgstr "Destinatario"
msgstr "Código do destinatario"
#: pretix/base/invoicing/national.py:81
msgctxt "italian_invoice"
@@ -3583,75 +3578,68 @@ msgid ""
"in accordance with the procedures and terms set forth in No. 89757/2018 of "
"April 30, 2018, issued by the Director of the Revenue Agency."
msgstr ""
"Este documento PDF é unha copia visual da factura e non constitúe unha "
"factura para efectos do IVE. A factura emítese en formato XML, transmitida "
"de acordo cos procedementos e termos establecidos no Regulamento n.º 89757/"
"2018, do 30 de abril de 2018, emitido polo Director da Axencia Tributaria."
#: pretix/base/invoicing/pdf.py:143
#, fuzzy, python-format
#, python-format
msgctxt "invoice"
msgid "Page %d of %d"
msgstr "Página %d de %d"
msgstr "Páxina %d de %d"
#: pretix/base/invoicing/pdf.py:384
#, fuzzy
msgctxt "invoice"
msgid "Classic renderer (pretix 1.0)"
msgstr "Versión clásica (pretix 1.0)"
msgstr "Renderizador clásico (pretix 1.0)"
#: pretix/base/invoicing/pdf.py:428
#, fuzzy
msgctxt "invoice"
msgid "Invoice from"
msgstr "Factura de"
msgstr "Factura dende"
#: pretix/base/invoicing/pdf.py:434
#, fuzzy
msgctxt "invoice"
msgid "Invoice to"
msgstr "Factura para"
msgstr "Factura ata"
#: pretix/base/invoicing/pdf.py:471 pretix/base/invoicing/pdf.py:1222
#, fuzzy
msgctxt "invoice"
msgid "Order code"
msgstr "Código de la orden"
msgstr "Código de pedido"
#: pretix/base/invoicing/pdf.py:480 pretix/base/invoicing/pdf.py:1235
#, fuzzy
msgctxt "invoice"
msgid "Cancellation number"
msgstr "Número de cancelación"
#: pretix/base/invoicing/pdf.py:486 pretix/base/invoicing/pdf.py:1237
#, fuzzy
msgctxt "invoice"
msgid "Original invoice"
msgstr "Factura original"
msgstr "Factura orixinal"
#: pretix/base/invoicing/pdf.py:491 pretix/base/invoicing/pdf.py:1242
#, fuzzy
msgctxt "invoice"
msgid "Invoice number"
msgstr "Número de factura"
#: pretix/base/invoicing/pdf.py:499 pretix/base/invoicing/pdf.py:1257
#, fuzzy
msgctxt "invoice"
msgid "Cancellation date"
msgstr "Fecha de cancelación"
msgstr "Data de cancelación"
#: pretix/base/invoicing/pdf.py:505
#, fuzzy
msgctxt "invoice"
msgid "Original invoice date"
msgstr "Fecha original de la factura"
msgstr "Data orixinal da factura"
#: pretix/base/invoicing/pdf.py:512 pretix/base/invoicing/pdf.py:1259
#, fuzzy
msgctxt "invoice"
msgid "Invoice date"
msgstr "Fecha de la factura"
msgstr "Data da factura"
#: pretix/base/invoicing/pdf.py:528
#, fuzzy
msgctxt "invoice"
msgid "Event"
msgstr "Evento"
@@ -3667,7 +3655,7 @@ msgstr ""
" ata {to_date}"
#: pretix/base/invoicing/pdf.py:609 pretix/base/services/mail.py:512
#, fuzzy, python-brace-format
#, python-brace-format
msgctxt "invoice"
msgid "Invoice {num}"
msgstr "Factura {num}"
@@ -3679,25 +3667,21 @@ msgid "Customer reference: {reference}"
msgstr "Referencia do cliente: {reference}"
#: pretix/base/invoicing/pdf.py:669
#, fuzzy
msgctxt "invoice"
msgid "Customer VAT ID"
msgstr "Cliente VAT ID"
msgstr "CIF do cliente"
#: pretix/base/invoicing/pdf.py:676
#, fuzzy
msgctxt "invoice"
msgid "Beneficiary"
msgstr "Beneficiario"
#: pretix/base/invoicing/pdf.py:709
#, fuzzy
msgctxt "invoice"
msgid "Tax Invoice"
msgstr "Impuesto de la factura"
msgstr "Factura fiscal"
#: pretix/base/invoicing/pdf.py:710
#, fuzzy
msgctxt "invoice"
msgid "Invoice"
msgstr "Factura"
@@ -3706,7 +3690,6 @@ msgstr "Factura"
#: pretix/control/templates/pretixcontrol/order/index.html:272
#: pretix/control/templates/pretixcontrol/order/mail_history.html:70
#: pretix/presale/templates/pretixpresale/event/order.html:244
#, fuzzy
msgctxt "invoice"
msgid "Cancellation"
msgstr "Cancelación"
@@ -3724,110 +3707,97 @@ msgid "Qty"
msgstr "Cant."
#: pretix/base/invoicing/pdf.py:735 pretix/base/invoicing/pdf.py:1039
#, fuzzy
msgctxt "invoice"
msgid "Tax rate"
msgstr "Tasa de impuestos"
msgstr "Tipo impositivo"
#: pretix/base/invoicing/pdf.py:736
#, fuzzy
msgctxt "invoice"
msgid "Net"
msgstr "Neto"
#: pretix/base/invoicing/pdf.py:737
#, fuzzy
msgctxt "invoice"
msgid "Gross"
msgstr "Bruto"
#: pretix/base/invoicing/pdf.py:743
#, fuzzy
msgctxt "invoice"
msgid "Amount"
msgstr "Monto"
msgstr "Cantidade"
#: pretix/base/invoicing/pdf.py:870
#, python-brace-format
msgctxt "invoice"
msgid "Single price: {net_price} net / {gross_price} gross"
msgstr ""
msgstr "Prezo único: {net_price} neto / {gross_price} bruto"
#: pretix/base/invoicing/pdf.py:901
#, fuzzy, python-brace-format
#, python-brace-format
msgctxt "invoice"
msgid "Single price: {price}"
msgstr "Precio original"
msgstr "Prezo único: {price}"
#: pretix/base/invoicing/pdf.py:944 pretix/base/invoicing/pdf.py:949
#, fuzzy
msgctxt "invoice"
msgid "Invoice total"
msgstr "Total de la factura"
msgstr "Total da factura"
#: pretix/base/invoicing/pdf.py:958
#, fuzzy
msgctxt "invoice"
msgid "Received payments"
msgstr "Pagos recibidos"
#: pretix/base/invoicing/pdf.py:963
#, fuzzy
msgctxt "invoice"
msgid "Outstanding payments"
msgstr "Pagos no válidos"
msgstr "Pagos pendentes"
#: pretix/base/invoicing/pdf.py:980
#, fuzzy
msgctxt "invoice"
msgid "Paid by gift card"
msgstr "Tarjeta de crédito"
msgstr "Pago con tarxeta regalo"
#: pretix/base/invoicing/pdf.py:985
#, fuzzy
msgctxt "invoice"
msgid "Remaining amount"
msgstr "Monto pendiente"
msgstr "Cantidade restante"
#: pretix/base/invoicing/pdf.py:1009
#, fuzzy, python-brace-format
#, python-brace-format
msgctxt "invoice"
msgid "Invoice period: {daterange}"
msgstr "Rango de fechas de evento"
msgstr "Período de facturación: {daterange}"
#: pretix/base/invoicing/pdf.py:1040
#, fuzzy
msgctxt "invoice"
msgid "Net value"
msgstr "Valor neto"
#: pretix/base/invoicing/pdf.py:1041
#, fuzzy
msgctxt "invoice"
msgid "Gross value"
msgstr "Valor bruto"
#: pretix/base/invoicing/pdf.py:1042
#, fuzzy
msgctxt "invoice"
msgid "Tax"
msgstr "Impuesto"
msgstr "Imposto"
#: pretix/base/invoicing/pdf.py:1072
#, fuzzy
msgctxt "invoice"
msgid "Included taxes"
msgstr "Impuestos incluidos"
msgstr "Impostos incluídos"
#: pretix/base/invoicing/pdf.py:1100
#, fuzzy, python-brace-format
#, python-brace-format
msgctxt "invoice"
msgid ""
"Using the conversion rate of 1:{rate} as published by the {authority} on "
"{date}, this corresponds to:"
msgstr ""
"Utilizando el tipo de conversión de 1:{rate} publicado por el Banco Central "
"Europeo el {date}, esto corresponde a:"
"Usando a taxa de conversión de 1:{rate} tal e como a publicou {authority} o "
"{date}, isto corresponde a:"
#: pretix/base/invoicing/pdf.py:1115
#, fuzzy, python-brace-format
@@ -3836,33 +3806,34 @@ msgid ""
"Using the conversion rate of 1:{rate} as published by the {authority} on "
"{date}, the invoice total corresponds to {total}."
msgstr ""
"Utilizando el tipo de conversión de 1:{rate} publicado por el Banco Central "
"Europeo el {date}, el total de la factura corresponde a {total}."
"Usando a taxa de conversión de 1:{rate} publicada pola {authority} o {date}, "
"o total da factura corresponde a {total}."
#: pretix/base/invoicing/pdf.py:1129
msgid "Default invoice renderer (European-style letter)"
msgstr ""
msgstr "Renderizador de facturas predeterminado (carta de estilo europeo)"
#: pretix/base/invoicing/pdf.py:1218
#, fuzzy
msgctxt "invoice"
msgid "(Please quote at all times.)"
msgstr "Por favor, seleccione una cuota."
msgstr "(Por favor, cite en todo momento.)"
#: pretix/base/invoicing/pdf.py:1265
msgid "Simplified invoice renderer"
msgstr ""
msgstr "Renderizador de facturas simplificado"
#: pretix/base/invoicing/pdf.py:1284
#, fuzzy, python-brace-format
msgctxt "invoice"
msgid "Event date: {date_range}"
msgstr "Rango de fechas de evento"
msgstr "Data do evento: {date_range}"
#: pretix/base/invoicing/peppol.py:128
msgid ""
"A Peppol participant ID always starts with a prefix, followed by a colon (:)."
msgstr ""
"Un ID de participante de Peppol sempre comeza cun prefixo, seguido de dous "
"puntos (:)."
#: pretix/base/invoicing/peppol.py:132
#, python-format
@@ -3870,6 +3841,8 @@ msgid ""
"The Peppol participant ID prefix %(number)s is not known to our system. "
"Please reach out to us if you are sure this ID is correct."
msgstr ""
"O noso sistema descoñece o prefixo do ID de participante de Peppol %(number)"
"s. Ponte en contacto connosco se estás seguro de que este ID é correcto."
#: pretix/base/invoicing/peppol.py:136
#, python-format
@@ -3877,17 +3850,18 @@ msgid ""
"The Peppol participant ID does not match the validation rules for the prefix "
"%(number)s. Please reach out to us if you are sure this ID is correct."
msgstr ""
"O ID de participante de Peppol non coincide coas regras de validación para o "
"prefixo %(number)s. Ponte en contacto connosco se estás seguro de que este "
"ID é correcto."
#: pretix/base/invoicing/peppol.py:156
msgid "Peppol participant ID"
msgstr ""
msgstr "Identificación de participante de Peppol"
#: pretix/base/invoicing/peppol.py:170
#, fuzzy
#| msgid "Gift card code"
msgctxt "peppol_invoice"
msgid "Visual copy"
msgstr "Código da tarxeta de regalo"
msgstr "Copia visual"
#: pretix/base/invoicing/peppol.py:175
msgctxt "peppol_invoice"
@@ -3896,27 +3870,30 @@ msgid ""
"invoice for VAT purposes. The original invoice is issued in XML format and "
"transmitted through the Peppol network."
msgstr ""
"Este documento PDF é unha copia visual da factura e non constitúe unha "
"factura para efectos do IVE. A factura orixinal emítese en formato XML e "
"transmítese a través da rede Peppol."
#: pretix/base/logentrytype_registry.py:43
msgid ""
"The relevant plugin is currently not active. To activate it, click here to "
"go to the plugin settings."
msgstr ""
"O plugin relevante non está activo actualmente. Para activalo, fai clic aquí "
"para ir á configuración do plugin."
#: pretix/base/logentrytype_registry.py:53
#, fuzzy
msgid "The relevant plugin is currently not active."
msgstr "La taquilla seleccionada no está disponible en este momento."
msgstr "O plugin relevante non está activo actualmente."
#: pretix/base/logentrytypes.py:49
#, fuzzy
msgid "(deleted)"
msgstr "Eliminar"
msgstr "(eliminado)"
#: pretix/base/logentrytypes.py:78
#, fuzzy, python-brace-format
#, python-brace-format
msgid "Order {val}"
msgstr "Orden {val}"
msgstr "Orde {val}"
#: pretix/base/logentrytypes.py:90
#, fuzzy, python-brace-format

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-27 13:57+0000\n"
"PO-Revision-Date: 2025-11-26 17:00+0000\n"
"PO-Revision-Date: 2025-12-05 18:00+0000\n"
"Last-Translator: Yasunobu YesNo Kawaguchi <kawaguti@gmail.com>\n"
"Language-Team: Japanese <https://translate.pretix.eu/projects/pretix/pretix/"
"ja/>\n"
@@ -2149,7 +2149,7 @@ msgstr "クライアントID"
#: pretix/base/exporters/items.py:91 pretix/base/models/items.py:667
#: pretix/base/models/items.py:1168
msgid "Original price"
msgstr "元の価格"
msgstr "通常価格"
#: pretix/base/exporters/items.py:92 pretix/base/models/items.py:684
msgid "This product is a gift card"
@@ -22741,9 +22741,8 @@ msgid ""
"This position has been created with a voucher with a limited budget. If you "
"change the price or item, the discount will still be calculated from the "
"original price at the time of purchase."
msgstr ""
"このポジションは限られた予算のバウチャーで作成されました。価格やアイテムを変"
"更しても、割引は購入時の元の価格から計算されます。"
msgstr "このポジションは限られた予算のバウチャーで作成されました。価格やアイテムを変"
"更しても、割引は購入時の通常価格から計算されます。"
#: pretix/control/templates/pretixcontrol/order/change.html:101
#: pretix/control/templates/pretixcontrol/order/change.html:413
@@ -33770,7 +33769,7 @@ msgstr "バリエーションを表示する"
#: pretix/presale/templates/pretixpresale/event/voucher.html:147
#: pretix/presale/templates/pretixpresale/event/voucher.html:304
msgid "Original price:"
msgstr "元の価格:"
msgstr "通常価格:"
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:136
#: pretix/presale/templates/pretixpresale/event/fragment_addon_choice.html:278

View File

@@ -7,16 +7,16 @@ msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-27 13:57+0000\n"
"PO-Revision-Date: 2025-10-26 18:00+0000\n"
"Last-Translator: Jan Van Haver <jan.van.haver@gmail.com>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/"
">\n"
"PO-Revision-Date: 2025-12-08 07:00+0000\n"
"Last-Translator: Ruud Hendrickx <ruud@leckxicon.eu>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix/nl/>"
"\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.14\n"
"X-Generator: Weblate 5.14.3\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -44,7 +44,7 @@ msgstr "Catalaans"
#: pretix/_base_settings.py:93
msgid "Chinese (simplified)"
msgstr "Chinees (versimpeld)"
msgstr "Chinees (vereenvoudigd)"
#: pretix/_base_settings.py:94
msgid "Chinese (traditional)"

View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-27 13:57+0000\n"
"PO-Revision-Date: 2024-02-13 16:00+0000\n"
"Last-Translator: Wessel Stam <info@wesselstam.nl>\n"
"PO-Revision-Date: 2025-12-08 07:00+0000\n"
"Last-Translator: Ruud Hendrickx <ruud@leckxicon.eu>\n"
"Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/"
"pretix/nl_Informal/>\n"
"Language: nl_Informal\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.3.1\n"
"X-Generator: Weblate 5.14.3\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -37,15 +37,15 @@ msgstr "Arabisch"
#: pretix/_base_settings.py:91
msgid "Basque"
msgstr ""
msgstr "Baskisch"
#: pretix/_base_settings.py:92
msgid "Catalan"
msgstr ""
msgstr "Catalaans"
#: pretix/_base_settings.py:93
msgid "Chinese (simplified)"
msgstr "Chinees (versimpeld)"
msgstr "Chinees (vereenvoudigd)"
#: pretix/_base_settings.py:94
msgid "Chinese (traditional)"
@@ -57,7 +57,7 @@ msgstr "Tsjechisch"
#: pretix/_base_settings.py:96
msgid "Croatian"
msgstr ""
msgstr "Kroatisch"
#: pretix/_base_settings.py:97
msgid "Danish"
@@ -89,7 +89,7 @@ msgstr "Grieks"
#: pretix/_base_settings.py:104
msgid "Hebrew"
msgstr ""
msgstr "Hebreeuws"
#: pretix/_base_settings.py:105
msgid "Indonesian"
@@ -101,7 +101,7 @@ msgstr "Italiaans"
#: pretix/_base_settings.py:107
msgid "Japanese"
msgstr ""
msgstr "Japans"
#: pretix/_base_settings.py:108
msgid "Latvian"
@@ -133,11 +133,11 @@ msgstr "Russisch"
#: pretix/_base_settings.py:115
msgid "Slovak"
msgstr ""
msgstr "Slowaaks"
#: pretix/_base_settings.py:116
msgid "Swedish"
msgstr ""
msgstr "Zweeds"
#: pretix/_base_settings.py:117
msgid "Spanish"
@@ -145,7 +145,7 @@ msgstr "Spaans"
#: pretix/_base_settings.py:118
msgid "Spanish (Latin America)"
msgstr ""
msgstr "Spaans (Latijns-Amerika)"
#: pretix/_base_settings.py:119
msgid "Turkish"
@@ -261,7 +261,7 @@ msgstr ""
#: pretix/api/serializers/event.py:234 pretix/api/serializers/event.py:554
#, python-brace-format
msgid "Meta data property '{name}' does not exist."
msgstr "Metadataeigenschap '{name}' bestaat niet."
msgstr "Metadata-eigenschap '{name}' bestaat niet."
#: pretix/api/serializers/event.py:237 pretix/api/serializers/event.py:557
#, python-brace-format
@@ -32970,7 +32970,7 @@ msgstr ""
#: pretix/plugins/reports/exporters.py:257
msgctxt "export_category"
msgid "Analysis"
msgstr ""
msgstr "Analyse"
#: pretix/plugins/reports/accountingreport.py:83
#, fuzzy

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-27 13:57+0000\n"
"PO-Revision-Date: 2025-09-10 05:00+0000\n"
"PO-Revision-Date: 2025-12-11 01:00+0000\n"
"Last-Translator: Renne Rocha <renne@rocha.dev.br>\n"
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
"pretix/pretix/pt_BR/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.13.2\n"
"X-Generator: Weblate 5.14.3\n"
#: pretix/_base_settings.py:87
msgid "English"
@@ -253,9 +253,8 @@ msgid ""
"Events cannot be created as 'live'. Quotas and payment must be added to the "
"event before sales can go live."
msgstr ""
"Os eventos não podem ser criados como 'ativo'. As cotas e métodos de "
"pagamento devem ser adicionados ao evento antes que as vendas possam ser "
"iniciadas."
"Eventos não podem ser criados como 'ativo'. Cotas e métodos de pagamento "
"devem ser adicionados ao evento antes que as vendas se iniciem."
#: pretix/api/serializers/event.py:234 pretix/api/serializers/event.py:554
#, python-brace-format
@@ -358,7 +357,8 @@ msgstr ""
#: pretix/api/serializers/item.py:587 pretix/control/forms/item.py:177
msgid "Question cannot depend on a question asked during check-in."
msgstr "A pergunta não pode depender de uma pergunta feita durante o check-in."
msgstr ""
"A pergunta não pode depender de outra pergunta feita durante o check-in."
#: pretix/api/serializers/item.py:592 pretix/control/forms/item.py:182
msgid "Circular dependency between questions detected."
@@ -816,28 +816,22 @@ msgstr ""
"confirme primeiro o endereço de email na sua conta."
#: pretix/base/datasync/datasync.py:263
#, fuzzy, python-brace-format
#| msgid ""
#| "Field \"{field_name}\" is not valid for {available_inputs}. Please check "
#| "your {provider_name} settings."
#, python-brace-format
msgid ""
"Field \"{field_name}\" does not exist. Please check your {provider_name} "
"settings."
msgstr ""
"O campo \"{field_name}\" não é válido para {available_inputs}. Verifique as "
"configurações de {provider_name}."
"O campo \"{field_name}\" não existe. Por favor, verifique as configurações "
"de {provider_name}."
#: pretix/base/datasync/datasync.py:270
#, fuzzy, python-brace-format
#| msgid ""
#| "Field \"{field_name}\" is not valid for {available_inputs}. Please check "
#| "your {provider_name} settings."
#, python-brace-format
msgid ""
"Field \"{field_name}\" requires {required_input}, but only got "
"{available_inputs}. Please check your {provider_name} settings."
msgstr ""
"O campo \"{field_name}\" não é válido para {available_inputs}. Verifique as "
"configurações de {provider_name}."
"Campo \"{field_name}\" exige {required_input}, mas apenas {available_inputs} "
"foram fornecidas. Por favor, verifique as configurações de {provider_name}."
#: pretix/base/datasync/datasync.py:281
#, python-brace-format
@@ -2137,7 +2131,7 @@ msgstr "Comprar este produto requer aprovação"
#: pretix/base/exporters/items.py:85 pretix/base/models/items.py:627
msgid "Only sell this product as part of a bundle"
msgstr "Disponível apenas como parte de um pacote"
msgstr "Venda este produto apenas como parte de um pacote"
#: pretix/base/exporters/items.py:86 pretix/base/models/items.py:634
msgid "Allow product to be canceled or changed"
@@ -2839,7 +2833,7 @@ msgstr "Código de Status"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/import_assign.html:25
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:13
msgid "Amount"
msgstr "Valor"
msgstr "Quantidade"
#: pretix/base/exporters/orderlist.py:1098
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:102
@@ -3286,10 +3280,8 @@ msgid "Repeat password"
msgstr "Repita a senha"
#: pretix/base/forms/auth.py:220 pretix/base/forms/user.py:99
#, fuzzy
#| msgid "Email address"
msgid "Your email address"
msgstr "Endereço de email"
msgstr "Seu endereço de e-mail"
#: pretix/base/forms/auth.py:327 pretix/control/forms/orders.py:1041
#: pretix/control/templates/pretixcontrol/shredder/download.html:53
@@ -3400,6 +3392,8 @@ msgid ""
"If you enter an invoice address, you also need to select an invoice "
"transmission method."
msgstr ""
"Se você informar um endereço para a fatura, você também deverá selecionar um "
"método para transmissão da fatura."
#: pretix/base/forms/questions.py:1385
msgid ""
@@ -3414,6 +3408,8 @@ msgid ""
"The selected type of invoice transmission requires a field that is currently "
"not available, please reach out to the organizer."
msgstr ""
"O tipo de transmissão de fatura selecionado exige um campo que não está "
"disponível atualmente. Por favor, entre em contato com a organização."
#: pretix/base/forms/questions.py:1398
msgid "This field is required for the selected type of invoice transmission."
@@ -3433,10 +3429,8 @@ msgstr ""
"as exibições de eventos, o fuso horário do evento é usado."
#: pretix/base/forms/user.py:77
#, fuzzy
#| msgid "Attendee email address"
msgid "Change email address"
msgstr "Email do participante"
msgstr "Alterar endereço de e-mail"
#: pretix/base/forms/user.py:83
msgid "Device name"
@@ -3486,16 +3480,12 @@ msgstr ""
"um diferente."
#: pretix/base/forms/user.py:179
#, fuzzy
#| msgid "Email address"
msgid "Old email address"
msgstr "Endereço de email"
msgstr "Endereço de e-mail antigo"
#: pretix/base/forms/user.py:180
#, fuzzy
#| msgid "Email address"
msgid "New email address"
msgstr "Endereço de email"
msgstr "Endereço de e-mail novo"
#: pretix/base/forms/validators.py:51
msgid ""
@@ -3540,22 +3530,17 @@ msgid "Individual customer"
msgstr "Cliente pessoa física"
#: pretix/base/invoicing/email.py:50
#, fuzzy
#| msgid ""
#| "To send the invoice directly to your accounting department, please enter "
#| "their email address:"
msgid "Email invoice directly to accounting department"
msgstr ""
"Para enviar a fatura diretamente ao seu departamento de contabilidade, "
"insira o endereço de e-mail:"
"Enviar e-mail com a fatura diretamente para departamento de contabilidade"
#: pretix/base/invoicing/email.py:51
#, fuzzy
#| msgid "The invoice was sent to the designated email address."
msgid ""
"If not selected, the invoice will be sent to you using the email address "
"listed above."
msgstr "A fatura foi enviada para o endereço de e-mail designado."
msgstr ""
"Se não selecionado, a fatura será enviada para o endereço de e-mail listado "
"a seguir."
#: pretix/base/invoicing/email.py:55
msgid "Email address for invoice"
@@ -3778,12 +3763,10 @@ msgid "Remaining amount"
msgstr "Valor restante"
#: pretix/base/invoicing/pdf.py:1009
#, fuzzy, python-brace-format
#| msgctxt "invoice"
#| msgid "Event date: {date_range}"
#, python-brace-format
msgctxt "invoice"
msgid "Invoice period: {daterange}"
msgstr "Data do evento: {date_range}"
msgstr "Período da fatura: {daterange}"
#: pretix/base/invoicing/pdf.py:1040
msgctxt "invoice"
@@ -3868,12 +3851,9 @@ msgid "Peppol participant ID"
msgstr ""
#: pretix/base/invoicing/peppol.py:170
#, fuzzy
#| msgctxt "italian_invoice"
#| msgid "Fiscal code"
msgctxt "peppol_invoice"
msgid "Visual copy"
msgstr "Código fiscal"
msgstr "Cópia visual"
#: pretix/base/invoicing/peppol.py:175
msgctxt "peppol_invoice"
@@ -4357,10 +4337,8 @@ msgid ""
msgstr ""
#: pretix/base/models/auth.py:392
#, fuzzy
#| msgid "Confirmation code"
msgid "pretix confirmation code"
msgstr "Código de confirmação"
msgstr "código de confirmação do pretix"
#: pretix/base/models/auth.py:435
#: pretix/control/templates/pretixcontrol/auth/forgot.html:7
@@ -4862,11 +4840,11 @@ msgid ""
"you can also choose to use a random value. This will be used in URLs, order "
"codes, invoice numbers, and bank transfer references."
msgstr ""
"Deve ser curts, conter apenas letras minúsculas, números, pontos e traços, e "
"ser exclusiva entre seus eventos. Recomendamos algum tipo de abreviação ou "
"uma data com menos de 10 caracteres que sejam facilmente lembradas, mas você "
"também pode usar um valor aleatório. Esta informação será usada em URLs, "
"códigos de pedido, números de fatura e referências de transferência bancária."
"Deve conter apenas letras minúsculas, números, pontos e traços, sendo "
"exclusiva para suas eventos. Recomendamos uma abreviação ou data com menos "
"de 10 caracteres e que seja facilmente lembrada, mas você também pode usar "
"um valor aleatório. Esta informação será usada em URLs, códigos de pedido, "
"número de faturas e referências de transações bancárias."
#: pretix/base/models/event.py:607 pretix/base/models/organizer.py:89
msgid "The slug may only contain letters, numbers, dots and dashes."
@@ -5394,24 +5372,16 @@ msgstr ""
"não tiver variações, este preço será usado."
#: pretix/base/models/items.py:506
#, fuzzy
#| msgid ""
#| "If this option is active, your users can choose the price themselves. The "
#| "price configured above is then interpreted as the minimum price a user "
#| "has to enter. You could use this e.g. to collect additional donations for "
#| "your event. This is currently not supported for products that are bought "
#| "as an add-on to other products."
msgid ""
"If this option is active, your users can choose the price themselves. The "
"price configured above is then interpreted as the minimum price a user has "
"to enter. You could use this e.g. to collect additional donations for your "
"event."
msgstr ""
"Se esta opção estiver ativa, seus usuários podem escolher o próprio preço. O "
"preço configurado acima é então interpretado como o preço mínimo que um "
"usuário deve inserir. Você pode usar isso, por exemplo, para coletar doações "
"adicionais para o seu evento. No momento, isto não é suportado por produtos "
"comprados como um complemento de outros produtos."
"Se esta opção está selecionada, os usuários poderão pagar o preço que "
"desejarem. O preço padrão acima será interpretado como o preço mínimo que o "
"usuário deverá pagar. Você pode usar esta opção, por exemplo, para coletar "
"doações adicionais para o seu evento."
#: pretix/base/models/items.py:511 pretix/base/models/items.py:1175
msgid "Suggested price"
@@ -6298,9 +6268,6 @@ msgstr ""
"insira um valor possível por linha."
#: pretix/base/models/items.py:2310
#, fuzzy
#| msgctxt "timeframe"
#| msgid "Start"
msgid "Start"
msgstr "Início"
@@ -7912,10 +7879,8 @@ msgid "123.45 EUR"
msgstr "123.45 BRL"
#: pretix/base/pdf.py:166
#, fuzzy
#| msgid "Price including add-ons"
msgid "Price including bundled products"
msgstr "Preço incluindo complementos"
msgstr "Preços incluindo produtos empacotados"
#: pretix/base/pdf.py:175
#, fuzzy
@@ -9878,10 +9843,8 @@ msgid "Require a phone number per order"
msgstr "Exigir um número de telefone por pedido"
#: pretix/base/settings.py:482
#, fuzzy
#| msgid "including all taxes"
msgid "Rounding of taxes"
msgstr "incluindo todos os impostos"
msgstr "Arredondamento dos impostos"
#: pretix/base/settings.py:486
msgid ""
@@ -10424,18 +10387,12 @@ msgid "Automatic, but prefer invoice date over event date"
msgstr ""
#: pretix/base/settings.py:1142 pretix/base/settings.py:1153
#, fuzzy
#| msgctxt "invoice"
#| msgid "Invoice date"
msgid "Invoice date"
msgstr "Data da fatura"
#: pretix/base/settings.py:1146
#, fuzzy
#| msgctxt "subevent"
#| msgid "Date ordering"
msgid "Date of service"
msgstr "Ordenação de datas"
msgstr "Data do serviço"
#: pretix/base/settings.py:1155
msgid ""
@@ -11299,8 +11256,8 @@ msgstr "Endereço de contato"
#: pretix/base/settings.py:2161 pretix/control/forms/event.py:1824
msgid "We'll show this publicly to allow attendees to contact you."
msgstr ""
"Mostraremos isso publicamente para permitir que os participantes entrem em "
"contato com você."
"Será exibido publicamente para que participantes possam entrar em contato "
"com você."
#: pretix/base/settings.py:2169 pretix/control/forms/event.py:1816
msgid "Imprint URL"
@@ -12166,17 +12123,7 @@ msgid "Invoice {invoice_number}"
msgstr "Fatura {invoice_number}"
#: pretix/base/settings.py:2789
#, fuzzy, python-brace-format
#| msgid ""
#| "Hello,\n"
#| "\n"
#| "somebody requested a list of your orders for {event}.\n"
#| "The list is as follows:\n"
#| "\n"
#| "{orders}\n"
#| "\n"
#| "Best regards, \n"
#| "Your {event} team"
#, python-brace-format
msgid ""
"Hello,\n"
"\n"
@@ -12189,12 +12136,12 @@ msgid ""
msgstr ""
"Olá,\n"
"\n"
"Segue anexo uma nova fatura para o pedido {code} para {evento} . Este pedido "
"foi feito por {order_email}.\n"
"Em anexo você encontrará uma nova fatura para o pedido {code} para {event}. "
"Este pedido foi feito por {order_email}.\n"
"\n"
"Atenciosamente, \n"
"\n"
"Equipe organizadora de {event}"
"Organização {event}"
#: pretix/base/settings.py:2807 pretix/base/settings.py:2823
#, python-brace-format
@@ -13256,13 +13203,13 @@ msgid "Contact:"
msgstr "Contato:"
#: pretix/base/templates/pretixbase/email/order_details.html:54
#, fuzzy, python-format
#| msgid ""
#| "You are receiving this email because you placed an order for {event}."
#, python-format
msgid ""
"You are receiving this email because you placed an order for "
"<strong>%(event)s</strong>."
msgstr "Você está recebendo este email porque fez um pedido para {event}."
msgstr ""
"Você está recebendo este email por ter realizado um pedido para <strong>%"
"(event)s</strong>."
#: pretix/base/templates/pretixbase/email/order_details.html:93
#: pretix/control/templates/pretixcontrol/organizers/customer.html:23
@@ -13937,7 +13884,7 @@ msgstr "Padrão ({value})"
#: pretix/control/forms/event.py:380
msgid "The currency cannot be changed because orders already exist."
msgstr ""
msgstr "A moeda não pode ser alterada pois já foram realizados pedidos."
#: pretix/control/forms/event.py:391 pretix/control/forms/event.py:404
msgid "Domain"
@@ -14023,21 +13970,16 @@ msgstr ""
"que o cartão-presente é emitido."
#: pretix/control/forms/event.py:813
#, fuzzy
#| msgid "including all taxes"
msgid "Prices including tax"
msgstr "incluindo todos os impostos"
msgstr "Preços incluindo impostos"
#: pretix/control/forms/event.py:814
msgid "Recommended if you sell tickets at least partly to consumers."
msgstr ""
#: pretix/control/forms/event.py:818
#, fuzzy
#| msgctxt "reporting_timeframe"
#| msgid "All future (excluding today)"
msgid "Prices excluding tax"
msgstr "Todos os futuros (excluindo hoje)"
msgstr "Preços excluindo impostos"
#: pretix/control/forms/event.py:819
msgid "Recommended only if you sell tickets primarily to business customers."
@@ -17401,19 +17343,14 @@ msgid "Your account has been disabled."
msgstr "Sua conta foi desativada."
#: pretix/control/logdisplay.py:672
#, fuzzy, python-brace-format
#| msgid ""
#| "The email address has been changed from \"{old_email}\" to \"{new_email}"
#| "\"."
#, python-brace-format
msgid "Your email address has been changed from {old_email} to {email}."
msgstr ""
"O endereço de e-mail foi alterado de \"{old_email}\" para \"{new_email}\"."
msgstr "Seu endereço de email foi modificado de {old_email} para {email}."
#: pretix/control/logdisplay.py:673
#, fuzzy, python-brace-format
#| msgid "Your email address has been updated."
#, python-brace-format
msgid "Your email address {email} has been confirmed."
msgstr "Seu endereço de email foi atualizado."
msgstr "Seu endereço de e-mail {email} foi confirmado."
#: pretix/control/logdisplay.py:685
#, python-brace-format
@@ -19690,6 +19627,20 @@ msgid ""
"Best regards,\n"
"Your pretix team\n"
msgstr ""
"Olá,\n"
"\n"
"%(reason)s\n"
"\n"
" %(code)s\n"
"\n"
"Por favor, nunca forneça este código para outra pessoa. Nosso time de "
"suporte nunca irá solicitar este código.\n"
"\n"
"Se você não solicitou este código, por favor entre em contato conosco "
"imediatamente.\n"
"\n"
"Atenciosamente,\n"
"Time pretix\n"
#: pretix/control/templates/pretixcontrol/email/email_setup.txt:1
#, python-format
@@ -21314,10 +21265,8 @@ msgid "with custom rules"
msgstr "Regras personalizadas"
#: pretix/control/templates/pretixcontrol/event/tax.html:110
#, fuzzy
#| msgid "Base settings"
msgid "Tax settings"
msgstr "Configurações base"
msgstr "Configurações de impostos"
#: pretix/control/templates/pretixcontrol/event/tax_delete.html:4
#: pretix/control/templates/pretixcontrol/event/tax_delete.html:6
@@ -21980,6 +21929,9 @@ msgid ""
"your event. By default, we will only offer ticket downloads for these "
"products."
msgstr ""
"Cada compra deste produto representa uma pessoa que terá permissão de entrar "
"no seu evento. Por padrão, só oferecemos o download de ingressos para estes "
"produtos."
#: pretix/control/templates/pretixcontrol/item/create.html:33
#: pretix/control/templates/pretixcontrol/item/index.html:41
@@ -26144,7 +26096,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/shredder/download.html:29
msgid "Download data"
msgstr ""
msgstr "Baixar dados"
#: pretix/control/templates/pretixcontrol/shredder/download.html:34
msgid "Step 2: Confirm deletion"
@@ -26475,7 +26427,7 @@ msgstr "Adicionar um dispositivo de autenticação de dois fatores"
#: pretix/control/templates/pretixcontrol/user/2fa_confirm_totp.html:8
msgid "To set up this device, please follow the following steps:"
msgstr ""
msgstr "Para configurar este dispositivo, por favor siga os passos a seguir:"
#: pretix/control/templates/pretixcontrol/user/2fa_confirm_totp.html:12
msgid "Download the Google Authenticator application to your phone:"
@@ -26901,11 +26853,11 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:6
msgid "Session notes"
msgstr ""
msgstr "Notas de sessão"
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:17
msgid "Audit log"
msgstr ""
msgstr "Log de auditoria"
#: pretix/control/templates/pretixcontrol/user/staff_session_edit.html:30
msgid "Method"
@@ -27949,7 +27901,7 @@ msgstr ""
#: pretix/control/views/item.py:237
msgid "The selected category has been deleted."
msgstr ""
msgstr "A categoria selecionada foi excluída"
#: pretix/control/views/item.py:322
msgid "The new category has been created."
@@ -29874,7 +29826,7 @@ msgstr ""
#: pretix/plugins/banktransfer/payment.py:239
msgid "Please fill out your bank account details."
msgstr ""
msgstr "Por favor, preencha os detalhes da sua conta bancária."
#: pretix/plugins/banktransfer/payment.py:243
msgid "Please enter your bank account details."
@@ -30175,7 +30127,7 @@ msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/pending.html:122
msgid "Scan the QR code with your banking app"
msgstr ""
msgstr "Escanear o QR Code com o seu aplicativo bancário"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:5
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/refund_export.html:7
@@ -30746,6 +30698,8 @@ msgid ""
"We're waiting for an answer from PayPal regarding your payment. Please "
"contact us, if this takes more than a few hours."
msgstr ""
"Estamos aguardando por informações do PayPal referentes ao seu pagamento. "
"Por favor, entre em contato conosco se isso demorar mais que algumas horas."
#: pretix/plugins/paypal/templates/pretixplugins/paypal/redirect.html:17
#: pretix/plugins/paypal2/templates/pretixplugins/paypal2/redirect.html:17
@@ -33370,19 +33324,17 @@ msgstr "Organizador: {organizer}"
#: pretix/presale/ical.py:139
#, python-brace-format
msgid "{event} - {item}"
msgstr ""
msgstr "{event} - {item}"
#: pretix/presale/ical.py:147
#, fuzzy, python-brace-format
#| msgid "Start date"
#, python-brace-format
msgid "Start: {datetime}"
msgstr "Data inicial"
msgstr "Início: {datetime}"
#: pretix/presale/ical.py:150
#, fuzzy, python-brace-format
#| msgid "Admission: {datetime}"
#, python-brace-format
msgid "End: {datetime}"
msgstr "Admissão: {datetime}"
msgstr "Término: {datetime}"
#: pretix/presale/templates/pretixpresale/base.html:44
#, fuzzy
@@ -33774,12 +33726,11 @@ msgstr "Selecione como deseja pagar o saldo restante:"
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:82
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:45
#, fuzzy, python-format
#| msgid "%(num)s available"
#, python-format
msgid "(%(count)s available)"
msgid_plural "(%(count)s available)"
msgstr[0] "%(num)s disponíveis"
msgstr[1] "%(num)s disponíveis"
msgstr[0] "(%(count)s disponível)"
msgstr[1] "(%(count)s disponíveis)"
#: pretix/presale/templates/pretixpresale/event/checkout_payment.html:101
msgid "This sales channel does not provide support for test mode."
@@ -34558,13 +34509,11 @@ msgstr "Mostrar imagem em tamanho real de %(item)s"
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:131
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:288
#, fuzzy, python-format
#| msgid "%(count)s event"
#| msgid_plural "%(count)s events"
#, python-format
msgid "%(amount)s× in your cart"
msgid_plural "%(amount)s× in your cart"
msgstr[0] "%(count)s evento"
msgstr[1] "%(count)s events"
msgstr[0] "%(amount)s× no seu carrinho"
msgstr[1] "%(amount)s× no seu carrinho"
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:209
#: pretix/presale/templates/pretixpresale/event/fragment_product_list.html:374
@@ -35632,10 +35581,8 @@ msgid "The following gift cards are available in your customer account:"
msgstr ""
#: pretix/presale/templates/pretixpresale/giftcard/checkout.html:24
#, fuzzy
#| msgid "Issued gift cards"
msgid "Use gift card"
msgstr "Cartões-presente emitidos"
msgstr "Usar cartão-presente"
#: pretix/presale/templates/pretixpresale/giftcard/checkout_confirm.html:4
#, python-format
@@ -35652,7 +35599,7 @@ msgid ""
"This is a self-hosted installation of <a %(a_attr)s>pretix, your free and "
"open source ticket sales software</a>."
msgstr ""
"Está é uma instalação self-hosted do <a %(a_attr)s>pretix, seu aplicativo "
"Esta é uma instalação auto-hospedada do <a %(a_attr)s>pretix, seu aplicativo "
"livre e de código aberto para venda de ingressos.</a>."
#: pretix/presale/templates/pretixpresale/index.html:15
@@ -35748,22 +35695,18 @@ msgid "Issued on %(date)s"
msgstr "Leitura negada: %(date)s"
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:38
#, fuzzy, python-format
#| msgid "Expired since"
#, python-format
msgid "Expired since %(date)s"
msgstr "Expirado desde"
msgstr "Expirado desde %(date)s"
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:46
#, fuzzy, python-format
#| msgid "Valid until %(datetime)s"
#, python-format
msgid "Valid until %(date)s"
msgstr "Válido até %(datetime)s"
msgstr "Válido até %(date)s"
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:66
#, fuzzy
#| msgid "Remaining balance"
msgid "Remaining value:"
msgstr "Saldo restante"
msgstr "Valor restante:"
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:76
#, fuzzy
@@ -36287,10 +36230,8 @@ msgid "The selected date does not exist in this event series."
msgstr "A data selecionada não existe nesta série de eventos."
#: pretix/presale/views/widget.py:412
#, fuzzy
#| msgid "The selected seat \"{seat}\" is not available."
msgid "The selected date is not available."
msgstr "O assento selecionado \"{seat}\" não está disponível."
msgstr "A data selecionada não está disponível."
#: pretix/presale/views/widget.py:476
#, python-format

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 10:37+0000\n"
"PO-Revision-Date: 2025-08-28 13:43+0000\n"
"PO-Revision-Date: 2025-12-09 00:47+0000\n"
"Last-Translator: Renne Rocha <renne@rocha.dev.br>\n"
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
"pretix/pretix-js/pt_BR/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.13\n"
"X-Generator: Weblate 5.14.3\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -566,11 +566,11 @@ msgstr "ausente"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:289
msgid "Error: Product not found!"
msgstr ""
msgstr "Erro: Produto não encontrado!"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:296
msgid "Error: Variation not found!"
msgstr ""
msgstr "Erro: Variação não encontrada!"
#: pretix/static/pretixcontrol/js/ui/editor.js:171
msgid "Check-in QR"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-27 13:57+0000\n"
"PO-Revision-Date: 2025-12-02 16:47+0000\n"
"PO-Revision-Date: 2025-12-11 01:00+0000\n"
"Last-Translator: Ana Rute Pacheco Vivas <rute.vivas@om.org>\n"
"Language-Team: Portuguese (Portugal) <https://translate.pretix.eu/projects/"
"pretix/pretix/pt_PT/>\n"
@@ -3522,8 +3522,7 @@ msgstr "Participante individual"
#: pretix/base/invoicing/email.py:50
msgid "Email invoice directly to accounting department"
msgstr ""
"Envie a fatura diretamente por e-mail para o departamento de contabilidade"
msgstr "Envia a fatura diretamente por e-mail para o departamento financeiro"
#: pretix/base/invoicing/email.py:51
msgid ""
@@ -6702,10 +6701,8 @@ msgstr ""
"tua fatura, caso assim o desejes."
#: pretix/base/models/orders.py:3534
#, fuzzy
#| msgid "Transaction time"
msgid "Transmission type"
msgstr "Hora de transação"
msgstr "Modo de comunicação"
#: pretix/base/models/orders.py:3632
#: pretix/plugins/badges/templates/pretixplugins/badges/control_order_position_buttons.html:9
@@ -20186,8 +20183,8 @@ msgid ""
"email address is owned by you. Please enter the verification code below:"
msgstr ""
"Enviamos um e-mail para %(recp)s com um código de confirmação para verificar "
"se este endereço de e-mail é da sua propriedade. Por favor, insira o código "
"de verificação abaixo:"
"se este endereço de e-mail te pertence. Por favor, indica o código de "
"verificação abaixo:"
#: pretix/control/templates/pretixcontrol/email_setup_simple.html:63
msgid "Verification code"
@@ -27454,6 +27451,9 @@ msgid ""
"We will send a confirmation code to your new email address, which you need "
"to enter in the next step to confirm the email address is correct."
msgstr ""
"Enviaremos um código de confirmação para o teu novo endereço de e-mail, que "
"precisas de inserir na próxima etapa para confirmar que o endereço de e-mail "
"está correto."
#: pretix/control/templates/pretixcontrol/user/change_password.html:4
#: pretix/control/templates/pretixcontrol/user/change_password.html:8
@@ -27567,6 +27567,9 @@ msgid ""
"confirm your email address using a confirmation code we will send to your "
"email address."
msgstr ""
"O teu endereço de e-mail ainda não foi confirmado. Para proteger a tua "
"conta, confirma o teu endereço de e-mail usando um código de confirmação que "
"te enviaremos."
#: pretix/control/templates/pretixcontrol/user/settings.html:18
#, fuzzy
@@ -28878,7 +28881,7 @@ msgstr ""
#: pretix/control/views/mailsetup.py:216
msgid "The verification code was incorrect, please try again."
msgstr "O código de verificação estava incorreto, tente novamente."
msgstr "O código de verificação estava incorreto, tenta novamente."
#: pretix/control/views/mailsetup.py:221
msgid "Sender address verification"
@@ -29937,6 +29940,8 @@ msgid ""
"Please enter the confirmation code we sent to your email address "
"<strong>{email}</strong>."
msgstr ""
"Indica o código de confirmação que enviámos para o teu endereço de e-mail "
"<strong>{email}</strong>."
#: pretix/control/views/user.py:947
#, fuzzy
@@ -34939,7 +34944,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:9
msgid "Before we continue, we need you to answer some questions."
msgstr "Antes de continuarmos, precisamos que respondas a algumas perguntas."
msgstr "Antes de continuares, precisamos que respondas a algumas perguntas."
#: pretix/presale/templates/pretixpresale/event/checkout_questions.html:49
msgid "Auto-fill with address"
@@ -35374,10 +35379,8 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:514
#: pretix/presale/templates/pretixpresale/fragment_modals.html:48
#, fuzzy
#| msgid "Event description"
msgid "Renew reservation"
msgstr "Descrição do Evento"
msgstr "Renovar a reserva"
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:526
#, fuzzy
@@ -35962,8 +35965,8 @@ msgid ""
"Please note that we still await approval by the event organizer before you "
"can pay and complete this order."
msgstr ""
"Por favor, note que a aprovação ainda aguardam pelo organizador do evento "
"antes que pode pagar e concluir este pedido."
"Por favor, nota que ainda estamos à espera da aprovação do organizador do "
"evento antes de poderes pagar e concluir esta encomenda."
#: pretix/presale/templates/pretixpresale/event/order.html:43
msgid "Please note that we still await your payment to complete the process."
@@ -35972,19 +35975,14 @@ msgstr ""
"processo."
#: pretix/presale/templates/pretixpresale/event/order.html:55
#, fuzzy
#| msgid ""
#| "Please bookmark or save the link to this exact page if you want to access "
#| "your order later. We also sent you an email containing the link to the "
#| "address you specified."
msgid ""
"Please bookmark or save the link to this exact page if you want to access "
"your order later. We also sent you an email to the address you specified "
"containing the link to this page."
msgstr ""
"Por favor, guarda o link para esta página, caso queiras aceder ao teu pedido "
"mais tarde. Também iremos enviar-te um email com o link para o endereço que "
"indicaste."
"Por favor, guarda o link desta página, se quiseres aceder à tua encomenda "
"mais tarde. Também enviámos um e-mail para o endereço que indicaste com o "
"link para esta página."
#: pretix/presale/templates/pretixpresale/event/order.html:59
#, fuzzy

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 10:37+0000\n"
"PO-Revision-Date: 2025-11-11 21:00+0000\n"
"PO-Revision-Date: 2025-12-10 15:49+0000\n"
"Last-Translator: Ana Rute Pacheco Vivas <rute.vivas@om.org>\n"
"Language-Team: Portuguese (Portugal) <https://translate.pretix.eu/projects/"
"pretix/pretix-js/pt_PT/>\n"
@@ -798,7 +798,7 @@ msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:90
msgid "Renew reservation"
msgstr ""
msgstr "Renovar a reserva"
#: pretix/static/pretixpresale/js/ui/main.js:194
msgid "The organizer keeps %(currency)s %(amount)s"

View File

@@ -8,18 +8,20 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-27 13:57+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"PO-Revision-Date: 2025-12-09 22:00+0000\n"
"Last-Translator: Lachlan Struthers <lachlan.struthers@om.org>\n"
"Language-Team: Albanian <https://translate.pretix.eu/projects/pretix/pretix/"
"sq/>\n"
"Language: sq\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.14.3\n"
#: pretix/_base_settings.py:87
msgid "English"
msgstr ""
msgstr "Anglisht"
#: pretix/_base_settings.py:88
msgid "German"
@@ -450,7 +452,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/event/mail.html:114
#: pretix/control/views/orders.py:1569
msgid "Order canceled"
msgstr ""
msgstr "Porositja ësthë anuluar"
#: pretix/api/webhooks.py:278 pretix/base/notifications.py:257
msgid "Order reactivated"
@@ -1407,7 +1409,7 @@ msgstr ""
#: pretix/plugins/checkinlists/exporters.py:827
#: pretix/plugins/checkinlists/exporters.py:828
msgid "Yes"
msgstr ""
msgstr "Po"
#: pretix/base/exporters/customers.py:100
#: pretix/base/exporters/customers.py:101 pretix/base/exporters/events.py:83
@@ -1431,7 +1433,7 @@ msgstr ""
#: pretix/plugins/checkinlists/exporters.py:827
#: pretix/plugins/checkinlists/exporters.py:828
msgid "No"
msgstr ""
msgstr "Jo"
#: pretix/base/exporters/dekodi.py:42 pretix/base/exporters/invoices.py:66
msgctxt "export_category"
@@ -2445,7 +2447,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:12
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:91
msgid "Product"
msgstr ""
msgstr "Produkti"
#: pretix/base/exporters/orderlist.py:619 pretix/base/models/vouchers.py:315
#: pretix/control/templates/pretixcontrol/vouchers/bulk.html:5
@@ -2783,7 +2785,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/event/cancel.html:20
#: pretix/control/views/item.py:971
msgid "Paid orders"
msgstr ""
msgstr "Porositje të paguara"
#: pretix/base/exporters/orderlist.py:1155 pretix/control/views/item.py:976
msgid "Pending orders"
@@ -3879,7 +3881,7 @@ msgstr ""
#: pretix/base/modelimport_vouchers.py:205 pretix/base/models/items.py:1256
#: pretix/base/models/vouchers.py:266 pretix/base/models/waitinglist.py:99
msgid "Product variation"
msgstr ""
msgstr "Varianti i produktit"
#: pretix/base/modelimport_orders.py:161
msgid "The variation can be specified by its internal ID or full name."
@@ -4278,19 +4280,19 @@ msgstr ""
#: pretix/base/models/checkin.py:336
msgid "Entry"
msgstr ""
msgstr "Hyrje"
#: pretix/base/models/checkin.py:337
msgid "Exit"
msgstr ""
msgstr "Dalje"
#: pretix/base/models/checkin.py:356
msgid "Unknown ticket"
msgstr ""
msgstr "Biletë e panjohur"
#: pretix/base/models/checkin.py:357
msgid "Ticket not paid"
msgstr ""
msgstr "Bileta nuk është paguar"
#: pretix/base/models/checkin.py:358
msgid "Forbidden by custom rule"
@@ -4298,23 +4300,23 @@ msgstr ""
#: pretix/base/models/checkin.py:359
msgid "Ticket code revoked/changed"
msgstr ""
msgstr "Kodi i biletës është anuluar/ndryshuar"
#: pretix/base/models/checkin.py:360
msgid "Information required"
msgstr ""
msgstr "Informacion i domosdoshëm"
#: pretix/base/models/checkin.py:361
msgid "Ticket already used"
msgstr ""
msgstr "Bileta tashmë është përdorur"
#: pretix/base/models/checkin.py:362
msgid "Ticket type not allowed here"
msgstr ""
msgstr "Ky lloj bilete nuk lejohet këtu"
#: pretix/base/models/checkin.py:363
msgid "Ticket code is ambiguous on list"
msgstr ""
msgstr "Kodi i biletës është e paqartë në listë"
#: pretix/base/models/checkin.py:364
msgid "Server error"
@@ -4322,15 +4324,15 @@ msgstr ""
#: pretix/base/models/checkin.py:365
msgid "Ticket blocked"
msgstr ""
msgstr "Bileta u bllokua"
#: pretix/base/models/checkin.py:366
msgid "Order not approved"
msgstr ""
msgstr "Porositje nuk është aprovuar"
#: pretix/base/models/checkin.py:367
msgid "Ticket not valid at this time"
msgstr ""
msgstr "Bileta nuk është e vlefshme për momentin"
#: pretix/base/models/checkin.py:368
msgid "Check-in annulled"
@@ -4460,7 +4462,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/organizers/gates.html:16
#: pretix/plugins/checkinlists/exporters.py:769
msgid "Gate"
msgstr ""
msgstr "Porta"
#: pretix/base/models/devices.py:131
#: pretix/control/templates/pretixcontrol/organizers/devices.html:83
@@ -5928,7 +5930,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/organizers/customer_membership.html:34
#: pretix/presale/templates/pretixpresale/organizers/customer_memberships.html:44
msgid "Canceled"
msgstr ""
msgstr "e anuluar"
#: pretix/base/models/memberships.py:134
#: pretix/control/templates/pretixcontrol/organizers/customer.html:117
@@ -6671,7 +6673,7 @@ msgstr ""
#: pretix/base/models/vouchers.py:204 pretix/control/views/vouchers.py:120
msgid "Redeemed"
msgstr ""
msgstr "e përdorur"
#: pretix/base/models/vouchers.py:209
msgid ""
@@ -7704,15 +7706,15 @@ msgstr ""
#: pretix/base/reldate.py:38
msgid "Event start"
msgstr ""
msgstr "Fillimi i eventit"
#: pretix/base/reldate.py:39
msgid "Event end"
msgstr ""
msgstr "Mbarimi i eventit"
#: pretix/base/reldate.py:40
msgid "Event admission"
msgstr ""
msgstr "Hyrja në event"
#: pretix/base/reldate.py:41
msgid "Presale start"
@@ -12889,7 +12891,7 @@ msgstr ""
#: pretix/plugins/reports/exporters.py:391
#: pretix/presale/templates/pretixpresale/event/fragment_order_status.html:7
msgid "Approval pending"
msgstr ""
msgstr "Duke pritur aprovimin"
#: pretix/control/forms/filter.py:247
msgid "Follow-up configured"
@@ -13157,7 +13159,7 @@ msgstr ""
#: pretix/control/forms/filter.py:2117
#: pretix/presale/templates/pretixpresale/organizers/customer_giftcards.html:51
msgid "Valid"
msgstr ""
msgstr "e vlefshme"
#: pretix/control/forms/filter.py:2118
msgid "Unredeemed"
@@ -16427,7 +16429,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/event/order_pay_change.html:75
#: pretix/presale/templates/pretixpresale/event/position_change.html:29
msgid "Continue"
msgstr ""
msgstr "Vazhdoni"
#: pretix/control/templates/pretixcontrol/auth/oauth_authorization.html:8
msgid "Authorize an application"
@@ -16675,7 +16677,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/postmessage.html:27
#: pretix/presale/templates/pretixpresale/waiting.html:42
msgid "If this takes longer than a few minutes, please contact us."
msgstr ""
msgstr "Nëse kalon më shumë se disa minuta, ju lutemi t'na kontaktoni."
#: pretix/control/templates/pretixcontrol/boxoffice/payment.html:4
#: pretix/control/templates/pretixcontrol/organizers/devices.html:71
@@ -16905,7 +16907,7 @@ msgstr[1] ""
#: pretix/presale/templates/pretixpresale/event/position_change.html:24
#: pretix/presale/templates/pretixpresale/event/position_modify.html:44
msgid "Cancel"
msgstr ""
msgstr "Anuloni"
#: pretix/control/templates/pretixcontrol/checkin/bulk_revert_confirm.html:27
#: pretix/control/templates/pretixcontrol/checkin/list_delete.html:24
@@ -17019,7 +17021,7 @@ msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:14
#: pretix/plugins/checkinlists/exporters.py:770
msgid "Result"
msgstr ""
msgstr "Rezultati"
#: pretix/control/templates/pretixcontrol/checkin/checkins.html:78
#: pretix/control/templates/pretixcontrol/order/index.html:437
@@ -17363,7 +17365,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:68
msgid "Additional information required"
msgstr ""
msgstr "Më shumë informacione kërkohen"
#: pretix/control/templates/pretixcontrol/checkin/simulator.html:70
msgid ""
@@ -18477,7 +18479,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/event/plugins.html:34
#: pretix/control/templates/pretixcontrol/organizers/plugins.html:34
msgid "Search results"
msgstr ""
msgstr "Rezultatet e kërkimit"
#: pretix/control/templates/pretixcontrol/event/plugins.html:56
#: pretix/control/templates/pretixcontrol/organizers/plugins.html:56
@@ -19743,7 +19745,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:355
#: pretix/control/templates/pretixcontrol/subevents/bulk.html:364
msgid "minutes"
msgstr ""
msgstr "minuta"
#: pretix/control/templates/pretixcontrol/item/index.html:229
msgid "hours"
@@ -21014,7 +21016,7 @@ msgstr ""
#: pretix/plugins/reports/exporters.py:969
#: pretix/presale/templates/pretixpresale/event/fragment_cart.html:469
msgid "Total"
msgstr ""
msgstr "Shuma totale"
#: pretix/control/templates/pretixcontrol/order/index.html:789
#: pretix/presale/templates/pretixpresale/event/order.html:210
@@ -23135,7 +23137,7 @@ msgstr ""
#: pretix/control/templates/pretixcontrol/pdf/index.html:107
msgid "Duplicate"
msgstr ""
msgstr "Kopjoni"
#: pretix/control/templates/pretixcontrol/pdf/index.html:117
msgid "Undo"
@@ -27329,7 +27331,7 @@ msgstr ""
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:80
msgid "Comment:"
msgstr ""
msgstr "Komente:"
#: pretix/plugins/banktransfer/templates/pretixplugins/banktransfer/transaction_list.html:98
msgid "No order code detected"
@@ -27572,7 +27574,7 @@ msgstr ""
#: pretix/plugins/paypal2/payment.py:1097
#: pretix/plugins/paypal2/payment.py:1098 pretix/plugins/stripe/payment.py:1816
msgid "PayPal"
msgstr ""
msgstr "PayPal"
#: pretix/plugins/paypal/apps.py:53
msgid ""
@@ -29012,8 +29014,9 @@ msgid "Credit card payments"
msgstr ""
#: pretix/plugins/stripe/payment.py:342 pretix/plugins/stripe/payment.py:1527
#, fuzzy
msgid "iDEAL"
msgstr ""
msgstr "iDEAL"
#: pretix/plugins/stripe/payment.py:344 pretix/plugins/stripe/payment.py:352
#: pretix/plugins/stripe/payment.py:360 pretix/plugins/stripe/payment.py:395
@@ -29032,12 +29035,14 @@ msgid "Alipay"
msgstr ""
#: pretix/plugins/stripe/payment.py:358 pretix/plugins/stripe/payment.py:1564
#, fuzzy
msgid "Bancontact"
msgstr ""
msgstr "Bancontact"
#: pretix/plugins/stripe/payment.py:366
#, fuzzy
msgid "SEPA Direct Debit"
msgstr ""
msgstr "Debit direkt me SEPA"
#: pretix/plugins/stripe/payment.py:369
msgid ""
@@ -29072,12 +29077,14 @@ msgid "Multibanco"
msgstr ""
#: pretix/plugins/stripe/payment.py:409 pretix/plugins/stripe/payment.py:1730
#, fuzzy
msgid "Przelewy24"
msgstr ""
msgstr "Przelewy24"
#: pretix/plugins/stripe/payment.py:417 pretix/plugins/stripe/payment.py:1769
#, fuzzy
msgid "WeChat Pay"
msgstr ""
msgstr "WeChat Pay"
#: pretix/plugins/stripe/payment.py:433 pretix/plugins/stripe/payment.py:1824
msgid "Swish"
@@ -29221,8 +29228,9 @@ msgid "giropay via Stripe"
msgstr ""
#: pretix/plugins/stripe/payment.py:1480
#, fuzzy
msgid "giropay"
msgstr ""
msgstr "giropay"
#: pretix/plugins/stripe/payment.py:1483
msgid ""
@@ -32444,7 +32452,7 @@ msgstr ""
#: pretix/presale/templates/pretixpresale/postmessage.html:21
#: pretix/presale/templates/pretixpresale/waiting.html:22
msgid "We are processing your request …"
msgstr ""
msgstr "Ne po e proçesojmë kërkesën tuaj …"
#: pretix/presale/utils.py:271 pretix/presale/utils.py:417
#: pretix/presale/utils.py:418

View File

@@ -3,137 +3,159 @@
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-11-20 10:37+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"PO-Revision-Date: 2025-12-09 22:00+0000\n"
"Last-Translator: Lachlan Struthers <lachlan.struthers@om.org>\n"
"Language-Team: Albanian <https://translate.pretix.eu/projects/pretix/"
"pretix-js/sq/>\n"
"Language: sq\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.14.3\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:68
msgid "Marked as paid"
msgstr ""
msgstr "Shënuar se u pagua"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:76
msgid "Comment:"
msgstr ""
msgstr "Komente:"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:34
msgid "PayPal"
msgstr ""
msgstr "PayPal"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:35
msgid "Venmo"
msgstr ""
msgstr "Venmo"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:36
#: pretix/static/pretixpresale/js/walletdetection.js:38
#, fuzzy
msgid "Apple Pay"
msgstr ""
msgstr "Apple Pay"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:37
#, fuzzy
msgid "Itaú"
msgstr ""
msgstr "Itaú"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:38
#, fuzzy
msgid "PayPal Credit"
msgstr ""
msgstr "PayPal Credit"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:39
msgid "Credit Card"
msgstr ""
msgstr "Kartë Krediti"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:40
msgid "PayPal Pay Later"
msgstr ""
msgstr "Bëj PayPal Pay më vonë"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:41
#, fuzzy
msgid "iDEAL"
msgstr ""
msgstr "iDEAL"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:42
#, fuzzy
msgid "SEPA Direct Debit"
msgstr ""
msgstr "Debit direkt me SEPA"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:43
#, fuzzy
msgid "Bancontact"
msgstr ""
msgstr "Bancontact"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:44
#, fuzzy
msgid "giropay"
msgstr ""
msgstr "giropay"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:45
#, fuzzy
msgid "SOFORT"
msgstr ""
msgstr "SOFORT"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:46
#, fuzzy
msgid "eps"
msgstr ""
msgstr "eps"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:47
#, fuzzy
msgid "MyBank"
msgstr ""
msgstr "MyBank"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:48
#, fuzzy
msgid "Przelewy24"
msgstr ""
msgstr "Przelewy24"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:49
#, fuzzy
msgid "Verkkopankki"
msgstr ""
msgstr "Verkkopankki"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:50
#, fuzzy
msgid "PayU"
msgstr ""
msgstr "PayU"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:51
#, fuzzy
msgid "BLIK"
msgstr ""
msgstr "BLIK"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:52
#, fuzzy
msgid "Trustly"
msgstr ""
msgstr "Trustly"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:53
#, fuzzy
msgid "Zimpler"
msgstr ""
msgstr "Zimpler"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:54
#, fuzzy
msgid "Maxima"
msgstr ""
msgstr "Maxima"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:55
#, fuzzy
msgid "OXXO"
msgstr ""
msgstr "OXXO"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:56
#, fuzzy
msgid "Boleto"
msgstr ""
msgstr "Boleto"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:57
#, fuzzy
msgid "WeChat Pay"
msgstr ""
msgstr "WeChat Pay"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:58
#, fuzzy
msgid "Mercado Pago"
msgstr ""
msgstr "Mercado Pago"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:167
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:50
#: pretix/static/pretixpresale/js/ui/cart.js:89
msgid "Continue"
msgstr ""
msgstr "Vazhdoni"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:225
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:244
@@ -142,222 +164,224 @@ msgstr ""
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:317
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:341
msgid "Confirming your payment …"
msgstr ""
msgstr "Duke e konfirmuar pagesën …"
#: pretix/plugins/paypal2/static/pretixplugins/paypal2/pretix-paypal.js:254
msgid "Payment method unavailable"
msgstr ""
msgstr "Metodë e padisponueshme të pagesës"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:15
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Placed orders"
msgstr ""
msgstr "Porositje të bëra"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:15
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Paid orders"
msgstr ""
msgstr "Porositje të paguara"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
msgid "Total revenue"
msgstr ""
msgstr "Të ardhurat totale"
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:15
msgid "Contacting Stripe …"
msgstr ""
msgstr "Duke e kontaktuar Stripe …"
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:72
msgid "Total"
msgstr ""
msgstr "Shuma totale"
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:291
msgid "Contacting your bank …"
msgstr ""
msgstr "Duke e kontaktuar bankën tuaj …"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:30
msgid "Select a check-in list"
msgstr ""
msgstr "Zgjidhni një listë check-in"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:31
msgid "No active check-in lists found."
msgstr ""
msgstr "Nuk u gjet asnjë listë check-in."
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:32
msgid "Switch check-in list"
msgstr ""
msgstr "Shkëmbeni listë check-in"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:33
msgid "Search results"
msgstr ""
msgstr "Rezultatet e kërkimit"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:34
msgid "No tickets found"
msgstr ""
msgstr "Nuk u gjetën bileta"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:35
msgid "Result"
msgstr ""
msgstr "Rezultati"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:36
msgid "This ticket requires special attention"
msgstr ""
msgstr "Kjo biletë duhet kujdes të veçantë"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:37
msgid "Switch direction"
msgstr ""
msgstr "Ndryshoni drejtimin"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:38
msgid "Entry"
msgstr ""
msgstr "Hyrje"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:39
msgid "Exit"
msgstr ""
msgstr "Dalje"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:40
msgid "Scan a ticket or search and press return…"
msgstr ""
msgstr "Skanoni një biletë ose kërkoni dhe shtypni butonin 'Enter'…"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:41
msgid "Load more"
msgstr ""
msgstr "Ngarkoni më shumë"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:42
msgid "Valid"
msgstr ""
msgstr "e vlefshme"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:43
msgid "Unpaid"
msgstr ""
msgstr "e papaguar"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:44
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:45
msgid "Canceled"
msgstr ""
msgstr "e anuluar"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:46
msgid "Confirmed"
msgstr ""
msgstr "e konfirmuar"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:47
msgid "Approval pending"
msgstr ""
msgstr "Duke pritur aprovimin"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:48
msgid "Redeemed"
msgstr ""
msgstr "e përdorur"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:49
msgid "Cancel"
msgstr ""
msgstr "Anuloni"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:51
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:60
msgid "Ticket not paid"
msgstr ""
msgstr "Bileta nuk është paguar"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:52
msgid "This ticket is not yet paid. Do you want to continue anyways?"
msgstr ""
msgstr "Kjo biletë ende nuk është paguar. A dëshironi të vazhdoni gjithsesi?"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:53
msgid "Additional information required"
msgstr ""
msgstr "Më shumë informacione kërkohen"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:54
msgid "Valid ticket"
msgstr ""
msgstr "Biletë të vlefshme"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:55
msgid "Exit recorded"
msgstr ""
msgstr "Dalja u regjistrua"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:56
msgid "Ticket already used"
msgstr ""
msgstr "Bileta tashmë është përdorur"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:57
msgid "Information required"
msgstr ""
msgstr "Informacion i domosdoshëm"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:58
msgid "Unknown ticket"
msgstr ""
msgstr "Biletë e panjohur"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:59
msgid "Ticket type not allowed here"
msgstr ""
msgstr "Ky lloj bilete nuk lejohet këtu"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:61
msgid "Entry not allowed"
msgstr ""
msgstr "Hyrja nuk lejohet"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:62
msgid "Ticket code revoked/changed"
msgstr ""
msgstr "Kodi i biletës është anuluar/ndryshuar"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:63
msgid "Ticket blocked"
msgstr ""
msgstr "Bileta u bllokua"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:64
msgid "Ticket not valid at this time"
msgstr ""
msgstr "Bileta nuk është e vlefshme për momentin"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:65
msgid "Order canceled"
msgstr ""
msgstr "Porositja ësthë anuluar"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:66
msgid "Ticket code is ambiguous on list"
msgstr ""
msgstr "Kodi i biletës është e paqartë në listë"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:67
msgid "Order not approved"
msgstr ""
msgstr "Porositje nuk është aprovuar"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:68
msgid "Checked-in Tickets"
msgstr ""
msgstr "Bileta të regjistruara"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:69
msgid "Valid Tickets"
msgstr ""
msgstr "Bileta të vlefshme"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:70
msgid "Currently inside"
msgstr ""
msgstr "Aktualisht brenda"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:71
#: pretix/static/pretixcontrol/js/ui/question.js:136
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "Yes"
msgstr ""
msgstr "Po"
#: pretix/plugins/webcheckin/static/pretixplugins/webcheckin/main.js:72
#: pretix/static/pretixcontrol/js/ui/question.js:137
#: pretix/static/pretixpresale/js/ui/questions.js:271
msgid "No"
msgstr ""
msgstr "Jo"
#: pretix/static/lightbox/js/lightbox.js:96
msgid "close"
msgstr ""
msgstr "Mbyllni"
#: pretix/static/pretixbase/js/addressform.js:98
#: pretix/static/pretixpresale/js/ui/main.js:529
msgid "required"
msgstr ""
msgstr "të domosdoshme"
#: pretix/static/pretixbase/js/asynctask.js:13
msgid ""
"Your request is currently being processed. Depending on the size of your "
"event, this might take up to a few minutes."
msgstr ""
"Këkesa juaj po proçesohet tani. Në varësi të masës së eventit tuaj, mund të "
"kërkojë disa minuta."
#: pretix/static/pretixbase/js/asynctask.js:17
msgid "Your request has been queued on the server and will soon be processed."
msgstr ""
msgstr "Kërkesa juaj është në pritje në server dhe do të proçesohet së shpejti."
#: pretix/static/pretixbase/js/asynctask.js:21
msgid ""
@@ -365,34 +389,41 @@ msgid ""
"If this takes longer than two minutes, please contact us or go back in your "
"browser and try again."
msgstr ""
"Kërkesa juaj arriti në server por ende presim të proçesohet. Nëse kalon më "
"shumë se dy minuta, ju lutemi t'na kontaktoni ose të ktheheni më përpara dhe "
"të provoni përsëri."
#: pretix/static/pretixbase/js/asynctask.js:125
#: pretix/static/pretixbase/js/asynctask.js:182
#: pretix/static/pretixbase/js/asynctask.js:186
#: pretix/static/pretixcontrol/js/ui/mail.js:24
msgid "An error of type {code} occurred."
msgstr ""
msgstr "Një gabim të llojit {kodi} ka ndodhur."
#: pretix/static/pretixbase/js/asynctask.js:128
msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: "
"{code}"
msgstr ""
"Nuk mund t'a kontaktojmë serverin për momentin, por vazhdojmë t'a provojmë. "
"Kodi gabimi i fundit: {kodi}"
#: pretix/static/pretixbase/js/asynctask.js:162
#: pretix/static/pretixcontrol/js/ui/mail.js:21
msgid "The request took too long. Please try again."
msgstr ""
msgstr "Kërkesa juaj kërkonte tepër kohë. Ju lutemi të provoni përsëri."
#: pretix/static/pretixbase/js/asynctask.js:188
#: pretix/static/pretixcontrol/js/ui/mail.js:26
msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}"
msgstr ""
"Nuk mund t'a kontaktojmë serverin për momentin. Ju lutemi, provoni përsëri. "
"Kodi gabimi i fundit: {kodi}"
#: pretix/static/pretixbase/js/asynctask.js:216
msgid "We are processing your request …"
msgstr ""
msgstr "Ne po e proçesojmë kërkesën tuaj …"
#: pretix/static/pretixbase/js/asynctask.js:219
msgid ""
@@ -400,166 +431,169 @@ msgid ""
"than one minute, please check your internet connection and then reload this "
"page and try again."
msgstr ""
"Tani po e dërgojmë kërkesën tuaj në server. Nëse kalon më shumë se një "
"minutë, ju lutemi t'a kontrolloni lidhjen tuaj në internet dhe pastak t'a "
"rifreskoni këtë faqe që të provoni përsëri."
#: pretix/static/pretixbase/js/asynctask.js:276
msgid "If this takes longer than a few minutes, please contact us."
msgstr ""
msgstr "Nëse kalon më shumë se disa minuta, ju lutemi t'na kontaktoni."
#: pretix/static/pretixbase/js/asynctask.js:331
msgid "Close message"
msgstr ""
msgstr "Mbyllni mesazhin"
#: pretix/static/pretixcontrol/js/clipboard.js:23
msgid "Copied!"
msgstr ""
msgstr "E kopjuar!"
#: pretix/static/pretixcontrol/js/clipboard.js:29
msgid "Press Ctrl-C to copy!"
msgstr ""
msgstr "Shtypni Ctrl+C për të kopjuar!"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:12
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:18
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:24
msgid "is one of"
msgstr ""
msgstr "është një nga"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:30
msgid "is before"
msgstr ""
msgstr "është para"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:34
msgid "is after"
msgstr ""
msgstr "është pas"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:40
msgid "="
msgstr ""
msgstr "="
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:99
msgid "Product"
msgstr ""
msgstr "Produkti"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:103
msgid "Product variation"
msgstr ""
msgstr "Varianti i produktit"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:107
msgid "Gate"
msgstr ""
msgstr "Porta"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:111
msgid "Current date and time"
msgstr ""
msgstr "Datë dhe orë aktuale"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:115
msgid "Current day of the week (1 = Monday, 7 = Sunday)"
msgstr ""
msgstr "Dita aktuale e javës (1 = Të hënën, 7 = Të dielën)"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:119
msgid "Current entry status"
msgstr ""
msgstr "Gjendja aktuale e hyrjes"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:123
msgid "Number of previous entries"
msgstr ""
msgstr "Shuma e hyrjeve të mëparshme"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:127
msgid "Number of previous entries since midnight"
msgstr ""
msgstr "Shuma e hyrjeve të mëparshme nga mesnata"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:131
msgid "Number of previous entries since"
msgstr ""
msgstr "Shuma e hyrjeve të mëparshme nga"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:135
msgid "Number of previous entries before"
msgstr ""
msgstr "Shuma e hyrjeve të mëparshme përpara"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:139
msgid "Number of days with a previous entry"
msgstr ""
msgstr "Shuma e ditëve me një hyrje të mëparshme"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:143
msgid "Number of days with a previous entry since"
msgstr ""
msgstr "Shuma e ditëve me një hyrje të mëparshme nga"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:147
msgid "Number of days with a previous entry before"
msgstr ""
msgstr "Shuma e ditëve me një hyrje të mëparshme përpara"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:151
msgid "Minutes since last entry (-1 on first entry)"
msgstr ""
msgstr "Minuta nga hyrja e fundit (-1 në hyrjen e parë)"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:155
msgid "Minutes since first entry (-1 on first entry)"
msgstr ""
msgstr "Minuta nga hyrja e parë (-1 në hyrjen e parë)"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:182
msgid "All of the conditions below (AND)"
msgstr ""
msgstr "Të gjitha gjendjet më poshtë (DHE)"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:183
msgid "At least one of the conditions below (OR)"
msgstr ""
msgstr "Të paktën një nga gjendjet më poshtë (OSE)"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:184
msgid "Event start"
msgstr ""
msgstr "Fillimi i eventit"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:185
msgid "Event end"
msgstr ""
msgstr "Mbarimi i eventit"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:186
msgid "Event admission"
msgstr ""
msgstr "Hyrja në event"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:187
msgid "custom date and time"
msgstr ""
msgstr "datë dhe orë e kustomizuar"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:188
msgid "custom time"
msgstr ""
msgstr "orë e kustomizuar"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:189
msgid "Tolerance (minutes)"
msgstr ""
msgstr "Toleranca (minuta)"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:190
msgid "Add condition"
msgstr ""
msgstr "Shtoni gjendje"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:191
msgid "minutes"
msgstr ""
msgstr "minuta"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:192
msgid "Duplicate"
msgstr ""
msgstr "Kopjoni"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:193
msgctxt "entry_status"
msgid "present"
msgstr ""
msgstr "pranishëm"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:194
msgctxt "entry_status"
msgid "absent"
msgstr ""
msgstr "munguar"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:289
msgid "Error: Product not found!"
msgstr ""
msgstr "Gabim: Produkti nuk u gjet!"
#: pretix/static/pretixcontrol/js/ui/checkinrules.js:296
msgid "Error: Variation not found!"
msgstr ""
msgstr "Gabim: Varianti nuk u gjet!"
#: pretix/static/pretixcontrol/js/ui/editor.js:171
msgid "Check-in QR"
msgstr ""
msgstr "Kodi QR për check-in"
#: pretix/static/pretixcontrol/js/ui/editor.js:549
msgid "The PDF background file could not be loaded for the following reason:"

View File

@@ -41,15 +41,20 @@ for app in apps.get_app_configs():
if hasattr(app, 'PretixPluginMeta'):
if importlib.util.find_spec(app.name + '.urls'):
urlmod = importlib.import_module(app.name + '.urls')
single_plugin_patterns = []
if hasattr(urlmod, 'event_patterns'):
patterns = plugin_event_urls(urlmod.event_patterns, plugin=app.name)
raw_plugin_patterns.append(
re_path(r'^(?P<event>[^/]+)/', include((patterns, app.label)))
single_plugin_patterns.append(
re_path(r'^(?P<event>[^/]+)/', include(patterns))
)
if hasattr(urlmod, 'organizer_patterns'):
patterns = plugin_event_urls(urlmod.organizer_patterns, plugin=app.name)
single_plugin_patterns += plugin_event_urls(urlmod.organizer_patterns, plugin=app.name)
if single_plugin_patterns:
raw_plugin_patterns.append(
re_path(r'', include((patterns, app.label)))
re_path(r'', include((single_plugin_patterns, app.label)))
)
plugin_patterns = [

View File

@@ -42,15 +42,20 @@ for app in apps.get_app_configs():
if hasattr(app, 'PretixPluginMeta'):
if importlib.util.find_spec(app.name + '.urls'):
urlmod = importlib.import_module(app.name + '.urls')
if hasattr(urlmod, 'event_patterns'):
patterns = plugin_event_urls(urlmod.event_patterns, plugin=app.name)
raw_plugin_patterns.append(
re_path(r'^(?P<event>[^/]+)/', include((patterns, app.label)))
)
single_plugin_patterns = []
if hasattr(urlmod, 'organizer_patterns'):
patterns = plugin_event_urls(urlmod.organizer_patterns, plugin=app.name)
single_plugin_patterns += plugin_event_urls(urlmod.organizer_patterns, plugin=app.name)
if hasattr(urlmod, 'event_patterns'):
plugin_event_patterns = plugin_event_urls(urlmod.event_patterns, plugin=app.name)
single_plugin_patterns.append(
re_path(r'^(?P<event>[^/]+)/', include(plugin_event_patterns))
)
if single_plugin_patterns:
raw_plugin_patterns.append(
re_path(r'', include((patterns, app.label)))
re_path(r'', include((single_plugin_patterns, app.label)))
)
plugin_patterns = [

View File

@@ -0,0 +1,71 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-today pretix GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/license>.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
from django.utils.translation import gettext_lazy as _
from lxml import etree
def parse(file):
# Spec: https://www.ebics.de/de/datenformate
data = file.read()
root = etree.fromstring(data)
statements = root.findall("{*}BkToCstmrStmt/{*}Stmt")
if not statements:
raise ValueError(_("Empty file or unknown format."))
def get_text(findall_result):
if len(findall_result) == 1:
return findall_result[0].text
return ""
rows = []
for stmt in statements:
for ntry in stmt.findall("{*}Ntry"):
minus = ""
otherparty = "Dbtr"
if ntry.findall("{*}CdtDbtInd")[0].text == "DBIT":
otherparty = "Cdtr"
minus = "-"
reference_parts = [
get_text(ntry.findall("{*}NtryDtls/{*}TxDtls/{*}RmtInf/{*}Ustrd")),
get_text(ntry.findall("{*}NtryDtls/{*}TxDtls/{*}Refs/{*}EndToEndId")),
get_text(ntry.findall("{*}NtryDtls/{*}TxDtls/{*}Refs/{*}InstructionIdentification")),
]
if ntry.findall("{*}NtryDtls/{*}Btch"):
# Batch booking, we do not support splitting yet
reference_parts.insert(0, get_text(ntry.findall("{*}NtryDtls/{*}Btch/{*}PmtInfId")))
row = {
'amount': minus + ntry.findall("{*}Amt")[0].text,
'date': get_text(ntry.findall("{*}BookgDt/{*}Dt")),
'reference': "\n".join(filter(lambda a: bool(a) and a != "NOTPROVIDED", reference_parts))
}
if ext_id := get_text(ntry.findall("{*}AcctSvcrRef")):
row['external_id'] = ext_id
if iban := get_text(ntry.findall(f"{{*}}NtryDtls/{{*}}TxDtls/{{*}}RltdPties/{{*}}{otherparty}Acct/{{*}}Id/{{*}}IBAN")):
row['iban'] = iban
if bic := get_text(ntry.findall(f"{{*}}NtryDtls/{{*}}TxDtls/{{*}}RltdAgts/{{*}}{otherparty}Agt/{{*}}FinInstnId/{{*}}BICFI")):
row['bic'] = bic
if payer := get_text(ntry.findall(f"{{*}}NtryDtls/{{*}}TxDtls/{{*}}RltdPties/{{*}}{otherparty}/{{*}}Nm")):
row['payer'] = payer
rows.append(row)
return rows

View File

@@ -34,8 +34,10 @@
import json
import logging
import operator
import re
from decimal import Decimal
from functools import reduce
import dateutil.parser
from celery.exceptions import MaxRetriesExceededError
@@ -117,20 +119,26 @@ def _find_order_for_code(base_qs, code):
pass
def _find_order_for_invoice_id(base_qs, prefix, number):
def _find_order_for_invoice_id(base_qs, prefixes, number):
try:
# Working with __iregex here is an experiment, if this turns out to be too slow in production
# we might need to switch to a different approach.
r = [
Q(
prefix__istartswith=prefix, # redundant, but hopefully makes it a little faster
full_invoice_no__iregex=prefix + r'[\- ]*0*' + number
)
for prefix in set(prefixes)
]
return base_qs.select_related('order').get(
prefix__istartswith=prefix, # redundant, but hopefully makes it a little faster
full_invoice_no__iregex=prefix + r'[\- ]*0*' + number
reduce(operator.or_, r)
).order
except (Invoice.DoesNotExist, Invoice.MultipleObjectsReturned):
pass
@transaction.atomic
def _handle_transaction(trans: BankTransaction, matches: tuple, event: Event = None, organizer: Organizer = None):
def _handle_transaction(trans: BankTransaction, matches: tuple, regex_match_to_slug, event: Event = None, organizer: Organizer = None):
orders = []
if event:
for slug, code in matches:
@@ -139,18 +147,19 @@ def _handle_transaction(trans: BankTransaction, matches: tuple, event: Event = N
if order.code not in {o.code for o in orders}:
orders.append(order)
else:
order = _find_order_for_invoice_id(Invoice.objects.filter(event=event), slug, code)
order = _find_order_for_invoice_id(Invoice.objects.filter(event=event), (slug, regex_match_to_slug.get(slug, slug)), code)
if order and order.code not in {o.code for o in orders}:
orders.append(order)
else:
qs = Order.objects.filter(event__organizer=organizer)
for slug, code in matches:
order = _find_order_for_code(qs.filter(event__slug__iexact=slug), code)
original_slug = regex_match_to_slug.get(slug, slug)
order = _find_order_for_code(qs.filter(Q(event__slug__iexact=slug) | Q(event__slug__iexact=original_slug)), code)
if order:
if order.code not in {o.code for o in orders}:
orders.append(order)
else:
order = _find_order_for_invoice_id(Invoice.objects.filter(event__organizer=organizer), slug, code)
order = _find_order_for_invoice_id(Invoice.objects.filter(event__organizer=organizer), (slug, original_slug), code)
if order and order.code not in {o.code for o in orders}:
orders.append(order)
@@ -366,22 +375,37 @@ def process_banktransfers(self, job: int, data: list) -> None:
transactions = _get_unknown_transactions(job, data, **job.owner_kwargs)
# Match order codes
regex_match_to_slug = {}
code_len_agg = Order.objects.filter(event__organizer=job.organizer).annotate(
clen=Length('code')
).aggregate(min=Min('clen'), max=Max('clen'))
if job.event:
prefixes = {job.event.slug.upper()}
prefixes = {job.event.slug.upper(), job.event.slug.upper().replace("-", "")}
if "-" in job.event.slug:
regex_match_to_slug[job.event.slug.upper().replace("-", "")] = job.event.slug
else:
prefixes = {e.slug.upper() for e in job.organizer.events.all()}
prefixes = set()
for e in job.organizer.events.all():
prefixes.add(e.slug.upper())
if "-" in e.slug:
prefixes.add(e.slug.upper().replace("-", ""))
regex_match_to_slug[e.slug.upper().replace("-", "")] = e.slug
# Match invoice numbers
inr_len_agg = Invoice.objects.filter(event__organizer=job.organizer).annotate(
clen=Length('invoice_no')
).aggregate(min=Min('clen'), max=Max('clen'))
if job.event:
prefixes |= {p.rstrip(' -') for p in Invoice.objects.filter(event=job.event).distinct().values_list('prefix', flat=True)}
invoice_prefixes = Invoice.objects.filter(event=job.event)
else:
prefixes |= {p.rstrip(' -') for p in Invoice.objects.filter(event__organizer=job.organizer).distinct().values_list('prefix', flat=True)}
invoice_prefixes = Invoice.objects.filter(event__organizer=job.organizer)
for p in invoice_prefixes.order_by().distinct().values_list('prefix', flat=True):
prefix = p.rstrip(" -")
prefixes.add(prefix)
if "-" in prefix:
prefix_nodash = prefix.replace("-", "")
prefixes.add(prefix_nodash)
regex_match_to_slug[prefix_nodash] = prefix
pattern = re.compile(
"(%s)[ \\-_]*([A-Z0-9]{%s,%s})" % (
@@ -395,6 +419,11 @@ def process_banktransfers(self, job: int, data: list) -> None:
)
for trans in transactions:
if trans.amount == Decimal("0.00"):
# Ignore all zero-valued transactions
trans.state = BankTransaction.STATE_DISCARDED
trans.save()
continue
# Whitespace in references is unreliable since linebreaks and spaces can occur almost anywhere, e.g.
# DEMOCON-123\n45 should be matched to DEMOCON-12345. However, sometimes whitespace is important,
# e.g. when there are two references. "DEMOCON-12345 DEMOCON-45678" would otherwise be parsed as
@@ -409,9 +438,9 @@ def process_banktransfers(self, job: int, data: list) -> None:
if matches:
if job.event:
_handle_transaction(trans, matches, event=job.event)
_handle_transaction(trans, matches, regex_match_to_slug, event=job.event)
else:
_handle_transaction(trans, matches, organizer=job.organizer)
_handle_transaction(trans, matches, regex_match_to_slug, organizer=job.organizer)
else:
trans.state = BankTransaction.STATE_NOMATCH
trans.save()

View File

@@ -66,7 +66,7 @@ from pretix.control.permissions import (
)
from pretix.control.views.organizer import OrganizerDetailViewMixin
from pretix.helpers.json import CustomJSONEncoder
from pretix.plugins.banktransfer import csvimport, mt940import
from pretix.plugins.banktransfer import camtimport, csvimport, mt940import
from pretix.plugins.banktransfer.models import (
BankImportJob, BankTransaction, RefundExport,
)
@@ -419,6 +419,9 @@ class ImportView(ListView):
):
return self.process_mt940()
elif 'file' in self.request.FILES and '.xml' in self.request.FILES.get('file').name.lower():
return self.process_camt()
elif self.request.FILES.get('file') is None:
messages.error(self.request, _('You must choose a file to import.'))
return self.redirect_back()
@@ -432,6 +435,14 @@ class ImportView(ListView):
def settings(self):
return SettingsSandbox('payment', 'banktransfer', getattr(self.request, 'event', self.request.organizer))
def process_camt(self):
try:
return self.start_processing(camtimport.parse(self.request.FILES.get('file')))
except:
logger.exception('Failed to import CAMT file')
messages.error(self.request, _('We were unable to process your input.'))
return self.redirect_back()
def process_mt940(self):
try:
return self.start_processing(mt940import.parse(self.request.FILES.get('file')))

View File

@@ -137,7 +137,7 @@ logger = logging.getLogger('pretix.plugins.stripe')
# Real-time payments
# - Swish: ✓
# - PayNow: ✗
# - PromptPay:
# - PromptPay:
# - Pix: ✗
#
# Vouchers
@@ -412,6 +412,18 @@ class StripeSettingsHolder(BasePaymentProvider):
'before they work properly.'),
required=False,
)),
('method_pay_by_bank',
forms.BooleanField(
label=_('Pay by bank'),
disabled=self.event.currency not in ['EUR', 'GBP'],
help_text=' '.join([
str(_('Some payment methods might need to be enabled in the settings of your Stripe account '
'before they work properly.')),
str(_('Currently only available for charges in GBP and customers with UK bank accounts, and '
'in private preview for France and Germany.'))
]),
required=False,
)),
('method_wechatpay',
forms.BooleanField(
label=_('WeChat Pay'),
@@ -428,6 +440,14 @@ class StripeSettingsHolder(BasePaymentProvider):
'before they work properly.'),
required=False,
)),
('method_promptpay',
forms.BooleanField(
label='PromptPay',
disabled=self.event.currency != 'THB',
help_text=_('Some payment methods might need to be enabled in the settings of your Stripe account '
'before they work properly.'),
required=False,
)),
('method_swish',
forms.BooleanField(
label=_('Swish'),
@@ -1810,6 +1830,32 @@ class StripeRevolutPay(StripeRedirectMethod):
}
class StripePayByBank(StripeRedirectMethod):
identifier = 'stripe_pay_by_bank'
verbose_name = _('Pay by bank via Stripe')
public_name = _('Pay by bank')
method = 'pay_by_bank'
redirect_in_widget_allowed = False
confirmation_method = 'automatic'
explanation = _(
'Pay by bank allows you to authorize a secure Open Banking payment from your banking app. Currently available '
'only with a UK bank account.'
)
def is_allowed(self, request: HttpRequest, total: Decimal=None) -> bool:
return super().is_allowed(request, total) and self.event.currency == 'GBP'
def _payment_intent_kwargs(self, request, payment):
return {
"payment_method_data": {
"type": "pay_by_bank",
"billing_details": {
"email": payment.order.email,
},
},
}
class StripePayPal(StripeRedirectMethod):
identifier = 'stripe_paypal'
verbose_name = _('PayPal via Stripe')
@@ -1842,6 +1888,30 @@ class StripeSwish(StripeRedirectMethod):
}
class StripePromptPay(StripeRedirectMethod):
identifier = 'stripe_promptpay'
verbose_name = _('PromptPay via Stripe')
public_name = 'PromptPay'
method = 'promptpay'
confirmation_method = 'automatic'
explanation = _(
'This payment method is available to PromptPay users in Thailand. Please have your app ready.'
)
def is_allowed(self, request: HttpRequest, total: Decimal=None) -> bool:
return super().is_allowed(request, total) and request.event.currency == "THB"
def _payment_intent_kwargs(self, request, payment):
return {
"payment_method_data": {
"type": "promptpay",
"billing_details": {
"email": payment.order.email,
},
},
}
class StripeTwint(StripeRedirectMethod):
identifier = 'stripe_twint'
verbose_name = _('TWINT via Stripe')

View File

@@ -38,7 +38,6 @@ from pretix.base.signals import (
)
from pretix.control.signals import nav_organizer
from pretix.plugins.stripe.forms import StripeKeyValidator
from pretix.plugins.stripe.payment import StripeMethod
from pretix.presale.signals import html_head, process_response
@@ -47,15 +46,17 @@ def register_payment_provider(sender, **kwargs):
from .payment import (
StripeAffirm, StripeAlipay, StripeBancontact, StripeCC, StripeEPS,
StripeGiropay, StripeIdeal, StripeKlarna, StripeMobilePay,
StripeMultibanco, StripePayPal, StripePrzelewy24, StripeRevolutPay,
StripeSEPADirectDebit, StripeSettingsHolder, StripeSofort, StripeSwish,
StripeTwint, StripeWeChatPay,
StripeMultibanco, StripePayByBank, StripePayPal, StripePromptPay,
StripePrzelewy24, StripeRevolutPay, StripeSEPADirectDebit,
StripeSettingsHolder, StripeSofort, StripeSwish, StripeTwint,
StripeWeChatPay,
)
return [
StripeSettingsHolder, StripeCC, StripeGiropay, StripeIdeal, StripeAlipay, StripeBancontact,
StripeSofort, StripeEPS, StripeMultibanco, StripePrzelewy24, StripeRevolutPay, StripeWeChatPay,
StripeSEPADirectDebit, StripeAffirm, StripeKlarna, StripePayPal, StripeSwish, StripeTwint, StripeMobilePay
StripeSofort, StripeEPS, StripeMultibanco, StripePayByBank, StripePrzelewy24, StripePromptPay, StripeRevolutPay,
StripeWeChatPay, StripeSEPADirectDebit, StripeAffirm, StripeKlarna, StripePayPal, StripeSwish,
StripeTwint, StripeMobilePay
]
@@ -189,6 +190,8 @@ def nav_o(sender, request, organizer, **kwargs):
@receiver(signal=process_response, dispatch_uid="stripe_middleware_resp")
def signal_process_response(sender, request: HttpRequest, response: HttpResponse, **kwargs):
from pretix.plugins.stripe.payment import StripeMethod
provider = StripeMethod(sender)
url = resolve(request.path_info)

View File

@@ -79,3 +79,9 @@
.vcenter {
margin: auto;
}
.stripe-qr-code {
max-width: 80%;
width: 200px;
height: auto;
}

View File

@@ -325,6 +325,8 @@ $(function () {
} else if ($("#stripe_payment_intent_next_action_redirect_url").length) {
let payment_intent_next_action_redirect_url = $.trim($("#stripe_payment_intent_next_action_redirect_url").html());
pretixstripe.handlePaymentRedirectAction(payment_intent_next_action_redirect_url);
} else if ($.trim($("#stripe_payment_intent_action_type").html()) === "promptpay_display_qr_code") {
waitingDialog.hide();
} else if ($.trim($("#stripe_payment_intent_action_type").html()) === "wechat_pay_display_qr_code") {
let payment_intent_client_secret = $.trim($("#stripe_payment_intent_client_secret").html());
pretixstripe.handleWechatAction(payment_intent_client_secret);

View File

@@ -22,7 +22,6 @@
import logging
from urllib.parse import urlsplit
import stripe
from django.conf import settings
from pretix.base.services.tasks import EventTask
@@ -50,7 +49,10 @@ def get_stripe_account_key(prov):
@app.task(base=EventTask, max_retries=5, default_retry_delay=1)
def stripe_verify_domain(event, domain):
import stripe
from pretix.plugins.stripe.payment import StripeCC
prov = StripeCC(event)
account = get_stripe_account_key(prov)

View File

@@ -27,9 +27,21 @@
<div class="stripe-errors sr-only panel-body">
</div>
<div class="panel-body embed-responsive embed-responsive-sca" id="scacontainer">
</div>
{% if payment_intent_promptpay_image_url %}
<div class="panel-body">
<p>{% blocktrans trimmed %}
Please scan the QR code below to complete your PromptPay payment.
Once you have completed your payment, you can refresh this page.
{% endblocktrans %}</p>
<div class="text-center">
<img src="{{ payment_intent_promptpay_image_url }}" alt="{% trans 'PromptPay QR code' %}"
class="stripe-qr-code" />
</div>
</div>
{% else %}
<div class="panel-body embed-responsive embed-responsive-sca" id="scacontainer">
</div>
{% endif %}
</div>
<div class="row checkout-button-row">
<div class="col-md-4">

View File

@@ -37,7 +37,6 @@ import logging
import urllib.parse
import requests
import stripe
from django.contrib import messages
from django.core import signing
from django.db import transaction
@@ -68,7 +67,6 @@ from pretix.helpers.http import redirect_to_url
from pretix.multidomain.urlreverse import build_absolute_uri, eventreverse
from pretix.plugins.stripe.forms import OrganizerStripeSettingsForm
from pretix.plugins.stripe.models import ReferencedStripeObject
from pretix.plugins.stripe.payment import StripeCC, StripeSettingsHolder
from pretix.plugins.stripe.tasks import (
get_domain_for_event, stripe_verify_domain,
)
@@ -100,6 +98,8 @@ def redirect_view(request, *args, **kwargs):
@scopes_disabled()
def oauth_return(request, *args, **kwargs):
import stripe
if 'payment_stripe_oauth_event' not in request.session:
messages.error(request, _('An error occurred during connecting with Stripe, please try again.'))
return redirect('control:index')
@@ -268,6 +268,10 @@ SOURCE_TYPES = {
def charge_webhook(event, event_json, charge_id, rso):
import stripe
from pretix.plugins.stripe.payment import StripeCC
prov = StripeCC(event)
prov._init_api()
@@ -371,6 +375,10 @@ def charge_webhook(event, event_json, charge_id, rso):
def source_webhook(event, event_json, source_id, rso):
import stripe
from pretix.plugins.stripe.payment import StripeCC
prov = StripeCC(event)
prov._init_api()
try:
@@ -440,6 +448,10 @@ def source_webhook(event, event_json, source_id, rso):
def paymentintent_webhook(event, event_json, paymentintent_id, rso):
import stripe
from pretix.plugins.stripe.payment import StripeCC
prov = StripeCC(event)
prov._init_api()
@@ -516,6 +528,8 @@ class StripeOrderView:
@method_decorator(xframe_options_exempt, 'dispatch')
class ReturnView(StripeOrderView, View):
def get(self, request, *args, **kwargs):
import stripe
prov = self.pprov
prov._init_api()
try:
@@ -568,6 +582,10 @@ class ReturnView(StripeOrderView, View):
class ScaView(StripeOrderView, View):
def get(self, request, *args, **kwargs):
import stripe
from pretix.plugins.stripe.payment import StripeSettingsHolder
prov = self.pprov
prov._init_api()
@@ -595,7 +613,7 @@ class ScaView(StripeOrderView, View):
if intent.status == 'requires_action' and intent.next_action.type in [
'use_stripe_sdk', 'redirect_to_url', 'alipay_handle_redirect', 'wechat_pay_display_qr_code',
'swish_handle_redirect_or_display_qr_code', 'multibanco_display_details',
'swish_handle_redirect_or_display_qr_code', 'multibanco_display_details', 'promptpay_display_qr_code',
]:
ctx = {
'order': self.order,
@@ -613,6 +631,8 @@ class ScaView(StripeOrderView, View):
elif intent.next_action.type == 'multibanco_display_details':
ctx['payment_intent_next_action_redirect_url'] = intent.next_action.multibanco_display_details['hosted_voucher_url']
ctx['payment_intent_redirect_action_handling'] = 'iframe'
elif intent.next_action.type == 'promptpay_display_qr_code':
ctx['payment_intent_promptpay_image_url'] = intent.next_action.promptpay_display_qr_code['image_url_svg']
r = render(request, 'pretixplugins/stripe/sca.html', ctx)
r._csp_ignore = True

View File

@@ -49,7 +49,7 @@ from django.views.decorators.cache import cache_page
from django.views.decorators.gzip import gzip_page
from django.views.decorators.http import condition
from django.views.i18n import (
JavaScriptCatalog, get_formats, builtin_template_path,
JavaScriptCatalog, get_formats, js_catalog_template,
)
from lxml import html
@@ -168,8 +168,7 @@ def generate_widget_js(version, lang):
'September', 'October', 'November', 'December'
)
catalog = dict((k, v) for k, v in catalog.items() if k.startswith('widget\u0004') or k in str_wl)
with builtin_template_path("i18n_catalog.js").open(encoding="utf-8") as fh:
template = Engine().from_string(fh.read())
template = Engine().from_string(js_catalog_template)
context = Context({
'catalog_str': indent(json.dumps(
catalog, sort_keys=True, indent=2)) if catalog else None,

View File

@@ -530,7 +530,6 @@ X_FRAME_OPTIONS = 'DENY'
# URL settings
ROOT_URLCONF = 'pretix.multidomain.maindomain_urlconf'
FORMS_URLFIELD_ASSUME_HTTPS = True # transitional for django 6.0
WSGI_APPLICATION = 'pretix.wsgi.application'

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 163 KiB

View File

@@ -42,8 +42,10 @@ from django.contrib.auth.tokens import (
)
from django.core import mail as djmail
from django.test import RequestFactory, TestCase, override_settings
from django.utils.crypto import get_random_string
from django.utils.timezone import now
from django_otp.oath import TOTP
from django_otp.plugins.otp_static.models import StaticDevice
from django_otp.plugins.otp_totp.models import TOTPDevice
from webauthn.authentication.verify_authentication_response import (
VerifiedAuthentication,
@@ -492,6 +494,20 @@ class Login2FAFormTest(TestCase):
m.undo()
def test_recovery_code_valid(self):
djmail.outbox = []
d, __ = StaticDevice.objects.get_or_create(user=self.user, name='emergency')
token = d.token_set.create(token=get_random_string(length=12, allowed_chars='1234567890'))
response = self.client.get('/control/login/2fa')
assert 'token' in response.content.decode()
response = self.client.post('/control/login/2fa', {
'token': token.token,
})
self.assertEqual(response.status_code, 302)
self.assertIn('/control/', response['Location'])
assert "recovery code" in djmail.outbox[0].body
class FakeRedis(object):
def get_redis_connection(self, connection_string):

View File

@@ -45,6 +45,8 @@ def env():
def test_event_main_domain_front_page(env):
assert eventreverse(env[1], 'presale:event.index') == '/mrmcd/2015/'
assert eventreverse(env[0], 'presale:organizer.index') == '/mrmcd/'
assert eventreverse(env[1], 'plugins:testdummy:view') == '/mrmcd/2015/testdummy'
assert eventreverse(env[0], 'plugins:testdummy:view') == '/mrmcd/testdummy'
@pytest.mark.django_db
@@ -52,12 +54,16 @@ def test_event_custom_domain_kwargs(env):
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
KnownDomain.objects.create(domainname='barfoo', organizer=env[0], event=env[1])
assert eventreverse(env[1], 'presale:event.checkout', {'step': 'payment'}) == 'http://barfoo/checkout/payment/'
assert eventreverse(env[0], 'plugins:testdummy:view') == 'http://foobar/testdummy'
assert eventreverse(env[1], 'plugins:testdummy:view') == 'http://barfoo/testdummy'
@pytest.mark.django_db
def test_event_org_domain_kwargs(env):
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
assert eventreverse(env[1], 'presale:event.checkout', {'step': 'payment'}) == 'http://foobar/2015/checkout/payment/'
assert eventreverse(env[0], 'plugins:testdummy:view') == 'http://foobar/testdummy'
assert eventreverse(env[1], 'plugins:testdummy:view') == 'http://foobar/2015/testdummy'
@pytest.mark.django_db
@@ -65,9 +71,13 @@ def test_event_org_alt_domain_kwargs(env):
KnownDomain.objects.create(domainname='foobar', organizer=env[0])
d = KnownDomain.objects.create(domainname='altfoo', organizer=env[0], mode=KnownDomain.MODE_ORG_ALT_DOMAIN)
assert eventreverse(env[1], 'presale:event.checkout', {'step': 'payment'}) == 'http://foobar/2015/checkout/payment/'
assert eventreverse(env[1], 'plugins:testdummy:view') == 'http://foobar/2015/testdummy'
d.event_assignments.create(event=env[1])
with scopes_disabled():
assert eventreverse(Event.objects.get(pk=env[1].pk), 'presale:event.checkout', {'step': 'payment'}) == 'http://altfoo/2015/checkout/payment/'
event = Event.objects.get(pk=env[1].pk)
assert eventreverse(event, 'presale:event.checkout', {'step': 'payment'}) == 'http://altfoo/2015/checkout/payment/'
assert eventreverse(env[0], 'plugins:testdummy:view') == 'http://foobar/testdummy'
assert eventreverse(event, 'plugins:testdummy:view') == 'http://altfoo/2015/testdummy'
@pytest.mark.django_db

View File

@@ -0,0 +1,756 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Beispielnachricht_camt.053_BankToCustomerStatement_via_EBICS-->
<!-- Source https://www.bundesbank.de/de/startseite/beispieldateien-zur-bereitstellung-der-elektronischen-kontoinformationen-zu-dotationskonten-von-banken-im-format-camt-052-und-camt-053-bei-kommunikation-via-ebics-example-files-for-the-provision-of-electronic-account-information-for-cash-handling-accounts-of-banks-in-camt-052-and-camt-053-format-when-communicating-via-ebics-943090 -->
<Document xmlns:n0="urn:iso:std:iso:20022:tech:xsd:camt.053.001.08">
<BkToCstmrStmt>
<GrpHdr>
<MsgId>20240313C0098170</MsgId>
<CreDtTm>2024-03-13T18:40:42.8734727+01:00</CreDtTm>
</GrpHdr>
<Stmt>
<Id>20240313C0098170</Id>
<StmtPgntn>
<PgNb>00001</PgNb>
<LastPgInd>true</LastPgInd>
</StmtPgntn>
<ElctrncSeqNb>1</ElctrncSeqNb>
<CreDtTm>2024-03-13T18:40:42.8734727+01:00</CreDtTm>
<Acct>
<Id>
<IBAN>DE00IBANdesDotationskontos</IBAN>
</Id>
<Tp>
<Cd>CACC</Cd>
</Tp>
<Ccy>EUR</Ccy>
<Nm>Testbank, Hamburg</Nm>
<Ownr>
<Nm>Testbank-Inhaber</Nm>
</Ownr>
<Svcr>
<FinInstnId>
<BICFI>MARKDEF1200</BICFI>
<ClrSysMmbId>
<ClrSysId>
<Cd>DEBLZ</Cd>
</ClrSysId>
<MmbId>20000000</MmbId>
</ClrSysMmbId>
<Nm>Deutsche Bundesbank</Nm>
<Othr>
<Id>DE114103555</Id>
<Issr>UmsStId</Issr>
</Othr>
</FinInstnId>
<BrnchId>
<Nm>Filiale Hamburg</Nm>
</BrnchId>
</Svcr>
</Acct>
<Bal>
<Tp>
<CdOrPrtry>
<Cd>OPBD</Cd>
</CdOrPrtry>
</Tp>
<Amt Ccy="EUR">0.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Dt>
<Dt>2024-03-13</Dt>
</Dt>
</Bal>
<Bal>
<Tp>
<CdOrPrtry>
<Cd>CLBD</Cd>
</CdOrPrtry>
</Tp>
<Amt Ccy="EUR">0.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Dt>
<Dt>2024-03-13</Dt>
</Dt>
</Bal>
<Ntry>
<NtryRef>2000000011240313</NtryRef>
<Amt Ccy="EUR">100000.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>103600002791/0019200002</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>CNTR</Cd>
<SubFmlyCd>CDPT</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCMI+082+0019200002</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>2000000011240313</AcctSvcrRef>
</Refs>
<Amt Ccy="EUR">100000.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>CNTR</Cd>
<SubFmlyCd>CDPT</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCMI+082+0019200002</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<Purp>
<Prtry>Einzahlung</Prtry>
</Purp>
<AddtlTxInf>Einzahlungen</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Einzahlungen</AddtlNtryInf>
</Ntry>
<Ntry>
<NtryRef>2000000012240313</NtryRef>
<Amt Ccy="EUR">25000.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>049000039704/0019000002</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>CNTR</Cd>
<SubFmlyCd>CWDL</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCMI+083+0019000002</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>2000000012240313</AcctSvcrRef>
<InstrId>9998770</InstrId>
<ChqNb>9998770</ChqNb>
</Refs>
<Amt Ccy="EUR">25000.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>CNTR</Cd>
<SubFmlyCd>CWDL</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCMI+083+0019000002</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<Purp>
<Prtry>Auszahlung</Prtry>
</Purp>
<AddtlTxInf>Auszahlungen</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Auszahlungen</AddtlNtryInf>
</Ntry>
<Ntry>
<Amt Ccy="EUR">20000.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>047200003598/0002000001</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICHQ</Cd>
<SubFmlyCd>CCHQ</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCHK+101+0002000001</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<InstrId>9998771</InstrId>
<ChqNb>9998771</ChqNb>
</Refs>
<Amt Ccy="EUR">250000.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICHQ</Cd>
<SubFmlyCd>CCHQ</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCHK+101+0002000001</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Cdtr>
<Pty>
<Nm>Deutsche Bundesbank KBS HMS Hamburg</Nm>
</Pty>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE98200000000020002633</IBAN>
</Id>
</CdtrAcct>
</RltdPties>
<RltdAgts>
<CdtrAgt>
<FinInstnId>
<ClrSysMmbId>
<ClrSysId>
<Cd>DEBLZ</Cd>
</ClrSysId>
<MmbId>20000000</MmbId>
</ClrSysMmbId>
</FinInstnId>
</CdtrAgt>
</RltdAgts>
<Purp>
<Prtry>LS bestätigter Scheck</Prtry>
</Purp>
<RmtInf>
<Ustrd>Bestätigter Scheck vom 13.03.2024</Ustrd>
<Ustrd>Scheck Nr. 135469</Ustrd>
</RmtInf>
<AddtlTxInf>Inhaberscheck</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Inhaberscheck</AddtlNtryInf>
</Ntry>
<Ntry>
<Amt Ccy="EUR">15.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>047200003598/0002000001</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>ACMT</Cd>
<Fmly>
<Cd>MDOP</Cd>
<SubFmlyCd>CHRG</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCHG+808+0002000001</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Amt Ccy="EUR">15.00</Amt>
<BkTxCd>
<Domn>
<Cd>ACMT</Cd>
<Fmly>
<Cd>MDOP</Cd>
<SubFmlyCd>CHRG</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NCHG+808+0002000001</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<Purp>
<Prtry>LS Entgelte Giro, SchE</Prtry>
</Purp>
<AddtlTxInf>Gebühren</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Gebühren</AddtlNtryInf>
</Ntry>
<Ntry>
<NtryRef>H202403135000000107</NtryRef>
<Amt Ccy="EUR">145015.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>051500000059/0019000003</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>RCDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+088+0019000003</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>H202403135000000107</AcctSvcrRef>
<InstrId>H202403135000000107</InstrId>
</Refs>
<Amt Ccy="EUR">145015.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>RCDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+088+0019000003</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<Purp>
<Prtry>Überw Prior1/SWI</Prtry>
</Purp>
<AddtlTxInf>Überweisungsgutschrift mit Festvaluta</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Überweisungsgutschrift mit Festvaluta</AddtlNtryInf>
</Ntry>
<Ntry>
<NtryRef>H202403135000000108</NtryRef>
<Amt Ccy="EUR">50000.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>105600004525/0019200003</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>RCDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+088+0019200003</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>H202403135000000108</AcctSvcrRef>
<InstrId>H202403135000000108</InstrId>
</Refs>
<Amt Ccy="EUR">50000.00</Amt>
<AmtDtls>
<InstdAmt>
<Amt Ccy="EUR">50000.00</Amt>
</InstdAmt>
</AmtDtls>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>RCDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+088+0019200003</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Dbtr>
<Pty>
<Nm>Testbank</Nm>
</Pty>
</Dbtr>
<DbtrAcct>
<Id>
<Othr>
<Id>0123456789</Id>
</Othr>
</Id>
</DbtrAcct>
</RltdPties>
<Purp>
<Prtry>Überw Prior1/SWI</Prtry>
</Purp>
<RmtInf>
<Ustrd>VWZ pacs008 RTGS nach DOTA</Ustrd>
</RmtInf>
<AddtlTxInf>Überweisungsgutschrift mit Festvaluta</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Überweisungsgutschrift mit Festvaluta</AddtlNtryInf>
</Ntry>
<Ntry>
<NtryRef>H202403135000000109</NtryRef>
<Amt Ccy="EUR">80000.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>051800000156/0019000004</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>RCDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+088+0019000004</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>H202403135000000109</AcctSvcrRef>
<InstrId>pacs009-EndToEndId-00004</InstrId>
</Refs>
<Amt Ccy="EUR">80000.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>RCDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+088+0019000004</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<Purp>
<Prtry>Überw Prior1/SWI</Prtry>
</Purp>
<RmtInf>
<Ustrd>VWZ pacs009 RTGS nach DOTA</Ustrd>
</RmtInf>
<AddtlTxInf>Überweisungsgutschrift mit Festvaluta</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Überweisungsgutschrift mit Festvaluta</AddtlNtryInf>
</Ntry>
<Ntry>
<NtryRef>pacs009-InstrId-00005</NtryRef>
<Amt Ccy="EUR">30000.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>055100000086/0019000005</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+087+0019000005</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>pacs009-InstrId-00005</AcctSvcrRef>
<InstrId>pacs009-InstrId-00005</InstrId>
</Refs>
<Amt Ccy="EUR">30000.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+087+0019000005</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<Purp>
<Prtry>Überw Prior1/SWI</Prtry>
</Purp>
<RmtInf>
<Ustrd>VWZ pacs009 DOTA nach MCA</Ustrd>
</RmtInf>
<AddtlTxInf>Eilüberweisung</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Eilüberweisung</AddtlNtryInf>
</Ntry>
<Ntry>
<NtryRef>pacs009-InstrId-00006</NtryRef>
<Amt Ccy="EUR">120000.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>001400001221/0019000006</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+087+0019000006</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>pacs009-InstrId-00006</AcctSvcrRef>
<InstrId>pacs009-InstrId-00006</InstrId>
</Refs>
<Amt Ccy="EUR">120000.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+087+0019000006</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<Purp>
<Prtry>Überw Prior1/SWI</Prtry>
</Purp>
<RmtInf>
<Ustrd>VWZ pacs009 DOTA nach RTGS</Ustrd>
</RmtInf>
<AddtlTxInf>Eilüberweisung</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Eilüberweisung</AddtlNtryInf>
</Ntry>
<Ntry>
<Amt Ccy="EUR">100000.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>016900004681/0002000002</AcctSvcrRef>
<BkTxCd>
<Prtry>
<Cd>NCHK+070+0002000002</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Amt Ccy="EUR">100000.00</Amt>
<BkTxCd>
<Prtry>
<Cd>NCHK+070+0002000002</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Dbtr>
<Pty>
<Nm>Deutsche Bundesbank / 22772 Hamburg</Nm>
</Pty>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>DE98200000000020002633</IBAN>
</Id>
</DbtrAcct>
</RltdPties>
<RltdAgts>
<DbtrAgt>
<FinInstnId>
<ClrSysMmbId>
<ClrSysId>
<Cd>DEBLZ</Cd>
</ClrSysId>
<MmbId>20000000</MmbId>
</ClrSysMmbId>
</FinInstnId>
</DbtrAgt>
</RltdAgts>
<Purp>
<Prtry>GS bestätigter Scheck</Prtry>
</Purp>
<RmtInf>
<Ustrd>Rückgabe Best. Scheck vom 28.02.2024</Ustrd>
<Ustrd>Scheck Nr. 135468</Ustrd>
</RmtInf>
</TxDtls>
</NtryDtls>
</Ntry>
<Ntry>
<NtryRef>pacs008-InstrId-00007</NtryRef>
<Amt Ccy="EUR">280000.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>
<Cd>BOOK</Cd>
</Sts>
<BookgDt>
<Dt>2024-03-13</Dt>
</BookgDt>
<ValDt>
<Dt>2024-03-13</Dt>
</ValDt>
<AcctSvcrRef>010300005153/0019000007</AcctSvcrRef>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+087+0019000007</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<NtryDtls>
<TxDtls>
<Refs>
<AcctSvcrRef>pacs008-InstrId-00007</AcctSvcrRef>
<InstrId>pacs008-InstrId-00007</InstrId>
</Refs>
<Amt Ccy="EUR">280000.00</Amt>
<BkTxCd>
<Domn>
<Cd>PMNT</Cd>
<Fmly>
<Cd>ICDT</Cd>
<SubFmlyCd>SDVA</SubFmlyCd>
</Fmly>
</Domn>
<Prtry>
<Cd>NTRF+087+0019000007</Cd>
<Issr>DK</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Cdtr>
<Pty>
<Nm>Testbank, Hamburg</Nm>
</Pty>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE00IBANbeiTestbank</IBAN>
</Id>
</CdtrAcct>
</RltdPties>
<Purp>
<Prtry>Überw Prior1/SWI</Prtry>
</Purp>
<RmtInf>
<Ustrd>VWZ pacs008 DOTA nach RTGS</Ustrd>
</RmtInf>
<AddtlTxInf>Eilüberweisung</AddtlTxInf>
</TxDtls>
</NtryDtls>
<AddtlNtryInf>Eilüberweisung</AddtlNtryInf>
</Ntry>
</Stmt>
</BkToCstmrStmt>
</Document>

View File

@@ -0,0 +1,312 @@
<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.053.001.02 camt.053.001.02.xsd">
<BkToCstmrStmt>
<GrpHdr>
<MsgId>053D2013-12-27T22:05:03.0N130000005</MsgId>
<CreDtTm>2013-12-27T22:04:52.0+01:00</CreDtTm>
<MsgPgntn>
<PgNb>1</PgNb>
<LastPgInd>true</LastPgInd>
</MsgPgntn>
</GrpHdr>
<Stmt>
<Id>0352C5320131227220503</Id>
<ElctrncSeqNb>130000005</ElctrncSeqNb>
<CreDtTm>2013-12-27T22:04:52.0+01:00</CreDtTm>
<Acct>
<Id>
<IBAN>DE14740618130000033626</IBAN>
</Id>
<Ccy>EUR</Ccy>
<Ownr>
<Nm>Testkonto Nummer 1</Nm>
</Ownr>
<Svcr>
<FinInstnId>
<BIC>GENODEF1PFK</BIC>
<Nm>VR-Bank Rottal-Inn eG</Nm>
<Othr>
<Id>DE 129267947</Id>
<Issr>UmsStId</Issr>
</Othr>
</FinInstnId>
</Svcr>
</Acct>
<Bal>
<Tp>
<CdOrPrtry>
<Cd>PRCD</Cd>
</CdOrPrtry>
</Tp>
<Amt Ccy="EUR">33.06</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Dt>
<Dt>2013-12-27</Dt>
</Dt>
</Bal>
<Bal>
<Tp>
<CdOrPrtry>
<Cd>CLBD</Cd>
</CdOrPrtry>
</Tp>
<Amt Ccy="EUR">23.06</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Dt>
<Dt>2013-12-27</Dt>
</Dt>
</Bal>
<Ntry>
<Amt Ccy="EUR">2.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>BOOK</Sts>
<BookgDt>
<Dt>2013-12-27</Dt>
</BookgDt>
<ValDt>
<Dt>2013-12-27</Dt>
</ValDt>
<AcctSvcrRef>2013122710583450000</AcctSvcrRef>
<BkTxCd/>
<NtryDtls>
<TxDtls>
<BkTxCd>
<Prtry>
<Cd>NTRF+020</Cd>
<Issr>ZKA</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Cdtr>
<Nm>Testkonto Nummer 2</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<Othr>
<Id> 740618130100033626</Id>
<SchmeNm>
<Cd>BBAN</Cd>
</SchmeNm>
</Othr>
</Id>
</CdtrAcct>
</RltdPties>
<RmtInf>
<Ustrd>TEST BERWEISUNG MITTELS BLZUND KONTONUMMER - DTA</Ustrd>
</RmtInf>
</TxDtls>
</NtryDtls>
</Ntry>
<Ntry>
<Amt Ccy="EUR">3.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>BOOK</Sts>
<BookgDt>
<Dt>2013-12-27</Dt>
</BookgDt>
<ValDt>
<Dt>2013-12-27</Dt>
</ValDt>
<AcctSvcrRef>2013122710583600000</AcctSvcrRef>
<BkTxCd/>
<NtryDtls>
<TxDtls>
<Refs>
<MsgId>CCTI/VRNWSW/b044f24cddb92a502b8a1b5</MsgId>
<EndToEndId>NOTPROVIDED</EndToEndId>
</Refs>
<BkTxCd>
<Prtry>
<Cd>NMSC+201</Cd>
<Issr>ZKA</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Dbtr>
<Nm>Testkonto Nummer 1</Nm>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>DE14740618130000033626</IBAN>
</Id>
</DbtrAcct>
<UltmtDbtr>
<Nm>keine Information vorhanden</Nm>
</UltmtDbtr>
<Cdtr>
<Nm>Testkonto Nummer 2</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE58740618130100033626</IBAN>
</Id>
</CdtrAcct>
<UltmtCdtr>
<Nm>keine Information vorhanden</Nm>
</UltmtCdtr>
</RltdPties>
<RltdAgts>
<CdtrAgt>
<FinInstnId>
<BIC>GENODEF1PFK</BIC>
</FinInstnId>
</CdtrAgt>
</RltdAgts>
<RmtInf>
<Ustrd>Test+berweisung mit BIC und IBAN SEPA IBAN: DE58740618130100033626 BIC: GENODEF1PFK</Ustrd>
</RmtInf>
</TxDtls>
</NtryDtls>
</Ntry>
<Ntry>
<Amt Ccy="EUR">1.00</Amt>
<CdtDbtInd>CRDT</CdtDbtInd>
<Sts>BOOK</Sts>
<BookgDt>
<Dt>2013-12-27</Dt>
</BookgDt>
<ValDt>
<Dt>2013-12-27</Dt>
</ValDt>
<AcctSvcrRef>2013122711085260000</AcctSvcrRef>
<BkTxCd/>
<NtryDtls>
<TxDtls>
<BkTxCd>
<Prtry>
<Cd>NMSC+051</Cd>
<Issr>ZKA</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Dbtr>
<Nm>Testkonto Nummer 2</Nm>
</Dbtr>
<DbtrAcct>
<Id>
<Othr>
<Id> 740618130100033626</Id>
<SchmeNm>
<Cd>BBAN</Cd>
</SchmeNm>
</Othr>
</Id>
</DbtrAcct>
</RltdPties>
<RmtInf>
<Ustrd>R CKBUCHUNG</Ustrd>
</RmtInf>
</TxDtls>
</NtryDtls>
</Ntry>
<Ntry>
<Amt Ccy="EUR">6.00</Amt>
<CdtDbtInd>DBIT</CdtDbtInd>
<Sts>BOOK</Sts>
<BookgDt>
<Dt>2013-12-27</Dt>
</BookgDt>
<ValDt>
<Dt>2013-12-27</Dt>
</ValDt>
<AcctSvcrRef>2013122711513230000</AcctSvcrRef>
<BkTxCd/>
<NtryDtls>
<Btch>
<PmtInfId>STZV-PmInf27122013-11:02-2</PmtInfId>
<NbOfTxs>2</NbOfTxs>
</Btch>
<TxDtls>
<Refs>
<MsgId>STZV-Msg27122013-11:02</MsgId>
<EndToEndId>STZV-EtE27122013-11:02-1</EndToEndId>
</Refs>
<AmtDtls>
<TxAmt>
<Amt Ccy="EUR">3.50</Amt>
</TxAmt>
</AmtDtls>
<BkTxCd>
<Prtry>
<Cd>NMSC+201</Cd>
<Issr>ZKA</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Dbtr>
<Nm>Testkonto Nummer 2</Nm>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>DE58740618130100033626</IBAN>
</Id>
</DbtrAcct>
<UltmtDbtr>
<Nm>keine Information vorhanden</Nm>
</UltmtDbtr>
<Cdtr>
<Nm>Testkonto Nummer 1</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE14740618130000033626</IBAN>
</Id>
</CdtrAcct>
<UltmtCdtr>
<Nm>Testkonto</Nm>
</UltmtCdtr>
</RltdPties>
<RmtInf>
<Ustrd>Sammelueberwseisung 2. Zahlung TAN:283044 </Ustrd>
</RmtInf>
</TxDtls>
<TxDtls>
<Refs>
<MsgId>STZV-Msg27122013-11:02</MsgId>
<EndToEndId>STZV-EtE27122013-11:02-2</EndToEndId>
</Refs>
<AmtDtls>
<TxAmt>
<Amt Ccy="EUR">2.50</Amt>
</TxAmt>
</AmtDtls>
<BkTxCd>
<Prtry>
<Cd>NMSC+201</Cd>
<Issr>ZKA</Issr>
</Prtry>
</BkTxCd>
<RltdPties>
<Dbtr>
<Nm>Testkonto Nummer 2</Nm>
</Dbtr>
<DbtrAcct>
<Id>
<IBAN>DE58740618130100033626</IBAN>
</Id>
</DbtrAcct>
<UltmtDbtr>
<Nm>keine Information vorhanden</Nm>
</UltmtDbtr>
<Cdtr>
<Nm>Testkonto Nummer 1</Nm>
</Cdtr>
<CdtrAcct>
<Id>
<IBAN>DE14740618130000033626</IBAN>
</Id>
</CdtrAcct>
<UltmtCdtr>
<Nm>Testkonto</Nm>
</UltmtCdtr>
</RltdPties>
<RmtInf>
<Ustrd>Sammelueberweisung 1. Zahlung TAN:283044 </Ustrd>
</RmtInf>
</TxDtls>
</NtryDtls>
</Ntry>
</Stmt>
</BkToCstmrStmt>
</Document>

View File

@@ -0,0 +1,146 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-today pretix GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/license>.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
import os.path
from django.test import TestCase
from pretix.plugins.banktransfer import camtimport
DATA_DIR = os.path.dirname(__file__)
class CamtImportTest(TestCase):
def _test_from_sample_file(self, filename, expected_parsed):
with open(os.path.join(DATA_DIR, filename), "rb") as f:
parsed = camtimport.parse(f)
print(parsed)
self.assertEqual(parsed, expected_parsed)
def test_sample_file_sepatools(self):
expected_parsed = [
{
"amount": "-2.00",
"date": "2013-12-27",
"reference": "TEST BERWEISUNG MITTELS BLZUND KONTONUMMER - DTA",
"external_id": "2013122710583450000",
"payer": "Testkonto Nummer 2",
},
{
"amount": "-3.00",
"date": "2013-12-27",
"reference": "Test+berweisung mit BIC und IBAN SEPA IBAN: DE58740618130100033626 BIC: GENODEF1PFK",
"external_id": "2013122710583600000",
"iban": "DE58740618130100033626",
"payer": "Testkonto Nummer 2",
},
{
"amount": "1.00",
"date": "2013-12-27",
"reference": "R CKBUCHUNG",
"external_id": "2013122711085260000",
"payer": "Testkonto Nummer 2",
},
{
"amount": "-6.00",
"date": "2013-12-27",
"reference": "STZV-PmInf27122013-11:02-2",
"external_id": "2013122711513230000",
},
]
filename = "camt.053_sepatools.xml"
self._test_from_sample_file(filename, expected_parsed)
def test_sample_file_bundesbank(self):
expected_parsed = [
{
"amount": "100000.00",
"date": "2024-03-13",
"reference": "",
"external_id": "103600002791/0019200002",
},
{
"amount": "-25000.00",
"date": "2024-03-13",
"reference": "",
"external_id": "049000039704/0019000002",
},
{
"amount": "-20000.00",
"date": "2024-03-13",
"reference": "",
"external_id": "047200003598/0002000001",
"iban": "DE98200000000020002633",
},
{
"amount": "-15.00",
"date": "2024-03-13",
"reference": "",
"external_id": "047200003598/0002000001",
},
{
"amount": "145015.00",
"date": "2024-03-13",
"reference": "",
"external_id": "051500000059/0019000003",
},
{
"amount": "50000.00",
"date": "2024-03-13",
"reference": "VWZ pacs008 RTGS nach DOTA",
"external_id": "105600004525/0019200003",
},
{
"amount": "80000.00",
"date": "2024-03-13",
"reference": "VWZ pacs009 RTGS nach DOTA",
"external_id": "051800000156/0019000004",
},
{
"amount": "-30000.00",
"date": "2024-03-13",
"reference": "VWZ pacs009 DOTA nach MCA",
"external_id": "055100000086/0019000005",
},
{
"amount": "-120000.00",
"date": "2024-03-13",
"reference": "VWZ pacs009 DOTA nach RTGS",
"external_id": "001400001221/0019000006",
},
{
"amount": "100000.00",
"date": "2024-03-13",
"reference": "",
"external_id": "016900004681/0002000002",
"iban": "DE98200000000020002633",
},
{
"amount": "-280000.00",
"date": "2024-03-13",
"reference": "VWZ pacs008 DOTA nach RTGS",
"external_id": "010300005153/0019000007",
"iban": "DE00IBANbeiTestbank",
},
]
filename = "camt.053_bundesbank.xml"
self._test_from_sample_file(filename, expected_parsed)

View File

@@ -385,6 +385,20 @@ def test_mark_paid_organizer_dash_in_slug(env, orga_job):
assert env[2].status == Order.STATUS_PAID
@pytest.mark.django_db
def test_mark_paid_organizer_dash_in_slug_missing(env, orga_job):
env[0].slug = "foo-bar"
env[0].save()
process_banktransfers(orga_job, [{
'payer': 'Karla Kundin',
'reference': 'Bestellung FOOBAR1234S',
'date': '2016-01-26',
'amount': '23.00'
}])
env[2].refresh_from_db()
assert env[2].status == Order.STATUS_PAID
@pytest.mark.django_db
def test_mark_paid_organizer_varying_order_code_length(env, orga_job):
env[2].code = "123412341234"
@@ -490,7 +504,7 @@ def test_valid_plus_invalid_match(env, orga_job):
'payer': 'Karla Kundin',
'reference': 'Bestellungen DUMMY-1Z3AS DUMMY-99999',
'date': '2016-01-26',
'amount': '.00'
'amount': '2.00'
}])
with scopes_disabled():
job = BankImportJob.objects.last()

View File

@@ -0,0 +1,52 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-today pretix GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/license>.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
from django.http import HttpResponse
from django.urls import path
def view(request):
return HttpResponse("")
urlpatterns = [
path(
"testdummy",
view,
name="view",
),
]
organizer_patterns = [
path(
"testdummy",
view,
name="view",
),
]
event_patterns = [
path(
"testdummy",
view,
name="view",
),
]